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