你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
Johnwoo 提问时间:2014-1-5 12:20 /
移植了一个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++;
        }
}
 
 
 
收藏 评论9 发布时间:2014-1-5 12:20

举报

9个回答
有缘于你 回答时间: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板子可以帮我试一下这段代码,非常感谢!!
 
立码赚 回答时间:2022-10-5 20:48:19
void LCD_Locate(unsigned char x, unsigned char y),我觉得这个函有问题,
以下是我用过的,参考这个看看
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
}

立码赚 回答时间:2022-10-5 20:51:53
改成下面这样看看
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);
        }
}
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版