本帖最后由 jinglixixi_457498010 于 2024-10-21 13:28 编辑

尽管ME32F103开发板提供了4位数码管的显示方式,但相对来讲其显示的信息量还相对有限,为此又给它添加了一种OLED屏的显示方式。

该显示屏是一款准双色的显示屏,共有2种颜色,即黄色和蓝色。该显示屏是以I2C接口的方式来工作,因此很节省引脚资源。

为驱动该显示屏工作,是使用图1所示的接口来连接显示屏。


image.png
图1 所用接口

其中:

PC6连接SCL

PC7连接SDA


将这2个引脚设置为输出口且置为高电平输出的函数为:

  1. Void OLED_set(void)
  2. {
  3.           PC6_INIT(PC6_GPIO);
  4.           PC7_INIT(PC7_GPIO);
  5.           PC_INIT_AS_OUTPUT(IO_PIN6);
  6.           PC_INIT_AS_OUTPUT(IO_PIN7);
  7.           OLED_SCLK_Set();
  8.           OLED_SDIN_Set();
  9. }

为程序中输出高低电平的相应,特进行如下定义:

#define OLED_SCLK_Clr()  GPIO_ResetPins(PC, IO_BIT_PIN6)

#define OLED_SCLK_Set()  GPIO_SetPins(PC, IO_BIT_PIN6)


#define OLED_SDIN_Clr()  GPIO_ResetPins(PC, IO_BIT_PIN7)

#define OLED_SDIN_Set()  GPIO_SetPins(PC, IO_BIT_PIN7)


该OLED屏的初始化函数为:
  1. void OLED_Init(void)
  2. {
  3.     Write_IIC_Command(0xAE);
  4.     Write_IIC_Command(0x20);
  5.     Write_IIC_Command(0x10);
  6.     Write_IIC_Command(0xb0);
  7.     Write_IIC_Command(0xc8);
  8.     Write_IIC_Command(0x00);
  9.     Write_IIC_Command(0x10);
  10.     Write_IIC_Command(0x40);
  11.     Write_IIC_Command(0x81);
  12.     Write_IIC_Command(0xdf);
  13.     Write_IIC_Command(0xa1);
  14.     Write_IIC_Command(0xa6);
  15.     Write_IIC_Command(0xa8);
  16.     Write_IIC_Command(0x3F);
  17.     Write_IIC_Command(0xa4);
  18.     Write_IIC_Command(0xd3);
  19.     Write_IIC_Command(0x00);
  20.     Write_IIC_Command(0xd5);
  21.     Write_IIC_Command(0xf0);
  22.     Write_IIC_Command(0xd9);
  23.     Write_IIC_Command(0x22);
  24.     Write_IIC_Command(0xda);
  25.     Write_IIC_Command(0x12);
  26.     Write_IIC_Command(0xdb);
  27.     Write_IIC_Command(0x20);
  28.     Write_IIC_Command(0x8d);
  29.     Write_IIC_Command(0x14);
  30.     Write_IIC_Command(0xaf);
  31. }

该显示屏的清屏函数为:
  1. void OLED_Clear(void)  
  2. {  
  3.         uint8_t i,n;                    
  4.         for(i=0;i<8;i++)  
  5.         {  
  6.                 OLED_WR_Byte (0xb0+i,OLED_CMD);   
  7.                 OLED_WR_Byte (0x00,OLED_CMD);      
  8.                 OLED_WR_Byte (0x10,OLED_CMD);      
  9.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  10.         }
  11. }

该显示屏的字符串显示函数为:
  1. void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
  2. {
  3.         unsigned char j=0;
  4.         while (chr[j]!='\0')
  5.         {               OLED_ShowChar(x,y,chr[j],Char_Size);
  6.                         x+=8;
  7.                         if(x>120){x=0;y+=2;}
  8.                         j++;
  9.         }
  10. }

该显示屏显示字符串的主程序为:
  1. int main(void)
  2. {
  3.         SYS_ExtOSC_EN();
  4.         SYS_PLL_Config(EXTERNAL_CLK,72000000);
  5.         SYS_SelectMainClkSrc(PLL_CLK);
  6.         SYS_SetAHBClkDivider (1);
  7.         SYS_SetAPBClkDivider (1);        
  8.         OLED_set();
  9.         OLED_Init();
  10.         OLED_Clear();
  11.         OLED_ShowString(0,0,"ME32F103",16);
  12.         OLED_ShowString(0,2,"OLED TEST",16);
  13.         while(1);
  14. }

经程序的编译与下载,其显示结果如图2所示,说明显示功能正常。
image.png
图2 显示效果

后续在添加数值显示功能的情况下,可与A/D数据采集功能相结合来实现温度检测功能。