[STM32L4] NUCLEO-L452RE驱动HG128642C(KS0108)

[复制链接]
1532|3
 楼主| lisingch 发表于 2017-10-15 18:10 | 显示全部楼层 |阅读模式
        在论坛参加活动有幸获得一块NUCLEO-L452RE开发板,正好在隔壁论坛又弄了些清达光电采用KS0108兼容芯片的HG128642C图形液晶模块。以前玩过的12864液晶都是带字库的,而这个是不带字库的。这次用NUCLEO-L452RE开发板驱动还是第一次。

一、模块资料只有这张截图,另外还找了一份PDF(参附件)。该模块有22只引脚,其中的1、2脚经测试与17、18脚功能是一样的,这里用的是17、18脚。
HG128642C 端子定义.jpg

二、工程是用STM32CubeMX建立的,在婚建好的工程中另外添加了lcd12864.c和lcd12864.h文件
1、STM32CubeMX中配置的引脚,时钟及其它均是默认的。
1.jpg
2.jpg

3、主要代码
  1. /*配置LCD12864的控制端口*/
  2. #define LCD_CS1(a)         if(a)\
  3.                                                                                         HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS1_Pin, GPIO_PIN_SET);\
  4.                                                                                 else \
  5.                                                                                         HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS1_Pin, GPIO_PIN_RESET);
  6. #define LCD_CS2(a)         if(a)\
  7.                                                                                         HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS2_Pin, GPIO_PIN_SET);\
  8.                                                                                 else \
  9.                                                                                         HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS2_Pin, GPIO_PIN_RESET);
  10. #define LCD_RS(a)         if(a)\
  11.                                                                                         HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_SET);\
  12.                                                                                 else \
  13.                                                                                         HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET);
  14. #define LCD_RW(a)         if(a)\
  15.                                                                                         HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_SET);\
  16.                                                                                 else \
  17.                                                                                         HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_RESET);       
  18. #define LCD_EN(a)         if(a)\
  19.                                                                                         HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_SET);\
  20.                                                                                 else \
  21.                                                                                         HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_RESET);
  22. #define LCD_RST(a)         if(a)\
  23.                                                                                         HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET);\
  24.                                                                                 else \
  25.                                                                                         HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
  1. /*向LCD端口送数据*/
  2. void LCD12864_DATA_OUT(uint8_t data)
  3. {
  4.         GPIOC->ODR &= 0xff00;
  5.         GPIOC->ODR |=data;
  6. }
  1. /** 写入左半屏指令 子程序**/
  2. void Writecom1(uint8_t wcom)
  3. {
  4.     LCD_CS1(1);
  5.     LCD_CS2(0);
  6.     //Busy();
  7.                 delayus(180);
  8.                 LCD12864_DATA_OUT(wcom);
  9.     LCD_RS(0);
  10.     LCD_RW(0);
  11.     LCD_EN(1);
  12.     __NOP();
  13.     LCD_EN(0);
  14.     __NOP();
  15. }


  16. /** 写入左半屏数据 子程序***/
  17. void Writedata1(uint8_t wdata)
  18. {
  19.     LCD_CS1(1);
  20.     LCD_CS2(0);
  21.     //Busy();
  22.                 delayus(180);
  23.                 LCD12864_DATA_OUT(wdata);
  24.     LCD_RS(1);
  25.     LCD_RW(0);
  26.     LCD_EN(1);
  27.     __NOP();
  28.     LCD_EN(0);
  29.     __NOP();
  30. }


  31. /** 写入右半屏指令 子程序**/
  32. void Writecom2(uint8_t wcom)
  33. {
  34.     LCD_CS1(0);
  35.     LCD_CS2(1);
  36.     //Busy();
  37.                 delayus(180);
  38.                 LCD12864_DATA_OUT(wcom);;
  39.     LCD_RS(0);
  40.     LCD_RW(0);
  41.     LCD_EN(1);
  42.     __NOP();
  43.     LCD_EN(0);
  44.     __NOP();
  45. }


  46. /** 写入右半屏数据 子程序**/
  47. void Writedata2(uint8_t wdata)
  48. {
  49.     LCD_CS1(0);
  50.     LCD_CS2(1);
  51.     //Busy();
  52.                 delayus(180);
  53.                 LCD12864_DATA_OUT(wdata);
  54.     LCD_RS(1);
  55.     LCD_RW(0);
  56.     LCD_EN(1);
  57.     __NOP();
  58.     LCD_EN(0);
  59.     __NOP();
  60. }


  61. /**  清屏子程序**/
  62. void Clear(void)
  63. {
  64.     uint8_t i,j;
  65.     for(i=0; i<8; i++)
  66.     {
  67.         Writecom1(0xb8 + i);
  68.         Writecom1(0x40);
  69.         Writecom2(0xb8 + i);
  70.         Writecom2(0x40);
  71.         for(j=0; j<64; j++)
  72.         {
  73.             Writedata1(0);
  74.             Writedata2(0);
  75.         }
  76.     }
  77. }
程序测试时没有加入“忙”检测,用延时代替了。

三、硬件连接和驱动测试效果。RST引脚可以直接接高电平;液晶模块的背光不能直接接+5V,随手拿了只1N4007串上了。
IMG_20171015_172926.jpg
IMG_20171015_172941.jpg
IMG_20171015_172912.jpg
IMG_20171015_172836.jpg
IMG_20171015_172845.jpg

附件:
KS0108.pdf (427.25 KB, 下载次数: 8)


 楼主| lisingch 发表于 2017-10-15 18:44 | 显示全部楼层
不知是什么问题?我这一直看不到图片。
airwill 发表于 2017-10-15 23:19 | 显示全部楼层
支持一下, 图片很正常啊
估计是浏览器问题, 屏蔽图片屏蔽广告方面的问题
 楼主| lisingch 发表于 2017-10-16 10:02 | 显示全部楼层
airwill 发表于 2017-10-15 23:19
支持一下, 图片很正常啊
估计是浏览器问题, 屏蔽图片屏蔽广告方面的问题

现在看到了,估计是网络的问题。谢谢支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

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