找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2105|回复: 5
收起左侧

STM32驱动1602显示屏,E引脚产生高脉冲问题?

[复制链接]
ID:656632 发表于 2019-12-12 08:46 | 显示全部楼层 |阅读模式
(1)STM32驱动1602液晶显示屏,需要使1602的E引脚为高脉冲,才能写指令和数据进1602显示屏。

(2)51单片机和STM32单片机产生高脉冲所写的程序不一样。

(3)我用示波器在STM32驱动1602上电后检验其每个引脚的波形,其它15个引脚波形都符合我写的程序,就E引脚始终是高电平。

(4)使STM32产生高脉冲要用到通用定时器,使其计时,然后产生一个脉冲吗?

需要你们指导一下。

回复

使用道具 举报

ID:25310 发表于 2019-12-12 14:12 | 显示全部楼层
用LED点灯程序看看那个引脚是否有问题,给个200U脉冲给哪个引脚出用示波器看看如果波形正常就没问题的。
回复

使用道具 举报

ID:25310 发表于 2019-12-12 14:41 | 显示全部楼层
补充一下。细看了你说的E引脚波形,哪些延时需要调整一下,比如下面两个延时里面,一个5uS,有人用到1uS,这个确实算高速脉冲,但这样做可靠性不高,建议给到10US左右,另外一个延时大约380uS,调整一下再试一试。
/*********************************************************************
*功    能:写入LCD初始化时的命令,不可以检测忙状态
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{                          
        LCD_RS_0;
        delay_nus(5);
        LCD_RW_0;
        delay_nus(5);
        DATAOUTCLR;
        DATAOUT |= cmd;
        LCD_EN_0;
        delay_nus(300);
        LCD_EN_1;
        delay_nus(300);
        LCD_EN_0;
        delay_nms(5);
}
/*********************************************************************
*名    称:LCD_Writecmd()
*功    能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{  
       
        while(LCD_busy());
        LCD_RS_0;           //对同一个寄存器的两次写入,中间延时一会
        delay_nus(5);
        LCD_RW_0;
        delay_nus(5);
        LCD_EN_0;
        delay_nus(300);//产生脉冲
        DATAOUTCLR;
        DATAOUT |= cmd;
        LCD_EN_1;
        delay_nus(300);//必要的延时
        LCD_EN_0;           //下降沿,LCD1602开始工作
        delay_nus(5);
       
}
/*********************************************************************
*名    称:LCD_Writedata()
*功    能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255  包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(uchar dat)
{                        
        while(LCD_busy());//等待LCD1602空闲
        LCD_RS_1;
        delay_nus(5);
        LCD_RW_0;
        delay_nus(5);
        DATAOUTCLR;
        DATAOUT |= dat;
        LCD_EN_1;                //先拉高
        delay_nus(300);        //很重要的延时,经调试,延时300us以上才可以
        LCD_EN_0;       //下降沿,开始写入有效数据
        delay_nus(5);
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2019-12-12 15:21 | 显示全部楼层
将1602的E引脚使能端拉高是为制造有效的下降沿做准备,不是高电平或低电平有效,是陡峭的下降沿才有效。
回复

使用道具 举报

ID:416239 发表于 2019-12-12 15:54 | 显示全部楼层
用示波器抓一下波
回复

使用道具 举报

ID:25310 发表于 2019-12-12 17:24 | 显示全部楼层
李泽训 发表于 2019-12-12 15:54
用示波器抓一下波

示波器波形是按 (LCD_EN_1;delay_nus(10);)以下代码测试的,
当“LCD_EN_1;delay_nus(5);”这样就会乱码,但波形不明显,按这个测试当E=15uS时不可靠,见图片显示不完整。
       

/*********************************************************************
*功    能:写入LCD初始化时的命令,不可以检测忙状态
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{                          
        LCD_RS_0;
        delay_nus(1);
        LCD_RW_0;
        delay_nus(1);
        DATAOUTCLR;
        DATAOUT |= cmd;
        LCD_EN_0;
        delay_nus(1);
        LCD_EN_1;
        delay_nus(10);
        LCD_EN_0;
        delay_nms(1);
}
/*********************************************************************
*名    称:LCD_Writecmd()
*功    能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{  
       
        while(LCD_busy());
        LCD_RS_0;           //对同一个寄存器的两次写入,中间延时一会
        delay_nus(1);
        LCD_RW_0;
        delay_nus(1);
        LCD_EN_0;
        delay_nus(1);//产生脉冲
        DATAOUTCLR;
        DATAOUT |= cmd;
        LCD_EN_1;
        delay_nus(10);//必要的延时
        LCD_EN_0;           //下降沿,LCD1602开始工作
        delay_nus(1);
       
}
/*********************************************************************
*名    称:LCD_Writedata()
*功    能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255  包括各个ASCII码字符
*出口参数:无
*********************************************************************/

void LCD_Writedata(uchar dat)
{
        while(LCD_busy());
         
        LCD_RS_1;
        delay_nus(1);
        LCD_RW_0;
        delay_nus(1);
  DATAOUTCLR;
        DATAOUT |= dat;
  delay_nus(1);       
        LCD_EN_1;  
  delay_nus(10);
        LCD_EN_0;  
        delay_nus(1);
         
       
}


lcd_20191212172320_NG.jpg
E_RS.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表