[开发板与模块] 【HT32F52352 Starter Kit测评】+驱动OLED屏

[复制链接]
 楼主| jinglixixi 发表于 2022-4-28 21:47 | 显示全部楼层 |阅读模式
本帖最后由 werasd 于 2022-5-25 15:10 编辑

I2C接口的OLED屏是最节省I/O口的显示屏,它只需2个GPIO口即可驱动其显示,这里选用的是0.96寸的双色屏,其显示分辨率为128*64像素点。实则是一款准双色屏。因为尽管它有黄蓝2种色彩,但色彩是分区域使用的,而不能自主的设置色彩。
1.jpg
显示效果

以模拟方式输出高低电平的语句定义为:
#define OLED_SCLK_Set() GPIO_SetOutBits(HT_GPIOA, GPIO_PIN_2);
#define OLED_SCLK_Clr() GPIO_ClearOutBits(HT_GPIOA, GPIO_PIN_2);
#define OLED_SDIN_Set() GPIO_SetOutBits(HT_GPIOA, GPIO_PIN_3);
#define OLED_SDIN_Clr() GPIO_ClearOutBits(HT_GPIOA, GPIO_PIN_3);
相应的引脚功能配置函数为:
  1. void OLED _GPIO_Configuration(void)
  2. {
  3.   {
  4.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
  5.     CKCUClock.Bit.AFIO = 1;
  6.     CKCUClock.Bit.PA = 1;
  7.     CKCU_PeripClockConfig(CKCUClock, ENABLE);
  8.   }
  9.   {
  10.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_2|AFIO_PIN_3, AFIO_FUN_GPIO);
  11.     GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_2|AFIO_PIN_3, GPIO_PR_DOWN);
  12.     GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_2, SET);
  13.     GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_3, SET);
  14.     GPIO_DirectionConfig(HT_GPIOA, GPIO_PIN_2|AFIO_PIN_3, GPIO_DIR_OUT);
  15.   }
  16. }

模拟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.     OLED_SCLK_Clr();
  7.     for(i=0;i<8;i++)
  8.     {
  9.         m=da;
  10.         m=m&0x80;
  11.         if(m==0x80)
  12.         {
  13.             OLED_SDIN_Set();
  14.         }
  15.         else
  16.             OLED_SDIN_Clr();
  17.         __Delay(2);
  18.         da=da<<1;
  19.         OLED_SCLK_Set();
  20.         __Delay(2);
  21.         OLED_SCLK_Clr();
  22.         __Delay(2);
  23.      }
  24. }

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

相应的字符串显示函数为:
  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.     {      
  6.             OLED_ShowChar(x,y,chr[j],Char_Size);
  7.             x+=8;
  8.             if(x>120)
  9.             {
  10.                 x=0;
  11.                 y+=2;
  12.             }
  13.             j++;
  14.     }
  15. }

实现图示效果的主程序为:
  1. int main(void)
  2. {
  3.     NVIC_Configuration();
  4.     CKCU_Configuration();
  5.     GPIO_Configuration();
  6.     RETARGET_Configuration();
  7.     OLED _GPIO_Configuration();
  8.     OLED_Init();
  9.     OLED_Clear();
  10.     OLED_ShowString(20,0,"OLED & TEST",16);
  11.     OLED_ShowString(20,2,"HT32F52352",16);
  12.     while (1)
  13.     {
  14.       ;
  15.     }
  16. }


mituzu 发表于 2022-5-16 10:13 | 显示全部楼层
这个初始化的时候寄存器来个注释吧  
cehuafan 发表于 2022-5-16 11:12 | 显示全部楼层
这个刷新的速度怎么样   
hudi008 发表于 2022-5-16 12:24 | 显示全部楼层
spi的屏幕效果是不是比这个好点。  
janewood 发表于 2022-5-16 15:57 | 显示全部楼层
oled反向是怎么回事   
 楼主| jinglixixi 发表于 2022-5-16 17:33 | 显示全部楼层
cehuafan 发表于 2022-5-16 11:12
这个刷新的速度怎么样

很快,不存在闪或抖的问题。
 楼主| jinglixixi 发表于 2022-5-16 17:34 | 显示全部楼层
janewood 发表于 2022-5-16 15:57
oled反向是怎么回事

字模或显示程序不一致所致。
 楼主| jinglixixi 发表于 2022-5-16 17:36 | 显示全部楼层
hudi008 发表于 2022-5-16 12:24
spi的屏幕效果是不是比这个好点。

不一定,但使用彩屏时要使用SPI的。
abotomson 发表于 2022-6-20 19:41 | 显示全部楼层
屏幕刷新的怎么样  ?
macpherson 发表于 2022-6-20 19:50 | 显示全部楼层
需要一个代码驱动一下。  
modesty3jonah 发表于 2022-6-21 22:08 | 显示全部楼层
如何实现文字的移位呢?
 楼主| jinglixixi 发表于 2022-6-22 09:59 | 显示全部楼层
modesty3jonah 发表于 2022-6-21 22:08
如何实现文字的移位呢?

改变显示位置即可。
lzbf 发表于 2022-6-22 19:57 | 显示全部楼层
驱动OLED怎么样  
51xlf 发表于 2022-6-22 20:31 | 显示全部楼层
用的是什么芯片呢  
 楼主| jinglixixi 发表于 2022-6-23 09:12 | 显示全部楼层
lzbf 发表于 2022-6-22 19:57
驱动OLED怎么样

好用
lihuami 发表于 2022-7-4 16:15 | 显示全部楼层
HT32F52352多大频率?
cemaj 发表于 2022-7-4 16:54 | 显示全部楼层
这个寄存器说明在哪来?  
 楼主| jinglixixi 发表于 2022-7-4 21:03 | 显示全部楼层
cemaj 发表于 2022-7-4 16:54
这个寄存器说明在哪来?

器件的例程
mmbs 发表于 2022-7-5 16:16 | 显示全部楼层
iic的接口吗   
ghuca 发表于 2022-7-5 16:49 | 显示全部楼层
有的时候驱动OLED,屏幕闪烁。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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