找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3695|回复: 2
收起左侧

关于STC15系列单片机驱动LCD1602的延时控制程序

[复制链接]
ID:432932 发表于 2019-3-10 16:04 | 显示全部楼层 |阅读模式
51单片机学习日记15系列为增强型1T 51内核的单片机,驱动LCD1602时需要增加适当延时,而且只要延时控制的得当,可以省去判忙步骤,下面是简单的例程:
(使用的是STC15F2K60S2)
QQ图片20190310155027.png
这是引脚定义;下面是LCD头文件:

void LCD_WriteCmd(unsigned char a)   //写命令
{      
                                LCD = a;
                                RS = 0;
                                RW = 0;
              ENLCD = 1;Delayus(50);    //延时50us
              ENLCD = 0;Delayus(50);
}
void LCD_ShowStr(unsigned char x,unsigned y ,unsigned char *str)  //x:0~15 y:0~1
{      
              if(y==0)
                                        LCD_WriteCmd((0x00+x)|0x80);   //设置坐标
                                else
                                        LCD_WriteCmd((0x40+x)|0x80);
                                while(*str != '\0')            //写数据
                          {
                                        LCD = *str++;
                                         RS = 1;
                                  RW = 0;
                                  ENLCD = 1;Delayus(50);      //延时50US
                                        ENLCD = 0;Delayus(50);
                        }        
}
void LCD_Init()      //数据手册的初始化命令
{  
         LCD_WriteCmd(0x38);
         Delayms(5);               //延时5MS
         LCD_WriteCmd(0x0C);
         Delayms(5);
         LCD_WriteCmd(0x06);
         Delayms(5);
         LCD_WriteCmd(0x01);
         Delayms(5);
}

代码比较简单,下面给出延时函数和主函数:
void Delayus(unsigned int a)                //@11.0592MHz
{ do{
        _nop_();
        _nop_();
        _nop_();
}while(--a);
        
}
void Delayms(unsigned int a)                //@11.0592MHz
{unsigned char i, j;
        do
        {
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
        }while(--a);
}

主函数:
#include<LCD_1602.h>
void main()
{



    ENLCD = 0


        LCD_Init();  //初始化
        LCD_ShowStr(0,0,"Happy Every Day");  //在第0行第0列显示Happy Every Day
        while(1);
}

下面是实物图

IMG_20190310_155925.jpg


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:432932 发表于 2019-3-10 16:07 | 显示全部楼层
需要注意的是初始化那里每条命令之间的延时,延时太短会导致字符可能部分缺失
回复

使用道具 举报

ID:432932 发表于 2019-3-10 16:11 | 显示全部楼层
如果上电后产生的是一条全黑就可能是时序不对了(大多数情况下是延时不当)虽然LCD1602也是纳秒级的反应速度,但是实际应用时需要留us级的时间来处理,由于能力有限,没有试过正常使用的极限是多少。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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