📄 shizhong.lst
字号:
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SHIZHONG
OBJECT MODULE PLACED IN shizhong.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shizhong.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //按4X4键盘的F键 进入设定状态
2 //E D 键是前后移动键
3 //C按键是调整数值按键
4 #include "reg52.h"
5 #define uchar unsigned char
6 sbit RW=P2^1;
7 sbit RS=P2^0;
8 sbit E=P2^2;
9 bit at=0;
10 uchar code shen[]={"CLOCK!"};
11 uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
12 uchar dispbuf[8],h,m,s,counter;
13
14
15
16 void delay()
17 {
18 1 uchar i;
19 1 for(i=0;i<255;i++);
20 1 }
21
22
23
24 /*******写命令**********/
25 void lcd_wmc(uchar i)
26 {
27 1
28 1 P0=i;
29 1 RS=0;
30 1 RW=0;
31 1 E=0;
32 1 delay();
33 1 E=1;
34 1 }
35
36
37
38 /*******写数据***********/
39
40 void lcd_wmd(uchar i)
41 {
42 1
43 1 P0=i;
44 1 RS=1;
45 1 RW=0;
46 1 E=0;
47 1 delay();
48 1 E=1;
49 1 }
50
51
52
53
54 /*******初始化液晶*******/
55 void lcd_init()
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 2
56 {
57 1 uchar i;
58 1 lcd_wmc(0x01);
59 1 lcd_wmc(0x38);
60 1 lcd_wmc(0x0c);
61 1 lcd_wmc(0x06);
62 1 lcd_wmc(0xc9);
63 1 for(i=0;i<6;i++)
64 1 lcd_wmd(shen[i]);
65 1 lcd_wmc(0xc0);
66 1 }
67
68
69
70
71
72 /*******更新缓冲区子程序*******/
73 void newbuf()
74 {
75 1 dispbuf[0]=s%10;
76 1 dispbuf[1]=s/10;
77 1 dispbuf[3]=m%10;
78 1 dispbuf[4]=m/10;
79 1 dispbuf[6]=h%10;
80 1 dispbuf[7]=h/10;
81 1 }
82
83
84
85 /*******显示子程序**********/
86 void disp(uchar dispadd)
87 {
88 1 uchar tmp;
89 1 lcd_wmc(dispadd);
90 1 tmp=dispbuf[7];
91 1 tmp=word[tmp];
92 1 lcd_wmd(tmp);
93 1 tmp=dispbuf[6];
94 1 tmp=word[tmp];
95 1 lcd_wmd(tmp);
96 1 tmp=dispbuf[5];
97 1 tmp=word[tmp];
98 1 lcd_wmd(tmp);
99 1 tmp=dispbuf[4];
100 1 tmp=word[tmp];
101 1 lcd_wmd(tmp);
102 1 tmp=dispbuf[3];
103 1 tmp=word[tmp];
104 1 lcd_wmd(tmp);
105 1 tmp=dispbuf[2];
106 1 tmp=word[tmp];
107 1 lcd_wmd(tmp);
108 1 tmp=dispbuf[1];
109 1 tmp=word[tmp];
110 1 lcd_wmd(tmp);
111 1 tmp=dispbuf[0];
112 1 tmp=word[tmp];
113 1 lcd_wmd(tmp);
114 1 }
115
116
117
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 3
118
119
120 /*********************键盘子程序***********************/
121
122 uchar keypro(void)
123 {
124 1 uchar scanl,scanh;
125 1 P1=0x0f;//先将所有行线拉低
126 1 if((P1&0x0f)!=0x0f) //如果列线有变化
127 1 {
128 2 delay();//延迟一段时间。
129 2 if((P1&0x0f)!=0x0f)//如果此时此刻列线还有变化,说明确实有按键按下
130 2 {
131 3 scanl=0xfe;
132 3 while((scanl&0x10)!=0)
133 3 {
134 4 P1=scanl; //给P1口赋扫描码,每次只拉低一行
135 4 if((P1&0xf0)!=0xf0) //如果判断为真,则说明找到了按键按下的行
136 4 {
137 5 scanh=(P1&0xf0)|0x0f; //计算识别码
138 5 return (~scanh)+(~scanl);
139 5 }
140 4 else scanl=(scanl<<1)|0x01; //否则依次将第二,第三,第四行拉低
141 4
142 4 }
143 3 }
144 2 }
145 1 return 0;//没有按键 按下 返回0
146 1 }
147
148
149 /********************时间调整子程序********************/
150 void adjustime()
151 {
152 1 uchar k;
153 1 static uchar add;
154 1 k=keypro();
155 1 switch(k)
156 1 {
157 2 case 0x88: if(!at){add=0xc1;EA=0;lcd_wmc(0xc1);lcd_wmc(0x0f);at=1;}
158 2 else {lcd_wmc(0xc0);lcd_wmc(0x0c);at=0;EA=1;} break;
159 2
160 2 case 0x48: if(at)
161 2 {
162 3 if(add==0xc1){add=0xc7; lcd_wmc(add);}
163 3 else {add=add-3;lcd_wmc(add);}
164 3 }
165 2 break;
166 2
167 2 case 0x28: if(at)
168 2 {
169 3 if(add==0xc7) {add=0xc1;lcd_wmc(add);}
170 3 else {add=add+3;lcd_wmc(add);}
171 3 }
172 2 break;
173 2
174 2 case 0x18: if(at)
175 2 {
176 3 if(add==0xc1) h++;
177 3 if(h==24)
178 3 h=0;
179 3 if(add==0xc4) m++;
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 4
180 3 if(m==60)
181 3 m=0;
182 3 if(add==0xc7) s++;
183 3 if(s==60)
184 3 s=0;
185 3 newbuf();
186 3 disp(0xc0);
187 3 lcd_wmc(add);
188 3 }
189 2 break;
190 2 default: break;
191 2 }
192 1 if(k!=0)
193 1 {
194 2 while((P1&0xf0)!=0xf0)
195 2 P1=0xf0;
196 2 }
197 1
198 1 }
199
200
201
202
203
204
205
206 /*********************初始化子程序**********************/
207 void init()
208 {
209 1
210 1 TMOD=0x01;
211 1 TH0=0x4c;
212 1 TL0=0x00;
213 1 EA=1;
214 1 ET0=1;
215 1 TR0=1;
216 1 counter=0;
217 1 h=12;m=0;s=0;
218 1 dispbuf[2]=10;
219 1 dispbuf[5]=10;
220 1 }
221
222
223
224
225
226
227
228 /***************************主程序************************/
229
230 void main(void)
231 {
232 1 init();
233 1 lcd_init();
234 1
235 1 while(1)
236 1 {
237 2 adjustime();
238 2 if(!at)
239 2 {
240 3 //闪烁
241 3 if(counter<10)
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 5
242 3 {
243 4 dispbuf[2]=10;
244 4 dispbuf[5]=10;
245 4 }
246 3 else
247 3 {
248 4 dispbuf[2]=11;
249 4 dispbuf[5]=11;
250 4 }
251 3 //更新显示缓冲区及调用显示程序
252 3 if(counter==0)
253 3 {
254 4 newbuf();
255 4 disp(0xc0);
256 4 }
257 3 else if(counter==10)
258 3 disp(0xc0);
259 3 }
260 2 }
261 1 }
262
263
264
265
266
267
268
269
270 /*************************定时器0的中断**********************/
271 void Time0() interrupt 1 using 2 //再次强调中断子程序执行时间越短越好
272 {
273 1 TH0=(65536-46075)/256;
274 1 TL0=(65536-46075)%256;
275 1 counter++;
276 1 if(counter==20)
277 1 {
278 2 s++;
279 2 counter=0;
280 2 if(s==60)
281 2 {
282 3 m++;
283 3 s=0;
284 3 if(m==60)
285 3 {
286 4 h++;
287 4 m=0;
288 4 if(h==24)
289 4 h=0;
290 4 }
291 3 }
292 2
293 2 }
294 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 588 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 ----
IDATA SIZE = ---- ----
C51 COMPILER V8.02 SHIZHONG 07/23/2009 11:18:19 PAGE 6
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 + -