【沁恒微CH32V307评估板试用体验】OLED屏的显示驱动 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

[文章]

【沁恒微CH32V307评估板试用体验】OLED屏的显示驱动

本帖最后由 jinglixixi 于 2022-5-19 16:47 编辑

CH32V307开发板为便于扩展,向用户提供了Arduino接口,通过它可减少许多连线的操作。
这里是将一个I2C接口的OLED插入该接口,并通过相应的程序设计来驱动其显示,其显示效果如图1所示。
1.jpg
图1测试效果
为便于直接驱动显示屏,这里没有使用相应的SDA和SCL引脚,而是以模拟的方式,由PB13和PB14来代替SDA和SCL的引脚作用。
使用PB13和PB14输出高低电平的语句定义为:
#define OLED_SCLK_Set() GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET)
#define  OLED_SCLK_Clr()  GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET)
#define OLED_SDIN_Set() GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET)
#define  OLED_SDIN_Clr()  GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET)
对引脚的功能配置函数为:
  1. void oled_pin_INIT(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  5.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
  6.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  9. }

实现显示效果的主程序为:
  1. int main(void)
  2. {
  3.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  4.     Delay_Init();
  5.     oled_pin_INIT();
  6.     OLED_Init();
  7.     OLED_Clear();
  8.     OLED_ShowCHinese(20,0,0);
  9.     OLED_ShowCHinese(40,0,1);
  10.     OLED_ShowString(60,0,"V307",16);   
  11.     OLED_ShowString(20,2,"OLED test",16);
  12.     while(1);
  13. }

其中,实现字符串显示的函数为:
  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)
  8.             {
  9.                 x=0;
  10.                 y+=2;
  11.             }
  12.             j++;
  13.     }
  14. }

为了实现汉字的显示,是通过软件来提取字模,见图2所示。
2.jpg
图2提取字模
配合该字模结构的显示函数为:
  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. }

这样我们就为CH32V307开发板提供了一个既节省引脚资源,又显示表现力强的显示方式。

回帖(2)

dianzi

2022-5-19 10:02:22
段代码有问题,麻烦重新编辑一下

HonestQiao

2022-5-19 13:44:54
可以直接提供一下代码包,多谢啦

更多回帖

×
发帖