ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于STM32F103+4PIN-OLED显示

2021-12-20 22:00:05  阅读:237  来源: 互联网

标签:STM32F103 u8 Pin 4PIN unsigned OLED 参数 GPIO


前言

使用工具

最终效果与连线

代码

KEIL文件总览

关键代码

oled.h中对IIC引脚定义

显示字符串

显示数字

显示字符串

显示汉字

显示BMP图片

取模软件使用

软件设置

动态图实现


前言

使用工具

  1. 正点原子STM32F103RCTb MINI开发板
  2. 4PIN-OLED
  3. KEIL5
  4. FlyMcu
  5. PCtoLCD2002(取模软件)

最终效果与连线

VCC————3.3V

GND————GND

SCL————PC11

SDA————PC12

说明:本文不讲解OLED与IIC的基本原理,只考虑使用与实现功能。

代码

KEIL文件总览

         上述文件中,main.c包含主函数,oled.c包含IIC底层代码与OLED显示

        当然还有.h文件,其中bmp.h包含BMP图片的取模16进制编码,oled.h包含对IIC引脚定义和OLED屏幕相关定义,oledfont.h包含ASCALL码与自己定义的中文字符

        其他均为官方提供文件,无另外编写。

关键代码

oled.h中对IIC引脚定义

        如果要修改使用的引脚,将GPIOC、GPIO_Pin_11和GPIO_Pin_12改为对应即可,其他都无需做任意改动。

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_11)//CLK
#define OLED_SCLK_Set() GPIO_SetBits(GPIOC,GPIO_Pin_11)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_12)//DIN
#define OLED_SDIN_Set() GPIO_SetBits(GPIOC,GPIO_Pin_12)
 		     
#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据

/*在oled.c中初始化SSD1306还有相关程序
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOC, &GPIO_InitStructure);	  
 	GPIO_SetBits(GPIOC,GPIO_Pin_11|GPIO_Pin_12);	
*/

显示字符串

//第一个参数为x坐标(0-128);第二个参数为y坐标(0-8);
//第三个为ASCALL码,当chr = 65时,为'A';第四个参数为文字大小,仅为12/16。
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	
	unsigned char c=0,i=0;	
		c=chr-' ';//得到偏移后的值			
		if(x>Max_Column-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
				
			}
}

显示数字

//第一个参数为x坐标(0-128);第二个参数为y坐标(0-8);
//第三个num为数字;第四个参数为数字长度;第五个参数为数字大小,仅为12/16。
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
} 

显示字符串

//第一个参数为x坐标(0-128);第二个参数为y坐标(0-8);
//第三个为字符串;第四个参数为字符大小,仅为12/16。
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}

显示汉字

//第一个参数为x坐标(0-128);第二个参数为y坐标(0-8);
//第三个为要输入的汉字,在oledfont.h中定义。
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}

显示BMP图片

//第一个参数为起始x0坐标(0-128);第二个参数为起始y0坐标(0-8);
//第三个参数为结束x1坐标(0-128);第四个参数为结束y1坐标(0-8);
//第五个为要输入的图片。
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
	    }
	}
} 

取模软件使用

软件设置

        1、选择阴码和阳码,看自己需要的效果。

        2、如果使用列行式,则OLED_DrawBMP函数的x1-x0为图像大小的第一个参数。使用行列式,则OLED_DrawBMP的x1-x0为图像大小的第二个参数。

        3、取模走向采用逆向

        4、自定义格式选择C51格式。

        采用阴码、列行式、逆向、C51效果图如下:

 代码烧录效果图:

动态图实现

        与上述展示BMP图步骤一样,区别在于它要一张一张取出来进行展示,很是麻烦。

        有时候GIF图直接取成BMP图后,色调会变得很淡,如右图(它是有东西的)。可以先用Python程序将GIF图转为PNG图片,如果图片不是黑底,需再将PNG图片用WINDOW自带的画图进行取反颜色变为黑底,,然后再转为BMP图,如左图效果。取成左图这样的效果后在进行取模,放入数组中用for循环即可实现效果,这里无须delay。

应有的效果图:

 

 

 

标签:STM32F103,u8,Pin,4PIN,unsigned,OLED,参数,GPIO
来源: https://blog.csdn.net/weixin_47795024/article/details/122049670

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有