[方案相关] 【HC32L196PCTA测评】+OLED屏显示篇

[复制链接]
2451|11
 楼主| jinglixixi 发表于 2023-8-7 10:20 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-8-7 10:22 编辑

HC32L196开发板上配有一个笔段式的液晶屏,但它的信息表现力还是较为有限,且占用引脚资源较多。为此,可以I2C接口的OLED屏来承担显示任务,其与开发板的连接关系为:
PA11SCL
PA12SDA
使这2个引脚输出高低电平的语句定义为:
#define OLED_SCLK_Set()   Gpio_SetIO(GpioPortA, GpioPin11)
#define OLED_SCLK_Clr()   Gpio_ClrIO(GpioPortA, GpioPin11)
#define OLED_SDIN_Set()   Gpio_SetIO(GpioPortA, GpioPin12)
#define OLED_SDIN_Clr()   Gpio_ClrIO(GpioPortA, GpioPin12)

1.jpg
1  使用接口


配置这2个引脚为输出功能的函数为:
  1. void App_OledInit(void)
  2. {
  3.     stc_gpio_cfg_t stcGpioCfg;
  4.     ///< 打开GPIO外设时钟门控
  5.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  6.     ///< 端口方向配置->输出(其它参数与以上(输入)配置参数一致)
  7.     stcGpioCfg.enDir = GpioDirOut;
  8.     ///< 端口上下拉配置->下拉
  9.     stcGpioCfg.enPu = GpioPuDisable;
  10.     stcGpioCfg.enPd = GpioPdEnable;
  11.     ///< GPIO IO OLED端口初始化
  12.     Gpio_Init(GpioPortA, GpioPin11, &stcGpioCfg);
  13.     Gpio_Init(GpioPortA, GpioPin12, &stcGpioCfg);
  14. }

该显示屏的初始化函数为:
  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_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.                 else {
  16.                          OLED_Set_Pos(x,y);
  17.                          for(i=0;i<6;i++)
  18.                              OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19.                }
  20. }

实现字符串显示功能的函数为:
  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.         {               

显示显示功能测试的主程序为:
  1. int32_t main(void)
  2. {
  3.     ///< LED端口初始化
  4.     App_LedInit();
  5.     App_OledInit();
  6.     OLED_Init();
  7.     OLED_Clear();
  8.     OLED_ShowString(0,0,"HC32L196 TEST",16);
  9.     OLED_ShowString(0,2,"OLED DISPLAY",16);        
  10.     while(1)
  11.     {
  12.         ///< LED点亮
  13.         Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
  14.         delay1ms(1000);
  15.         ///< LED关闭
  16.         Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
  17.         delay1ms(1000);
  18.     }
  19. }

经程序的编译与下载,其显示效果如图2所示。
2.jpg
2  显示效果

guijial511 发表于 2023-8-7 16:10 来自手机 | 显示全部楼层
楼主的OLED屏出镜率很高啊
 楼主| jinglixixi 发表于 2023-8-8 08:43 | 显示全部楼层
guijial511 发表于 2023-8-7 16:10
楼主的OLED屏出镜率很高啊

哈哈,OLED屏好使,是测试GPIO的最直接方式。
gaoyang9992006 发表于 2023-8-31 09:06 | 显示全部楼层
搞来搞去都是IO模拟,换成I2C+DMA啊,高效高速。
zhanglli 发表于 2023-8-31 21:19 | 显示全部楼层
是测试GPIO的最直接方式。
baiyunping333 发表于 2024-1-9 11:20 | 显示全部楼层
能漏个完整工程吗
lingyishanmen 发表于 2024-3-5 23:56 | 显示全部楼层
lingyishanmen 发表于 2024-3-6 00:08 | 显示全部楼层
楼主能分享一下完整的工程吗,调了几天都没调出来...
yangxiaor520 发表于 2024-3-6 21:23 来自手机 | 显示全部楼层
楼主的OLED贡献度很高啊
 楼主| jinglixixi 发表于 2024-3-7 09:21 | 显示全部楼层
mdj-fish 发表于 2024-3-7 09:42 | 显示全部楼层
楼主能分享一下完整的工程吗,
小夏天的大西瓜 发表于 2024-3-27 10:36 | 显示全部楼层
楼主的屏幕控制方案很详细,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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