📄 1602.lst
字号:
C51 COMPILER V8.02 1602 08/14/2013 16:25:11 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h> //包含单片机寄存器的头文件
2 #include<intrins.h> //包含_nop_()函数定义的头文件
3 sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
4 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
5 sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
6 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
7
8 sbit set_H=P2^5; //调整小时按键
9 sbit set_M=P2^6; //调整分
10 sbit set_S=P2^7; //调整秒
11
12
13 unsigned char hour=12,minite=0,second=0,mscnt;
14 //hour=12;
15 //minite=0;
16 //second=0;
17
18 /*****************************************************
19 函数功能:延时1ms
20 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
21 ***************************************************/
22 void delay1ms()
23 {
24 1 unsigned char i,j;
25 1 for(i=0;i<10;i++)
26 1 for(j=0;j<33;j++);
27 1 }
28 /*****************************************************
29 函数功能:延时若干毫秒
30 入口参数:n
31 ***************************************************/
32 void delay(unsigned char n)
33 {
34 1 unsigned char i;
35 1 for(i=0;i<n;i++)
36 1 delay1ms();
37 1 }
38 /*****************************************************
39 函数功能:判断液晶模块的忙碌状态
40 返回值:result。result=1,忙碌;result=0,不忙
41 ***************************************************/
42 unsigned char BusyTest(void)
43 {
44 1 bit result;
45 1 RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
46 1 RW=1;
47 1 E=1; //E=1,才允许读写
48 1 _nop_(); //空操作
49 1 _nop_();
50 1 _nop_();
51 1 _nop_(); //空操作四个机器周期,给硬件反应时间
52 1 result=BF; //将忙碌标志电平赋给result
53 1 E=0;
54 1 return result;
55 1 }
C51 COMPILER V8.02 1602 08/14/2013 16:25:11 PAGE 2
56 /*****************************************************
57 函数功能:将模式设置指令或显示地址写入液晶模块
58 入口参数:dictate
59 ***************************************************/
60 void WriteInstruction (unsigned char dictate)
61 {
62 1 while(BusyTest()==1); //如果忙就等待
63 1 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
64 1 RW=0;
65 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
66 1 // 就是让E从0到1发生正跳变,所以应先置"0"
67 1 _nop_();
68 1 _nop_(); //空操作两个机器周期,给硬件反应时间
69 1 P0=dictate; //将数据送入P0口,即写入指令或地址
70 1 _nop_();
71 1 _nop_();
72 1 _nop_();
73 1 _nop_(); //空操作四个机器周期,给硬件反应时间
74 1 E=1; //E置高电平
75 1 _nop_();
76 1 _nop_();
77 1 _nop_();
78 1 _nop_(); //空操作四个机器周期,给硬件反应时间
79 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
80 1 }
81 /*****************************************************
82 函数功能:指定字符显示的实际地址
83 入口参数:x
84 ***************************************************/
85 void WriteAddress(unsigned char x)
86 {
87 1 WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
88 1 }
89 /*****************************************************
90 函数功能:将数据(字符的标准ASCII码)写入液晶模块
91 入口参数:y(为字符常量)
92 ***************************************************/
93 void WriteData(unsigned char y)
94 {
95 1 while(BusyTest()==1);
96 1 RS=1; //RS为高电平,RW为低电平时,可以写入数据
97 1 RW=0;
98 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
99 1 // 就是让E从0到1发生正跳变,所以应先置"0"
100 1 P0=y; //将数据送入P0口,即将数据写入液晶模块
101 1 _nop_();
102 1 _nop_();
103 1 _nop_();
104 1 _nop_(); //空操作四个机器周期,给硬件反应时间
105 1 E=1; //E置高电平
106 1 _nop_();
107 1 _nop_();
108 1 _nop_();
109 1 _nop_(); //空操作四个机器周期,给硬件反应时间
110 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
111 1 }
112 /*****************************************************
113 函数功能:对LCD的显示模式进行初始化设置
114 ***************************************************/
115 void LcdInitiate(void)
116 {
117 1 delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
C51 COMPILER V8.02 1602 08/14/2013 16:25:11 PAGE 3
118 1 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
119 1 delay(5); //延时5ms
120 1 WriteInstruction(0x38);
121 1 delay(5);
122 1 WriteInstruction(0x38);
123 1 delay(5);
124 1 WriteInstruction(0x0c); //显示模式设置:显示开,无光标
125 1 delay(5);
126 1 WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
127 1 delay(5);
128 1 WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
129 1 delay(5);
130 1 }
131
132 void int_T0(void) interrupt 1
133 {
134 1 TH0=-5000/256;
135 1 TL0=-5000%256;
136 1 mscnt++;
137 1 if(mscnt==200)
138 1 {
139 2 second++;
140 2 if(second==60)
141 2 {
142 3 second=0;
143 3 minite++;
144 3 if(minite==60)
145 3 {
146 4 minite=0;
147 4 hour++;
148 4 if(hour==24)
149 4 {
150 5 hour=0;
151 5 }
152 4 }
153 3 }
154 2 }
155 1 }
156
157 void main(void) //主函数
158 {
159 1 unsigned char H,M,S;
160 1 LcdInitiate(); //调用LCD初始化函数
161 1 TMOD=0x01;
162 1 TH0=-5000/256;
163 1 TL0=-5000%256;
164 1 ET0=1;
165 1 TR0=1;
166 1 EA=1;
167 1 while(1)
168 1 {
169 2 //检测是否有时间调整操作
170 2 if(set_H==0)
171 2 {
172 3 delay(10);
173 3 if(set_H==0)
174 3 {
175 4 hour++;
176 4 if(hour==24)
177 4 {
178 5 hour=0;
179 5 }
C51 COMPILER V8.02 1602 08/14/2013 16:25:11 PAGE 4
180 4 while(set_H==0);
181 4 }
182 3 }
183 2 if(set_M==0)
184 2 {
185 3 delay(10);
186 3 if(set_M==0)
187 3 {
188 4 minite++;
189 4 if(minite==60)
190 4 {
191 5 minite=0;
192 5 }
193 4 }
194 3 }
195 2 if(set_S==0)
196 2 {
197 3 delay(10);
198 3 if(set_S==0)
199 3 {
200 4 second++;
201 4 if(second==60)
202 4 {
203 5 second=0;
204 5 }
205 4 }
206 3 }
207 2 WriteAddress(0x42); //将显示地址指定为第2行第2列
208 2 H=hour/10+'0';
209 2 WriteData(H); //将小时十位写入液晶模块
210 2 //字符的字形点阵读出和显示由液晶模块自动完成
211 2
212 2 //WriteAddress(0x43); //将显示地址指定为第2行第3列
213 2 H=hour%10+'0';
214 2 WriteData(H); //将小时个位写入液晶模块
215 2 //字符的字形点阵读出和显示由液晶模块自动完成
216 2
217 2 WriteAddress(0x45); //将显示地址指定为第2行第5列
218 2 H=':';
219 2 WriteData(H); //将字符常量':'写入液晶模块
220 2 //字符的字形点阵读出和显示由液晶模块自动完成
221 2
222 2 WriteAddress(0x47); //将显示地址指定为第1行第7列
223 2 M=minite/10+'0';
224 2 WriteData(M); //将分钟高位写入液晶模块
225 2 //字符的字形点阵读出和显示由液晶模块自动完成
226 2
227 2 // WriteAddress(0x48); //将显示地址指定为第1行第8列
228 2 M=minite%10+'0';
229 2 WriteData(M); //将分钟低位写入液晶模块
230 2 //字符的字形点阵读出和显示由液晶模块自动完成
231 2
232 2 WriteAddress(0x4a); //将显示地址指定为第2行第10列
233 2 H=':';
234 2 WriteData(H); //将字符常量':'写入液晶模块
235 2 //字符的字形点阵读出和显示由液晶模块自动完成
236 2
237 2 WriteAddress(0x4c); //将显示地址指定为第2行第11列
238 2 S=second/10+'0';
239 2 WriteData(S); //将秒的高位写入液晶模块
240 2 //字符的字形点阵读出和显示由液晶模块自动完成
241 2
C51 COMPILER V8.02 1602 08/14/2013 16:25:11 PAGE 5
242 2 // WriteAddress(0x4d); //将显示地址指定为第2行第12列
243 2 S=second%10+'0';
244 2 WriteData(S); //将秒的低位写入液晶模块
245 2 //字符的字形点阵读出和显示由液晶模块自动完成
246 2 delay(20);
247 2 }
248 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 440 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -