找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3610|回复: 4
收起左侧

请教一下关于单片机+1602液晶的查忙程序问题

[复制链接]
ID:327029 发表于 2019-12-22 18:44 | 显示全部楼层 |阅读模式
当我采用延时的办法时,protues仿真1602液晶能正常显示字符,但当我用查忙函数时,1602液晶只亮不显示字符。查忙后程序如下:
#define DATAPORT P0
#define BUSY  0x80   
void ini()   //LCD初始化{
        rw=0;
        en=0;
        P2=0xff;
        writeCG();
        write_order(0x38,1);
        write_order(0x0c,1);
        write_order(0x06,1);
        write_order(0x01,1);
        

}
void lcd_wait(void)
{
    DATAPORT=0xff;             //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
        en=1;
    rs=0;   
    rw=1;   
    _nop_();
    _nop_();
        _nop_();
    while(DATAPORT&BUSY)  
        {  en=0;
           _nop_();
           _nop_();
           en=1;
           _nop_();
           _nop_();
           }         
   en=0;        
        
}
void write_order(uchar com,uchar BusyC)
{
   /*        rs=0;
        P2=order;
        delay(4);
        en=1;
        delay(4);
        en=0;         */  
         if(BusyC)lcd_wait();
        DATAPORT=com;
    rs=0;                   // 选中指令寄存器
    rw=0;                       // 写模式        
    en=1;   
        _nop_();   
        _nop_();
        _nop_();
    en=0;
}
void write_date(uchar date)
{        
/*        rs=1;
        P2=date;
        delay(4);
        en=1;
        delay(4);
        en=0;         */
         lcd_wait( );             //检测忙信号   
        DATAPORT=date;
    rs=1;                // 选中数据寄存器
    rw=0;                    // 写模式
    en=1;
    _nop_();
        _nop_();
        _nop_();
    en=0;
}


3.png
2.png
1.png
回复

使用道具 举报

ID:584814 发表于 2019-12-23 10:14 | 显示全部楼层
1602不需要查忙,理论上需要实际上不要。但最好留个预热的时间,加电后过半秒再操作。
回复

使用道具 举报

ID:327029 发表于 2019-12-24 11:35 | 显示全部楼层
已搞定,查忙要设定初始化第一次不查忙.查忙程序需要加return;。
void ini()   //LCD初始化{
       write_order(0x38,0);
       write_order(0x38,0);
      write_order(0x38,0);
        rw=0;
        en=0;
        P2=0xff;
        writeCG();
        write_order(0x38,1);
        write_order(0x0c,1);
        write_order(0x06,1);
        write_order(0x01,1);
        

}
void lcd_wait(void)
{
  return;
    DATAPORT=0xff;             //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
        en=1;
    rs=0;   
    rw=1;   
    _nop_();
    _nop_();
        _nop_();
    while(DATAPORT&BUSY)  
        {  en=0;
           _nop_();
           _nop_();
           en=1;
           _nop_();
           _nop_();
           }         
   en=0;        
        
}
回复

使用道具 举报

ID:871292 发表于 2021-4-25 12:53 | 显示全部楼层
谢谢分享!请教为什么加了return就可以了?
回复

使用道具 举报

ID:995418 发表于 2021-12-27 20:31 | 显示全部楼层
加了个retrun不是相当于屏蔽掉查忙函数了吗,它根本就没运行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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