【先楫半导体HPM6750EVKMINI评估板试用体验】+OLED屏的显示驱动

描述

本文来源电子发烧友社区,作者:jennyzhaojie, 帖子地址:https://bbs.elecfans.com/jishu_2284197_1_1.html

HPM6750EVKMINI是一款外设及接口十分丰富的开发板,它所提供的LCD接口是通过窄间距的线排来连接显示屏,由于手头没有这种显示的显示屏,只好以最小的资源占用为其配置一个I2C接口的显示屏,除了进行视频显示它还是可以满足一般的显示需求的,其显示效果如图1所示。
                              
先楫半导体
 
图1 显示效果
由图1可知,该显示屏可支持字符串、数值及汉字的显示,且可显示2种字体大小的显示。
为防止引脚使用上的重叠,该显示屏所使用的引脚为扩展接口上的引脚,其连接关系为:
SCL---PB13
SDA---PB14
先楫半导体
 
 
 
图2 引脚位置及名称
将所用引脚配置为输出模式的函数为:


  1. voidapp_init_oled_pins(void)
  2. {
  3.     gpio_enable_pin_output(HPM_GPIO0,GPIO_DI_GPIOB, 13);
  4.     gpio_enable_pin_output(HPM_GPIO0,GPIO_DI_GPIOB, 14);
  5. }
复制代码

 
在使用GPIO口模拟I2C通讯的情况下,实现高低电平输出的语句定义为:


  1. #define  OLED_SCLK_Set()  gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOB, 13,1);
  2. #define  OLED_SCLK_Clr()  gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOB, 13,0);
  3. #define  OLED_SDIN_Set()  gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOB, 14,1);
  4. #define  OLED_SDIN_Clr()  gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOB, 14,0);
复制代码

 
以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.     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_Us(2);
  18.         da=da<<1;
  19.         OLED_SCLK_Set();
  20.         Delay_Us(2);
  21.         OLED_SCLK_Clr();
  22.         Delay_Us(2);
  23.      }
  24. }
复制代码


由于开发板的工作主频高达816MHz,因此在引脚输出信号时,一定要加适当的延时,否则会影响显示输出。
两种显示字模的结构如下:


  1. unsignedchar F6x8[][6] =
  2. {
  3. 0x00,0x00, 0x00, 0x00, 0x00, 0x00,// sp
  4. 0x00,0x00, 0x00, 0x2f, 0x00, 0x00,// !
  5. 0x00,0x00, 0x07, 0x00, 0x07, 0x00,// "
  6. ...
  7. }
复制代码

 


  1. unsignedchar F8X16[]=
  2. {
  3. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0
  4. 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1
  5. 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2
  6. ...
  7. }
复制代码

 
在以上字库的支持下,实现字符显示的函数为:


  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)
  6.         {
  7.             x=0;
  8.             y=y+2;
  9.         }
  10.         if(Char_Size ==16)
  11.         {
  12.             OLED_Set_Pos(x,y);
  13.             for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  14.             OLED_Set_Pos(x,y+1);
  15.             for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  16.          }
  17.          else
  18.          {
  19.                 OLED_Set_Pos(x,y);
  20.                 for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  21.          }
  22. }
复制代码


实现字符串显示的函数为:


  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]!='')
  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. }
复制代码


为实现汉字的显示,需要自行构建一个小型的字库,见图3所示。
 
先楫半导体
 
图3 提取字模
配合该字库的汉字显示函数为:


  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.     app_init_oled_pins();
  4.     OLED_Init();
  5.     OLED_Clear();
  6.     OLED_ShowString(0,2,"HPM6750 EVKMINI",16);
  7.     OLED_ShowString(20,4,"OLED test",16);
  8.     OLED_ShowString(20,6,"jennyzhaojie",8);
  9.     OLED_ShowCHinese(20,0,0);
  10.     OLED_ShowCHinese(40,0,1);
  11.     OLED_ShowCHinese(60,0,2);
  12.     OLED_ShowCHinese(80,0,3);
  13.     OLED_ShowCHinese(100,0,4);
  14.     while(1);
  15.     return 0;
  16. }
复制代码


有了OLED屏的显示功能,进行人机交互就方便了许多。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分