89C52控制1602A液晶的计时器

 一、LCD1602A液晶说明。

 

DataSheet说明(技术参数)

①此LCD共16个管脚。每个接口说明如下表。

 

PS:1-2管脚没什么好说的,就是接电源和地的。

      3管脚是偏压信号,这一管脚一般可以接个滑动变阻器,通过调节滑动变阻器可以控制字符显示颜色的深浅。

      4管脚是数据命令选择端,当其高电平为命令输入端,低电平为命令输入端。

      5管脚为读写选择端,当其高电平为读数据状态,底电平为写数据。

      6是使能信号(详细见时序图(下)),当其为高电平时把数据输送给液晶,这里需要注意的是当E为高电平时,数据必须是稳定的。

      7-14为数据I/O口。

      15-16我们暂时不作考虑。

② RAM映射。

PS:这里可以看出地址00-10和40-50为LCD的显示区域分别显示第一行和第二行,而10-27和50-67为非显示区域,但是可以存放数据。

 ③操作时序图

读操作

由时序图和DataSheet说明(技术参数)可看出需输入

读状态:RS=L,RW=H,E=H。输出D0-D7状态字。

读数据:RS=H,RW=H,E=H。输出D0-D7数据。

写操作

由时序图和DataSheet说明(技术参数)可看出需输入:

写指令:RS=L,RW=L,D0--D7=指令码,E=H。输出:无

写数据:RS=H,RW=L,D0--D7=指令码,E=H。输出:无

PS:状态字说明:

注意:对控制字每次进行读写操作时都必须进行读写检测,确保STA7=0。

④1602A指令说明:

1、显示模式设置

指令码:0011 1000    功能:设置LCD为16X2显示,5X7点阵,8位只数据接口。

           0000 0DCB    功能:D1=1 开显示,D1=0关显示。C1=1 显示光标,C1=0 不显示光标。B=1 光标闪烁,B=0 光标不显示。

           0000 01NS    功能:N=1 当读或写一个字符后指针加一且光标加一。N=0 当读或写一个字符后指针减一且光标减一。

                                       S=1 当写一个字符,整屏显示左移(N=1)或者右移(N=0),得到效果是光标不移动而屏幕移动的效果。

               S=0当写一个字符时,屏幕不移动。

2、数据指针设置:80H+地址码。 需要注意的是前面要加上一个80H。

3、其他设置:01H:数据指针清0,所有数据显示清0。

                  02H:数据指针清0。

 

二:实验原理图:

  为了更好的让大家明白第三部分的程序,以下是电路图:

  

三、程序源码:

  1 #include<reg52.h>  
  2 #include<intrins.h>    
  3 //宏定义
  4 #define uchar unsigned char
  5 #define uint unsigned int
  6 
  7 //dula  wela与本实验无关、由于外接了数码管所以为了让1602有足够电压所以需禁用数码管    
  8 sbit dula=P2^6;      
  9 sbit wela=P2^7;
 10 //分别定义了1602的使能,数据/命令选择,读写选择管脚
 11 sbit lcden=P3^4;
 12 sbit lcdrs=P3^5;
 13 sbit lcdrw=P3^6;
 14 //读写检测位(详见状态字说明)
 15 sbit sta7=P0^7;
 16 //定义了4个按钮来实现调整时间的功能(S1:选择按钮,S2:上调,S3:下调,S4:计时停止)
 17 sbit s1=P3^0;
 18 sbit s2=P3^1;
 19 sbit s3=P3^2;
 20 sbit s4=P3^3;
 21 //1602第一行要显示的数据
 22 uchar code string[]={"2013-05-15 THI"};
 23 //1602第二行显示的数据
 24 uchar code string1[]={"00-00-00"};
 25 uchar count,shi,fen,miao,keynum;
 26 
 27 //延时函数                              
 28 void delay(uchar ms)
 29 {
 30    uint x,y;
 31    for(x=ms;x>0;x--)
 32    {
 33            for(y=110;y>0;y--);
 34    }
 35 }
 36 
 37 //判断是否可以对1602进行读写操作
 38 uchar BusyTest()
 39 {
 40     bit result;
 41     lcdrs=0;
 42     lcdrw=1;
 43     lcden=1;
 44     _nop_();
 45     _nop_();
 46     _nop_();
 47     _nop_();
 48     result=sta7;
 49     lcden=0;
 50     return result;
 51 }
 52 
 53 //向1602写命令
 54 void WriteInstruction(uchar instruction)
 55 {
 56     while(BusyTest()==1);//可读写判断
 57     lcdrs=0;
 58     lcdrw=0;
 59     lcden=0;
 60 
 61     _nop_();
 62     _nop_();
 63 
 64     P0=instruction;
 65 
 66     _nop_();
 67     _nop_();
 68     _nop_();
 69     _nop_(); 
 70      
 71     lcden=1;
 72 
 73     _nop_();
 74     _nop_();
 75     _nop_();
 76     _nop_(); 
 77 
 78     lcden=0;
 79 }
 80 
 81 //向1602写数据
 82 void WriteData(uchar Data)
 83 {
 84     while(BusyTest()==1);//可读写判断
 85     lcdrs=1;
 86     lcdrw=0;
 87     lcden=0;
 88 
 89     _nop_();
 90     _nop_();
 91 
 92     P0=Data;
 93 
 94     _nop_();
 95     _nop_();
 96     _nop_();
 97     _nop_(); 
 98      
 99     lcden=1;
100 
101     _nop_();
102     _nop_();
103     _nop_();
104     _nop_(); 
105 
106     lcden=0;    
107 }
108 
109 //102初始化
110 void Initiate()
111 {
112     P0=1;
113     dula=0;
114     wela=0;
115     delay(15);
116     WriteInstruction(0x38);//显示模式设置
117     delay(5);
118     WriteInstruction(0x38);//显示模式设置
119     delay(5);
120     WriteInstruction(0x38);//显示模式设置
121     delay(5);
122     WriteInstruction(0x0c);//开显示,不显示光标
123     delay(5);
124     WriteInstruction(0x06);//读写一个字符后地址指针加1,光标加1
125     delay(5);
126     WriteInstruction(0x01);//数据指针清0,显示清0
127     delay(5);
128 }                                              
129 
130 //显示时分秒
131 void write_sfm(uchar add,uchar Data)
132 {  
133     uchar shi,ge;
134     shi=Data/10;
135     ge=Data%10;
136     WriteInstruction(0x80+0x44+add); //确定起始光标位置。      
137     WriteData(0x30+shi);             //写入十位     注:0的字符时0x30   详细见附件:字符手册
138     WriteData(0x30+ge);                 //写入个位
139 }
140 
141 //搜索按下的按键,来确定光标的显示位置 ,一般的逻辑控制没什么好说的
142 void keyscan()
143 {
144     lcdrs=0;
145     if(s1==0)
146     {
147         delay(5);
148         if(s1==0)
149         {
150             while(!s1);    //按键去抖
151             keynum++;
152             TR0=0;
153             if(keynum==4)
154             {
155                 keynum=1;
156             }
157             if(keynum==1)
158             {
159                 WriteInstruction(0x80+0x44+7);    
160             }
161             if(keynum==2)
162             {
163                 WriteInstruction(0x80+0x44+4);    
164             }
165             if(keynum==3)
166             {
167                 WriteInstruction(0x80+0x44+1);
168             }
169 
170             WriteInstruction(0x0f);
171         }
172     }
173     
174     if(s2==0)
175     {
176         delay(5);
177         if(s2==0)
178         {
179             while(!s2);
180             if(keynum==1)
181             {
182                 miao++;
183                 if(miao==60)
184                 {
185                     miao=0;
186                 }
187                 WriteInstruction(0x80+0x44+7);
188                 write_sfm(6,miao);
189             }
190             if(keynum==2)
191             {
192                 fen++;
193                 if(fen==60)
194                 {
195                     fen=0;
196                 }
197                 WriteInstruction(0x80+0x44+4);
198                 write_sfm(3,fen);    
199             }
200             if(keynum==3)
201             {
202                 shi++;
203                 if(shi==24)
204                 {
205                     shi=0;
206                 }
207                 WriteInstruction(0x80+0x44+1);    
208                 write_sfm(0,shi);
209             }
210         }
211     }
212 
213     if(s3==0)
214     {
215         delay(5);
216         if(s3==0)
217         {
218             while(!s3);
219             if(keynum==1)
220             {
221                 if(miao==0)
222                 {
223                     miao=59;
224                 }
225                 else
226                 {
227                     miao--;
228                 }
229                 WriteInstruction(0x80+0x44+7);
230                 write_sfm(6,miao);
231             }
232             if(keynum==2)
233             {
234                 if(fen==0)
235                 {
236                     fen=59;
237                 }
238                 else
239                 {
240                     fen--;
241                 }
242                 WriteInstruction(0x80+0x44+4);
243                 write_sfm(3,fen);    
244             }
245             if(keynum==3)
246             {
247                 if(shi==0)
248                 {
249                     shi=23;
250                 }
251                 else
252                 {
253                     shi--;
254                 }
255                 WriteInstruction(0x80+0x44+1);    
256                 write_sfm(0,shi);
257             }
258         }
259     }
260 
261     if(s4==0)
262     {
263         delay(5);
264         if(s4==0);
265         while(!s4);
266         keynum=0;
267         WriteInstruction(0x0c);
268         TR0=1;
269     }
270 }
271 
272 
273 void main()
274 {
275     //LCD显示初始值
276     uchar i;
277     Initiate();
278     delay(10);
279     i=0;
280     WriteInstruction(0x80+0x01);
281     while(string[i]!='\0')
282     {
283         WriteData(string[i]);
284         i++;
285         delay(10);    
286     }
287     WriteInstruction(0x80+0x44);
288     i=0;
289     while(string1[i]!='\0')
290     {291         WriteData(string1[i]);
292         i++;
293         delay(10);    
294     }
295 
296    //设置定时器
297     TMOD=0x01;
298     TH0=(65536-50000)/256;
299     TL0=(65536-50000)%256;
300     EA=1;
301     ET0=1;
302     TR0=1;
303 
304     while(1) 
305     {
306         keyscan();
307         if(count==20)
308         {
309             count=0;
310             miao++;
311             if(miao==60)
312             {
313                 miao=0;
314                 fen++;
315                 if(fen==60)
316                 {
317                     fen=0;
318                     shi++;
319                     if(shi==24)
320                     {
321                         shi=0;
322                     }
323                 }
324             }
325             write_sfm(6,miao);
326             write_sfm(3,fen);
327             write_sfm(0,shi);
328         }
329     }
330 }
331 
332 //计数器50ms
333 void timer0() interrupt 1
334 {
335     TH0=(65536-50000)/256;
336     TL0=(65536-50000)%256;
337     count++;    
338 }
View Code

附:字符手册:

 

          

 

转载于:https://www.cnblogs.com/hello-jackie/archive/2013/05/25/3085543.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅 | 中国工程院提出新一代智能制造

来源&#xff1a;WPR近日&#xff0c;中国工程院院刊《Engineering》推出最新观点性文章“走向新一代智能制造”&#xff0c;作者周济、李培根、周艳红等&#xff0c;文章指出智能制造是一个不断演进发展的大概念&#xff0c;可归纳为三个基本范式&#xff1a;数字化制造、数字…

C# Obsolete

Obsolete 属性将某个程序实体标记为一个建议不再使用的实体。每次使用被标记为已过时的实体时&#xff0c;随后将生成警告或错误&#xff0c;这取决于属性是如何配置的。例如&#xff1a; 上面在Main函数中调用&#xff0c;只产生了一个警告的信息。 如果将MyObsolete类中的Get…

Android之事件分发机制

本文主要包括以下内容 view的事件分发viewGroup的事件分发 首先来看两张图 在执行touch事件时 首先执行dispatchTouchEvent方法&#xff0c;执行事件分发。再执行onInterceptTouchEvent方法&#xff0c;判断是否中断事件&#xff0c;返回true时中断&#xff0c;执行自己的on…

Android屏幕适配总结

重要概念 什么是屏幕尺寸、屏幕分辨率、屏幕像素密度&#xff1f; 什么是dp、dip、dpi、sp、px&#xff1f;他们之间的关系是什么&#xff1f; 什么是mdpi、hdpi、xdpi、xxdpi&#xff1f;如何计算和区分&#xff1f; 在下面的内容中我们将介绍这些概念。 屏幕尺寸 屏幕…

突然开掉CEO!通用电气时隔一年再换帅,金融和工业互联网都救不了GE?

资料来源&#xff1a;GE官网、华尔街见闻、腾讯新闻《一线》物联网智库 整理发布摘要&#xff1a;在统帅了通用仅仅14个月之后&#xff0c;John Flannery就被他的继任者Lawrence Culp取代&#xff0c;而Culp也将立刻走马上任&#xff0c;成为通用电气&#xff08;GE&#xff09…

美法加三位科学家获2018诺贝尔物理学奖

来源&#xff1a;科学网北京时间10月2日下午5时52分&#xff0c;2018年诺贝尔物理学奖揭晓。获奖者为美国科学家阿瑟阿什金&#xff08;Arthur Ashkin&#xff09;、法国科学家热拉尔穆鲁&#xff08;Gerard Mourou&#xff09;和加拿大科学家唐娜斯特里克兰&#xff08;Donna …

Android自定义progressBar

通过继承系统ProgressBar实现 效果图 实现 HorizontalProgressBarWithNumber 自定义属性 <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable name"HorizontalProgressBarWithNumber"><attr name&…

干货分享:自动驾驶核心技术进展之车用毫米波雷达

来源&#xff1a;智车科技摘要&#xff1a;电动化、智能化、网联化、共享化是汽车未来发展的大势。伴随着这一趋势&#xff0c;自动驾驶汽车应用而生&#xff0c;且国内很多自动驾驶研发企业快速成长。“自动驾驶”等相关热词也一直是行业关注的焦点。为了让中国汽车行业的机构…

Android主题换肤实现

本系列文章主要是对一个Material Design的APP的深度解析&#xff0c;主要包括以下内容 基于Material Design Support Library作为项目整体框架。对应博文&#xff1a;Android Material Design 兼容库的使用详解RecyclerView的万能适配器。对应博文:打造一个RecyclerView的万能…

windows下MBCS和UNICODE编码的转换

1. 从MBCS转到UNICODE 方法a&#xff09; 直接调用windows api char name[100] "大鳄.hxboar";wchar_t wname[100];//setlocale(LC_ALL, "chinese"); int nLen MultiByteToWideChar(CP_ACP, 0,name, -1, NULL, NULL);MultiByteToWideChar(CP_ACP, 0, name…

ShareSDK集成微信、QQ、微博分享

1、前言 为什么要使用第三方的作为集成分享的工具呢&#xff1f;而不去用官方的呢&#xff1f;有什么区别么&#xff1f; 一个字”快”&#xff0c;如果你使用官方的得一个个集成他们的SDK&#xff0c;相信这是一个痛苦的过程。 2、准备需要分享的各个平台的key 这个需要…

深度|一篇文章解读人工智能的原理及产业升级机会

来源&#xff1a;人工智能腾讯数码摘要&#xff1a;人工智能看上去高高在上&#xff0c;实际上前沿科技公司都寄希望于这种长期研究为其目前的业务带来新的发展机会&#xff0c;神经网络、机器学习、深度学习构建了人工智能基础&#xff0c;本文阐述了三大基础是如何运作和实现…

可自由扩展的圆角矩形制作方法

转自&#xff1a;http://golen.blog.sohu.com/96114249.html 制作一个好的web标准站点,扩展性要多考虑,扩展性做的好的网站,会给后期的维护和升级会带来很大的方便.现在总结一下我做web以来,可扩展的圆角矩形的制作方法:方法一:命名:round.gif: 代码如下: <!DOCTYPE html PU…

GE刚刚换帅,就向艾默生出售智能平台业务?刚刚换帅,GE又向艾默生出售智能平台业务,未来究竟何去何从?...

来源&#xff1a;路透社、知识自动化等物联网智库 整理发布摘要&#xff1a;智能平台出售背后&#xff0c;GE和艾默生各自有何打算&#xff1f;GE多事之秋能否迎来回春转机&#xff1f;昨晚&#xff0c;据消息&#xff1a;艾默生电气公司(Emerson Electric)同意收购通用电气&am…

豆瓣加载动画实现

最终效果如下 ValueAnimator类API 简介 ofFloat(float… values) 构建ValueAnimator&#xff0c;设置动画的浮点值&#xff0c;需要设置2个以上的值setDuration(long duration) 设置动画时长&#xff0c;默认的持续时间为300毫秒。setInterpolator(TimeInterpolator value) 设…

下一次 IT 变革:边缘计算(Edge computing)

来源&#xff1a;云头条摘要&#xff1a;外媒 ZDnet 发布了此篇边缘计算领域的重要文章&#xff0c;详细分析了各机构不同的定义、市场状况、前景等&#xff0c;经编译&#xff0c;供各位参考数十亿物联网设备和5G网络这两股力量必将推动计算工作负载的部署方式发生深远而重大的…

WebService入门

webservice 的概念&#xff0c;解决什么问题&#xff1f; webservice 就是一个应用程序&#xff0c;它提供一种通过web 方式访问的api. 解决两个系统或者&#xff08;应用程序&#xff09;之间的远程调用….. 调用是跨语言&#xff0c;跨平台… webservice 最基本的组成部分…

Google联手Facebook 要在AI研究上搞什么大事?

来源&#xff1a;网易智能 摘要&#xff1a;Google和Facebook宣布&#xff0c;使开源机器学习框架PyTorch与Tensor-Processing Units&#xff08;TPU&#xff09;进行合作。这种伙伴关系标志着人工智能研究合作进入新时代。“今天&#xff0c;我们很高兴地宣布&#xff0c;Goog…

WebService之CXF框架

本文主要包括以下内容 ant工具的使用利用cxf实现webservicecxf与spring整合 ajax访问webservice ant 工具 1、为什么要用到ant这个工具呢&#xff1f; Ant做为一种工具已经广泛被使用&#xff0c;并且历史悠久。 使用ant的内置命令&#xff0c;可以编译java源文件(javac)…

Java之IO操作总结

所谓IO&#xff0c;也就是Input与Output的缩写。在java中&#xff0c;IO涉及的范围比较大&#xff0c;这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是&#xff1a; 字符流字节流 其中&#xff0c;字符流有两个抽象类&…