在论坛参加活动有幸获得一块NUCLEO-L452RE开发板,正好在隔壁论坛又弄了些清达光电采用KS0108兼容芯片的HG128642C图形液晶模块。以前玩过的12864液晶都是带字库的,而这个是不带字库的。这次用NUCLEO-L452RE开发板驱动还是第一次。
一、模块资料只有这张截图,另外还找了一份PDF(参附件)。该模块有22只引脚,其中的1、2脚经测试与17、18脚功能是一样的,这里用的是17、18脚。
二、工程是用STM32CubeMX建立的,在婚建好的工程中另外添加了lcd12864.c和lcd12864.h文件
1、STM32CubeMX中配置的引脚,时钟及其它均是默认的。
3、主要代码
- /*配置LCD12864的控制端口*/
- #define LCD_CS1(a) if(a)\
- HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS1_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS1_Pin, GPIO_PIN_RESET);
- #define LCD_CS2(a) if(a)\
- HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS2_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_CS1_GPIO_Port, LCD_CS2_Pin, GPIO_PIN_RESET);
- #define LCD_RS(a) if(a)\
- HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET);
- #define LCD_RW(a) if(a)\
- HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_RESET);
- #define LCD_EN(a) if(a)\
- HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_RESET);
- #define LCD_RST(a) if(a)\
- HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET);\
- else \
- HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
- /*向LCD端口送数据*/
- void LCD12864_DATA_OUT(uint8_t data)
- {
- GPIOC->ODR &= 0xff00;
- GPIOC->ODR |=data;
- }
- /** 写入左半屏指令 子程序**/
- void Writecom1(uint8_t wcom)
- {
- LCD_CS1(1);
- LCD_CS2(0);
- //Busy();
- delayus(180);
- LCD12864_DATA_OUT(wcom);
- LCD_RS(0);
- LCD_RW(0);
- LCD_EN(1);
- __NOP();
- LCD_EN(0);
- __NOP();
- }
- /** 写入左半屏数据 子程序***/
- void Writedata1(uint8_t wdata)
- {
- LCD_CS1(1);
- LCD_CS2(0);
- //Busy();
- delayus(180);
- LCD12864_DATA_OUT(wdata);
- LCD_RS(1);
- LCD_RW(0);
- LCD_EN(1);
- __NOP();
- LCD_EN(0);
- __NOP();
- }
- /** 写入右半屏指令 子程序**/
- void Writecom2(uint8_t wcom)
- {
- LCD_CS1(0);
- LCD_CS2(1);
- //Busy();
- delayus(180);
- LCD12864_DATA_OUT(wcom);;
- LCD_RS(0);
- LCD_RW(0);
- LCD_EN(1);
- __NOP();
- LCD_EN(0);
- __NOP();
- }
- /** 写入右半屏数据 子程序**/
- void Writedata2(uint8_t wdata)
- {
- LCD_CS1(0);
- LCD_CS2(1);
- //Busy();
- delayus(180);
- LCD12864_DATA_OUT(wdata);
- LCD_RS(1);
- LCD_RW(0);
- LCD_EN(1);
- __NOP();
- LCD_EN(0);
- __NOP();
- }
- /** 清屏子程序**/
- void Clear(void)
- {
- uint8_t i,j;
- for(i=0; i<8; i++)
- {
- Writecom1(0xb8 + i);
- Writecom1(0x40);
- Writecom2(0xb8 + i);
- Writecom2(0x40);
- for(j=0; j<64; j++)
- {
- Writedata1(0);
- Writedata2(0);
- }
- }
- }
程序测试时没有加入“忙”检测,用延时代替了。
三、硬件连接和驱动测试效果。RST引脚可以直接接高电平;液晶模块的背光不能直接接+5V,随手拿了只1N4007串上了。
附件:
KS0108.pdf
(427.25 KB, 下载次数: 8)
|