我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2992|回复: 7

[资料贡献] lcd1602显示程序51单片机(c语言)

[复制链接]

该用户从未签到

27

主题

148

回帖

68

积分

二级逆天

pcb是一门艺术

积分
68

社区居民终身成就奖

QQ
发表于 2014-1-22 15:14:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
现在玩51的人少了,把两年前的笔记发上来赚点积分,
曾用这个程序,c语言写了个1602秒表,不用中断定时,只用软件延时,达到17分钟5秒的误差
这5秒的误差应理解成晶振的误差和温度引起的原因
/*****************************************/
/*项目名:lcd1602显示程序
/*程序名:
/*公司名称:
/*创始人: 日期:2011-12-28
/*修改人: 日期:
/*功能描述:写入1个字符和写入字符串
/*其他说明:
/*版本:1.0
/*****************************************/
#include<AT89X51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;//寄存器选择位,1602的第4脚。
sbit RW=P2^6;//读写选择位,1602的第5脚。
sbit E=P2^7;//使能信号位,1602的第6脚。
sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
uchar code lcdstring[]={"LCD1602"};
/*****************************************/
/*函数名:delayms()
/*功能描述:延时
/*函数说明:最高65535ms,最低1ms
/*调用函数:无
/*全局变量:无
/*输入:unsigned int t
/*返回:无
/*设计者:张周伟 日期:2011-12-19
/*修改者: 日期:
/*版本:1.0
/*****************************************/
void delayms(uint t)
{
uchar i;
while(t--)for(i=0;i<120;i++);
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
uchar BusyTest(void)
{
bit result;
RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
    RW=1;
    E=1;        //E=1,才允许读写
    _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();   //空操作四个机器周期,给硬件反应时间
    result=BF;  //将忙碌标志电平赋给result
    E=0;         //将E恢复低电平
    return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{   
while(BusyTest()==1); //如果忙就等待
RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;   
E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
                           // 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();             //空操作两个机器周期,给硬件反应时间
P0=dictate;            //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();               //空操作四个机器周期,给硬件反应时间
E=1;                   //E置高电平
_nop_();
_nop_();
_nop_();            
_nop_();               //空操作四个机器周期,给硬件反应时间
E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);  
RS=1;           //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
                // 就是让E从0到1发生正跳变,所以应先置"0"
P0=y;           //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();       //空操作四个机器周期,给硬件反应时间
E=1;          //E置高电平
_nop_();
_nop_();
_nop_();
_nop_();        //空操作四个机器周期,给硬件反应时间
E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delayms(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);  //显示模式设置:001(0/1数据总线4位/8位)(0/1显示1行/2行)(0/1每字符5x7点阵/5x10)xx
delayms(5);               //延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delayms(5);
WriteInstruction(0x38); //连续三次,确保初始化成功
delayms(5);
WriteInstruction(0x06);  //显示模式设置:显示开,无光标,光标不闪烁  000001(0/1光标左移/右移)(0/1写入新数据后显示屏不移动/显示屏右移1个字符)
delayms(5);
WriteInstruction(0x0c);  //显示模式设置:光标右移,字符不移        00001(0/1显示器关/开)(0/1无光标/有光标)(0/1光标闪/不闪)
delayms(5);
WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
delayms(5);              
// 移动方向设置:显示屏或光标 0001()()xx   
//(0)(0)=光标左移1格,ac-1()()  //(0)(1)=光标右移1格,ac+1
//(1)(0)=显示器上的字符全部左移1格,光标不动 //(1)(1)=显示器上的字符全部右移1格,光标不动

}
//主程序
/*void main()
{
uchar lcdi=0;
LcdInitiate();         //调用LCD初始化函数  
delayms(10);             //延时10ms,给硬件一点反应时间
WriteAddress(0x00); //写入一个字符
WriteData('L');  
WriteAddress(0x01); //写入一个字符
WriteData('C');
WriteAddress(0x02); //写入一个字符
WriteData('D');
WriteAddress(0x40);  //写入字符串  //第二行第一个位置开始显示
while(lcdstring[lcdi]!='\0')
{     
  WriteData(lcdstring[lcdi]);
  lcdi++;             //指向下字符数组一个元素   
}
delayms(100);
while(1);
}  *////
pcb是一门艺术
回复

使用道具 举报

该用户从未签到

0

主题

35

回帖

26

积分

一级逆天

积分
26

社区居民忠实会员终身成就奖

QQ
发表于 2014-1-23 09:31:04 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

2

主题

224

回帖

488

积分

二级逆天

积分
488

终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模

QQ
发表于 2014-1-23 10:25:55 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

8

主题

298

回帖

51

积分

一级逆天

积分
51

终身成就奖社区居民幽默大师奖贴图大师奖宣传大使奖优秀斑竹奖金点子奖新人进步奖灌水天才奖

QQ
发表于 2014-1-23 16:35:36 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

27

主题

148

回帖

68

积分

二级逆天

pcb是一门艺术

积分
68

社区居民终身成就奖

QQ
 楼主| 发表于 2014-1-24 12:02:58 | 显示全部楼层
pcb是一门艺术
回复

使用道具 举报

该用户从未签到

8

主题

307

回帖

246

积分

二级逆天

积分
246

终身成就奖社区居民

QQ
发表于 2014-1-25 17:34:55 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

0

主题

240

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2021-12-16 08:51:04 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

10

主题

75

回帖

14

积分

二级逆天

积分
14

社区居民终身成就奖

QQ
发表于 2021-12-16 12:25:23 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表