Johnwoo 发表于 2014-1-5 12:20:38

STM8的LCD1602 4线驱动,为什么不工作

移植了一个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++;
        }
}
 
 
 

有缘于你 发表于 2014-1-6 18:24:56

RE:STM8的LCD1602 4线驱动,为什么不工作

if (GPIO_ReadInputPin(LCD_DATA_4))
{
    status += 1;
    status

wkuang 发表于 2014-1-6 22:30:13

RE:STM8的LCD1602 4线驱动,为什么不工作

代码写错了。
1、你是先读出bit4,bit5,bit6,bit7,然后再读bit0、1、2、3. 然后bit顺序就反了。 不是按照7 -1排序的。是按照4-7,然后0-3排序。
2、IO输出,最好先全部算出管教输出,然后一次设置gpio,你现在是一个个bit的设置,效率低,时序还乱七八糟的

青檬 发表于 2014-1-7 11:36:39

回复:STM8的LCD1602 4线驱动,为什么不工作

 查看读写数据命令时的延时是否够

勒布朗 发表于 2014-1-7 17:09:54

RE:STM8的LCD1602 4线驱动,为什么不工作

引脚配置模式的问题

看起来很黑 发表于 2014-1-9 12:40:40

RE:STM8的LCD1602 4线驱动,为什么不工作

数据位读取顺序错了

Johnwoo 发表于 2014-3-20 14:34:11

回复:STM8的LCD1602 4线驱动,为什么不工作

已经按照之前发现的问题都修改了,可是还是没有解决问题。
液晶仍然是未初始化的状态。

Johnwoo 发表于 2014-3-20 14:53:38

回复:STM8的LCD1602 4线驱动,为什么不工作

回复第 3 楼 于2014-01-06 22:30:13发表:
代码写错了。
1、你是先读出bit4,bit5,bit6,bit7,然后再读bit0、1、2、3. 然后bit顺序就反了。 不是按照7 -1排序的。是按照4-7,然后0-3排序。
2、IO输出,最好先全部算出管教输出,然后一次设置gpio,你现在是一个个bit的设置,效率低,时序还乱七八糟的
 
兄弟,按照你说的已经改过了,可是为什么还是不能显示呢,你这边有没有类似的STM8板子可以帮我试一下这段代码,非常感谢!!
 
页: [1]
查看完整版本: STM8的LCD1602 4线驱动,为什么不工作