查看: 1584|回复: 1

【瑞萨RA2系列开发板体验】OLED屏的显示驱动

[复制链接]

93

主题

136

帖子

8万

积分

管理员

11111

Rank: 9Rank: 9Rank: 9

积分
84460
QQ
发表于 2022-5-30 10:37:36 | 显示全部楼层 |阅读模式

【瑞萨RA2系列开发板体验】OLED屏的显示驱动

作者:李唐

RA2L1开发板是一款面向低功耗的开发板,若要为其配置显示功能,用一个数码管显然是不合适的。为此,将目光投到了oled屏的身上,相较于数码管其显示的信息更丰富,此外它还不同于液晶显示屏的放射光显示模式,它是通过靠自发光来显示的,因此在黑暗的环境下也可进行显示。
此外还不仅如此,在使用I2C接口器件的情况下,还能有效地减少GPIO口的占用,可谓优点多多。
鉴于开发板上配有I2C接口,便打算用它来驱动一个0.91寸的OLED屏,无奈的是一直没有效果,于是进行深入的测试,结果发现其它的引脚多不存在问题,使用板上的I2C接口却无效。


图1 I2C接口


图2 点亮外观的LED模块
有了前面的基础,决定改用其它引脚来驱动OLED屏。
OLED屏与开发板的连接关系为:
SCL----P400
SDA----P401
为使用GPIO口来模拟I2C通讯,对这2个引脚输出高低电平的语句定义为:
#define OLED_SCLK_Clr()   R_PORT4->PODR &= ~(1 << 0);
#define OLED_SCLK_Set()   R_PORT4->PODR |= (1 << 0);

#define OLED_SDIN_Clr()   R_PORT4->PODR &= ~(1 << 1);
#define OLED_SDIN_Set()   R_PORT4->PODR |= (1 << 1);


图3 扩展接口
此外,为保证信号的有效工作,特配置了一个极短的延时函数,其内容如下:

  1. void  us_delay(int n)
  2. {
  3. while(n--);
  4. }
复制代码
相应的I2C启停函数为:
  1. void IIC_Start()
  2. {
  3. OLED_SCLK_Set();
  4. us_delay(2);
  5. OLED_SDIN_Set();
  6. us_delay(2);
  7. OLED_SDIN_Clr();
  8. us_delay(2);
  9. OLED_SCLK_Clr();
  10. us_delay(2);
  11. }

  12. void IIC_Stop()
  13. {
  14. OLED_SCLK_Set();
  15. us_delay(2);
  16. OLED_SDIN_Clr();
  17. us_delay(2);
  18. OLED_SDIN_Set();
  19. us_delay(2);
  20. }
复制代码
为了进行字符及字符串的显示,所配的相关函数为:
  1. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
  2. {
  3. unsigned char c=0,i=0;
  4. c=chr-' ';
  5. IF(x>Max_Column-1){x=0;y=y+2;}
  6. if(Char_Size ==16)
  7. {
  8. OLED_Set_Pos(x,y);
  9. for(i=0;i<8;i++)
  10. OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11. OLED_Set_Pos(x,y+1);
  12. for(i=0;i<8;i++)
  13. OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14. }
  15. }
  16. void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
  17. {
  18. unsigned char j=0;
  19. while (chr[j]!='\0')
  20. {
复制代码



图4 显示效果
实现图4显示效果的主程序为:

  1. int main(void)
  2. {
  3. R_PORT1->PDR |= (1 << 3);
  4. R_PORT1->PDR |= (1 << 4);
  5. R_PORT0->PDR &= ~ (1 << 15);
  6. R_PORT4->PDR |= (1 << 0);
  7. R_PORT4->PDR |= (1 << 1);
  8. OLED_Init();
  9. OLED_Clear();
  10. OLED_ShowString(20,0,"RA2L1",16);
  11. OLED_ShowString(20,2,"OLED test",16);
  12. while(1)
  13. {
  14. R_PORT1->PODR |= (1 << 3);
  15. R_PORT1->PODR |= (1 << 4);
  16. delay();
  17. R_PORT1->PODR &= ~(1 << 3);
  18. R_PORT1->PODR &= ~(1 << 4);
  19. delay();
  20. }
  21. }
复制代码
经程序编译,其结果如图5所示,说明程序没有语法性错误,并生成了相应HEX目标文件。

图5 编译结果
在使用工具软件Renesas FlashProgrammer下载后,即可得到预期的显示效果。
有了OLED屏作显示工具,再有信息及数据显示的问题就交由它来解决了!
通过以GPIO口对OLED屏的驱动,对GPIO的使用对其又有了进一步的认识,后面是解决GPIO口的输入与状态判别问题,从而能以按键来控制LED,进而能驱动相应的数字式传感器来进行检测。


回复

使用道具 举报

3

主题

195

帖子

1168

积分

金牌会员

Rank: 6Rank: 6

积分
1168
发表于 2023-3-14 11:42:25 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 93帖子:136精华:9

lugl

主题: 52帖子:150精华:1

xujiwei263

主题: 18帖子:86精华:0

Juggernaut

主题: 12帖子:118精华:0

books咦

主题: 11帖子:11精华:2
快速回复 返回顶部 返回列表