移植了一个LCD1602 HD44780的标准4线驱动到STM8S105上, 可是不能工作,LCD模块初始化之后没有任何反应。 有没有了解的兄弟看看怎么回事? 按照之前几位兄弟发现的问题都改了, 现在为了简化,我用PB整个口做数据口,PE5,6,7 接控制线, 可是即使用8位模式一样不能正常驱动液晶,代码执行后1602毫无反应,就是第一行一条黑色框,应该是没有初始化的样子。 //工作方式设置 const unsigned char LCD_8BIT_MODE = 0x38;//接口为8-bits const unsigned char LCD_4BIT_MODE = 0x28;//接口4-bits // const unsigned char LCD_AUTO_INCREMENT = 0x06;// const unsigned char LCD_CLR = 0x01;// const unsigned char LCD_DISPLAY_ON = 0x0c;// const unsigned char LCD_DISPLAY_OFF = 0x08;// // void lcd_delay() { delay_us(10); } //初始化LCD的数据端口设置为输入模式 void LCD_Input_Mode() { GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_IN_PU_NO_IT); } // //初始化LCD的数据端口设置为输出模式 void LCD_Output_Mode() { GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_SLOW); } //LCD初始化 void LCD_Init(void) { //初始化RS,EN,RW为输出 GPIO_Init(LCD_PIN_RS, GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(LCD_PIN_RW, GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(LCD_PIN_EN, GPIO_MODE_OUT_PP_HIGH_SLOW); // LCD_WriteCommand(LCD_8BIT_MODE); LCD_WriteCommand(LCD_DISPLAY_OFF); // LCD_WriteCommand(LCD_AUTO_INCREMENT); LCD_WriteCommand(LCD_CLR); LCD_WriteCommand(LCD_DISPLAY_ON); } void LCD_Wait (void) //等待LCD完成操作 { unsigned char ac_dat; unsigned char busy_flag; do { ac_dat = LCD_Read_Status(); busy_flag = (ac_dat & 0x80); if(busy_flag){ UART_SendString("LCD Busy");} }while(busy_flag); //=1表示忙, =0表示空闲 } //读LCD状态寄存器状态 unsigned char LCD_Read_Status(void) { unsigned char status = 0x00; // GPIO_WriteLow(LCD_PIN_EN); GPIO_WriteLow(LCD_PIN_RS); // GPIO_WriteHigh(LCD_PIN_RW);//读出 //初始化数据端口为输入 LCD_Input_Mode(); // GPIO_WriteHigh(LCD_PIN_EN); status = GPIO_ReadInputData(GPIOB); // GPIO_WriteLow(LCD_PIN_EN); return (status); } //8位输出 void Write8BitData(unsigned char cmd) { GPIO_Write(GPIOB, cmd); } // void LCD_WriteCommand (unsigned char cmd) { //初始化数据端口为输出 LCD_Output_Mode(); // LCD_Wait(); //检测忙 GPIO_WriteLow(LCD_PIN_RS); //写入指令 GPIO_WriteLow(LCD_PIN_RW);// GPIO_WriteHigh(LCD_PIN_EN); Write8BitData(cmd); GPIO_WriteLow(LCD_PIN_EN); } /*--------------------------------------------------------------*/ //写入数据 void LCD_WriteData(unsigned char data) { LCD_Output_Mode(); LCD_Wait(); //检测忙 GPIO_WriteHigh(LCD_PIN_RS); //写入数据 GPIO_WriteLow(LCD_PIN_RW);// GPIO_WriteHigh(LCD_PIN_EN); //先送出高4位 Write8BitData(data); GPIO_WriteLow(LCD_PIN_EN); } void LCD_Locate(unsigned char x, unsigned char y) { if(y == 0) { LCD_WriteCommand(x + 0x80); } if(y == 1) { LCD_WriteCommand(x + 0xC0); } if(y == 2) { LCD_WriteCommand(x + 0x90); } if(y == 3) { LCD_WriteCommand(x + 0xD0); } } // void LCD_DisplayString(unsigned char x, unsigned char y, const char *s) { LCD_Locate(x, y); while(*s) { LCD_WriteData(*s); s++; } } |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
在STVD下配置使用CXSTM8的方式
RE:STM8的LCD1602 4线驱动,为什么不工作
{
status += 1;
status
RE:STM8的LCD1602 4线驱动,为什么不工作
1、你是先读出bit4,bit5,bit6,bit7,然后再读bit0、1、2、3. 然后bit顺序就反了。 不是按照7 -1排序的。是按照4-7,然后0-3排序。
2、IO输出,最好先全部算出管教输出,然后一次设置gpio,你现在是一个个bit的设置,效率低,时序还乱七八糟的
回复:STM8的LCD1602 4线驱动,为什么不工作
RE:STM8的LCD1602 4线驱动,为什么不工作
RE:STM8的LCD1602 4线驱动,为什么不工作
回复:STM8的LCD1602 4线驱动,为什么不工作
液晶仍然是未初始化的状态。
回复:STM8的LCD1602 4线驱动,为什么不工作
代码写错了。
1、你是先读出bit4,bit5,bit6,bit7,然后再读bit0、1、2、3. 然后bit顺序就反了。 不是按照7 -1排序的。是按照4-7,然后0-3排序。
2、IO输出,最好先全部算出管教输出,然后一次设置gpio,你现在是一个个bit的设置,效率低,时序还乱七八糟的
兄弟,按照你说的已经改过了,可是为什么还是不能显示呢,你这边有没有类似的STM8板子可以帮我试一下这段代码,非常感谢!!
以下是我用过的,参考这个看看
void LCD1604_Set_Cursor(u8 x, u8 y)
{
u8 addr;
if (y == 0)
addr = 0x00 + x; //0x00第一行起始地址
if (y == 1)
addr = 0x40 + x; //0x00第二行起始地址
if (y == 2)
addr = 0x10 + x; //0x00第三行起始地址
if (y == 3)
addr = 0x50 + x; //0x00第四行起始地址
LCD1604_Write_Cmd(addr|0x80);// 0x100
}
void LCD_Locate(unsigned char x, unsigned char y)
{
if(y == 0)
{
LCD_WriteCommand(x +0x00+ 0x80);
}
if(y == 1)
{
LCD_WriteCommand(x +0x40+ 0x80);
}
if(y == 2)
{
LCD_WriteCommand(x +0x10+ 0x80);
}
if(y == 3)
{
LCD_WriteCommand(x +0x50+ 0x80);
}
}