[活动] 【APM32F107VCT6 MINI开发板测评】GPIO口与OLED屏显示驱动

[复制链接]
 楼主| jinglixixi 发表于 2023-2-14 23:34 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-2-14 23:37 编辑

为了掌握开发板的使用,GPIO口是最好的入口。为此,外挂了一个LED模块来进行测试,其效果如图1所示。
1.jpg
1 测试效果


测试LED模块所使用的引脚为PA5PA6,其引脚配置的函数为:
  1. void APM_MINI_OLEDInit(void)
  2. {
  3.     GPIO_Config_T  configStruct;
  4.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  5.     configStruct.pin = GPIO_PIN_5|GPIO_PIN_6;
  6.     configStruct.mode = GPIO_MODE_OUT_PP;
  7.     configStruct.speed = GPIO_SPEED_50MHz;
  8.     GPIO_Config(GPIOA, &configStruct);
  9. }

实现引脚异或处理的函数为:
  1. void APM_MINI_OLEDToggle(void)
  2. {
  3.           GPIOA->ODATA ^= GPIO_PIN_5;
  4.           GPIOA->ODATA ^= GPIO_PIN_6;
  5. }

实现测试的主程序为:
  1. int main(void)
  2. {
  3.     APM_MINI_OLEDInit();
  4.     while (1)
  5.     {
  6.         Delay();
  7.         APM_MINI_OLEDToggle();
  8.     }
  9. }

经测试程序正确,实现了LED灯闪烁的效果。

在完成LED模块测试的基础上,就可以进行OLED屏的测试了,该显示屏是一款0.96寸的双色屏,其显示分辨率为128*64像素点。
该显示屏采用I2C接口,其引脚与开发板的连接关系为:
SCL---PA5
SDA---PA6
其实现高低电平输出的语句定义为:
#define SCL_high  GPIOA->BSC = GPIO_PIN_5
#define SCL_low   GPIOA->BC = GPIO_PIN_5
#define SDA_high  GPIOA->BSC = GPIO_PIN_6
#define SDA_low   GPIOA->BC = GPIO_PIN_6

OLED屏进行初始化的函数为:
  1. void OLED_Init(void)
  2. {
  3.     OLED_WR_Byte(0xAE,OLED_CMD);
  4.     OLED_WR_Byte(0x02,OLED_CMD);
  5.     OLED_WR_Byte(0x10,OLED_CMD);
  6.     OLED_WR_Byte(0x40,OLED_CMD);
  7.     OLED_WR_Byte(0x81,OLED_CMD);
  8.     OLED_WR_Byte(0xff,OLED_CMD);
  9.     OLED_WR_Byte(0xA1,OLED_CMD);
  10.     OLED_WR_Byte(0xC8,OLED_CMD);
  11.     OLED_WR_Byte(0xA6,OLED_CMD);
  12.     OLED_WR_Byte(0xA8,OLED_CMD);
  13.     OLED_WR_Byte(0x3f,OLED_CMD);
  14.     OLED_WR_Byte(0xD3,OLED_CMD);
  15.     OLED_WR_Byte(0x00,OLED_CMD);
  16.     OLED_WR_Byte(0xd5,OLED_CMD);
  17.     OLED_WR_Byte(0x80,OLED_CMD);
  18.     OLED_WR_Byte(0xD9,OLED_CMD);
  19.     OLED_WR_Byte(0xF1,OLED_CMD);
  20.     OLED_WR_Byte(0xDA,OLED_CMD);
  21.     OLED_WR_Byte(0x12,OLED_CMD);
  22.     OLED_WR_Byte(0xDB,OLED_CMD);
  23.     OLED_WR_Byte(0x40,OLED_CMD);
  24.     OLED_WR_Byte(0x20,OLED_CMD);
  25.     OLED_WR_Byte(0x02,OLED_CMD);
  26.     OLED_WR_Byte(0x8D,OLED_CMD);
  27.     OLED_WR_Byte(0x14,OLED_CMD);
  28.     OLED_WR_Byte(0xA4,OLED_CMD);
  29.     OLED_WR_Byte(0xA6,OLED_CMD);
  30.     OLED_WR_Byte(0xAF,OLED_CMD);
  31.     OLED_WR_Byte(0xAF,OLED_CMD);
  32.     OLED_Clear();
  33.     OLED_Set_Pos(0,0);
  34. }

GPIO口模拟I2C输出的函数为:
  1. void Write_IIC_Byte(unsigned char IIC_Byte)
  2. {
  3.     unsigned char i;
  4.     unsigned char m,da;
  5.     da=IIC_Byte;
  6.     SCL_low;
  7.     for(i=0;i<8;i++)
  8.     {
  9.         m=da;
  10.         m=m&0x80;
  11.         if(m==0x80)
  12.         {
  13.             SDA_high;
  14.         }
  15.         else  SDA_low;
  16.         da=da<<1;
  17.         Delay_us(100);
  18.         SCL_high;
  19.         Delay_us(100);
  20.         SCL_low;
  21.         Delay_us(100);
  22.      }
  23. }

为进行OLED屏的驱动测试,特将清屏函数改造为直线的绘制函数,其内容如下:
  1. void OLED_line(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(0xf0,OLED_DATA);
  10.     }
  11. }

经编译和下载,其测试效果如图2所示。
2.jpg
2 显示直线


在以上测试的基础上,通过添加字符串和汉字显示函数就可实现图3的显示效果。
3.jpg
3 显示汉字与字符串


所配置的字符串显示函数为:3 汉字与字符串显示效果

所配置的字符串显示函数为:
  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. void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
  2. {
  3.     uint8_t t,adder=0;
  4.     OLED_Set_Pos(x,y);
  5.     for(t=0;t<16;t++)
  6.     {
  7.          OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  8.          adder+=1;
  9.     }
  10.     OLED_Set_Pos(x,y+1);
  11.     for(t=0;t<16;t++)
  12.     {
  13.          OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  14.          adder+=1;
  15.     }
  16. }

实现显示效果的主程序为:
  1. int main(void)
  2. {
  3.     APM_MINI_LEDInit(LED2);
  4.     APM_MINI_LEDInit(LED3);
  5.     APM_MINI_OLEDInit();
  6.     OLED_Init();
  7.     OLED_Clear();
  8.     OLED_ShowString(20,0,"APM32F107",16);
  9.     OLED_ShowCHinese(20,2,3);
  10.     OLED_ShowCHinese(36,2,4);
  11.     OLED_ShowCHinese(52,2,5);
  12.     OLED_ShowString(20,4,"jinglixixi",16);
  13.     while (1)
  14.     {
  15.         Delay();
  16.         APM_MINI_LEDToggle(LED2);
  17.         APM_MINI_LEDToggle(LED3);
  18.     }
  19. }

这样在有显示的任务,就可以交由OLED屏来完成啦!

Alica 发表于 2023-2-24 01:02 | 显示全部楼层
forgot 发表于 2023-6-28 17:06 | 显示全部楼层
感谢楼主的分享,很全面,学习一下,期待更多好的内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部