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

查看: 6569|回复: 7

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

[复制链接]

1

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-1-5 12:20:38 | 显示全部楼层 |阅读模式
移植了一个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++;
        }
}
 
 
 
回复

使用道具 举报

2

主题

295

回帖

0

蝴蝶豆

初级会员

最后登录
2018-4-6
发表于 2014-1-6 18:24:56 | 显示全部楼层

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

if (GPIO_ReadInputPin(LCD_DATA_4))
{
    status += 1;
    status
回复 支持 反对

使用道具 举报

4

主题

224

回帖

0

蝴蝶豆

初级会员

最后登录
2020-7-4
发表于 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的设置,效率低,时序还乱七八糟的
回复 支持 反对

使用道具 举报

48

主题

209

回帖

0

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2014-1-7 11:36:39 | 显示全部楼层

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

 查看读写数据命令时的延时是否够
回复 支持 反对

使用道具 举报

13

主题

63

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-1-7 17:09:54 | 显示全部楼层

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

引脚配置模式的问题
回复 支持 反对

使用道具 举报

2

主题

60

回帖

0

蝴蝶豆

中级会员

最后登录
1970-1-1
发表于 2014-1-9 12:40:40 | 显示全部楼层

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

数据位读取顺序错了
回复 支持 反对

使用道具 举报

1

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2014-3-20 14:34:11 | 显示全部楼层

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

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

使用道具 举报

1

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 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板子可以帮我试一下这段代码,非常感谢!!
 
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版