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

查看: 6515|回复: 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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版