📄 dzb.lst
字号:
C51 COMPILER V6.12 DZB 01/13/2009 19:14:52 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DZB
OBJECT MODULE PLACED IN .\dzb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\dzb.c DEBUG OBJECTEXTEND
stmt level source
1 /*
2 这是我看了《十天学会单片机》(郭天祥的教程)第十课时写的,综合了矩阵键盘,串口通信,数码管
3 动态显示,定时器中断的简单时钟程序。用51电子网买的298元80C51单片机学习板
4 (http://www.51dz.com/n.asp?id=12519&i=xie343706382)测试时请将p1口用排线连到CZ2上,控制8位
5 数码管用。P0口用来检测矩阵键盘的,P3.0和P3.1是串口通信用,控制74H164N芯片段选8位数码管。
6 数码管显示内容为时分秒个两位,按下K16为设置按钮,按一下调节秒数,再按一下调节分钟,再按一
7 下调节小时。再按下退出,走时。调节时按K1至K10分别代表0到9。
8 我的QQ343706382,希望有喜欢单片机的朋友。和我联系。
9
10
11 */
12
13 #include <reg51.h>
14 #include <intrins.h>
15 #define uchar unsigned char//宏定义字符型
16 #define uint unsigned int//宏定义长整型
17 uchar temp,num,keyzhi;//定义两个变量
18 //keyzhi,是键盘返回值用来判断按下什么键子了temp和num也是键盘扫描用的临时变量
19 uchar code table[]={//定义字串数组数码管显示用分别是 0123456789.和全灭,这个数码管是共阳极的
20 0x12,0xfa,0x1c,0x98,
21 0xf0,0x91,0x11,0xda,
22 0x10,0x90,0xef,0xff};
23
24 uchar code table2[]={//字串数组 数码管段位用,通74HC164N芯片控制8个数码管,的段显示
25 0x80,0x40,0x20,0x10,
26 0x08,0x04,0x02,0x01};
27
28
29 uint count,gnj,wz;//count,用来计算时间,count++18次是一秒。
30 //gnj,功能键值gnj值为1,设置秒数,为2,设置分钟,为3设置小时。
31
32 char miao,shi,fen;//分别代表秒,时,分。
33
34 //变量定义结束
35
36
37 void delay()//延时函数,很短的延时
38 { ;; }
39
40 void delay1(uint x)//延时函数
41 {
42 1 uint a,b;
43 1 for(a=x;a>0;a--)for(b=110;b>0;b--);
44 1 }
45
46 void xianshi(uchar s,uchar f,uchar m)//显示函数,显示格式为,小时,分钟,秒
47 {
48 1 uint ssw,sgw,fsw,fgw,msw,mgw;//分别代表小时,分钟,秒钟的十位和个位
49 1 if(m>59)//如果秒数大于59,就显示光标 点闪烁
50 1 {
51 2 if(wz==1)
52 2 {
53 3 msw=10;
54 3 mgw=miao%10;
55 3 }
C51 COMPILER V6.12 DZB 01/13/2009 19:14:52 PAGE 2
56 2 else
57 2 {
58 3 msw=miao/10;
59 3 mgw=10;
60 3 }
61 2 }
62 1 else
63 1 {
64 2 msw=m/10;
65 2 mgw=m%10;
66 2 }
67 1
68 1 if(f>59)
69 1 {
70 2 if(wz==1)
71 2 {
72 3 fsw=10;
73 3 fgw=fen%10;
74 3 }
75 2 else
76 2 {
77 3 fsw=fen/10;
78 3 fgw=10;
79 3 }
80 2 }
81 1 else
82 1 {
83 2 fsw=f/10;
84 2 fgw=f%10;
85 2 }
86 1
87 1 if(s>24)
88 1 {
89 2 if(wz==1)
90 2 {
91 3 ssw=10;
92 3 sgw=shi%10;
93 3 }
94 2 else
95 2 {
96 3 ssw=shi/10;
97 3 sgw=10;
98 3 }
99 2 }
100 1 else
101 1 {
102 2 ssw=s/10;
103 2 sgw=s%10;
104 2 }
105 1 REN=1;//打开74H164N芯片写入口
106 1 SBUF=table2[0];//发送数据,数码管第一位亮
107 1 delay();
108 1 P1=table[ssw];//显示小时的十位
109 1 delay1(3);
110 1 P1=0xff; //消除数码管光影。
111 1 SBUF=table2[1];
112 1 delay();
113 1 P1=table[sgw];//小时的个位
114 1 delay1(3);
115 1 P1=0xff;
116 1
117 1 SBUF=table2[2];
C51 COMPILER V6.12 DZB 01/13/2009 19:14:52 PAGE 3
118 1 delay();
119 1 P1=table[fsw];
120 1 delay1(3);
121 1 P1=0xff;
122 1 SBUF=table2[3];
123 1 delay();
124 1 P1=table[fgw];
125 1 delay1(3);
126 1 P1=0xff;
127 1
128 1 SBUF=table2[4];
129 1 delay();
130 1 P1=table[msw];
131 1 delay1(3);
132 1 P1=0xff;
133 1 SBUF=table2[5];
134 1 delay();
135 1 P1=table[mgw];
136 1 delay1(3);
137 1 P1=0xff;
138 1
139 1 /* SBUF=table2[6];//调试时用的,
140 1 delay();
141 1 P1=table[gnj];//显示功能键的值
142 1 delay1(3);
143 1 P1=0xff;
144 1 SBUF=table2[7];
145 1 delay();
146 1 P1=table[keyzhi];//显示按键的值
147 1 delay1(3);
148 1 P1=0xff;
149 1 */
150 1 REN=0;
151 1 }
152
153
154
155
156
157
158 uchar keyscan() //键盘扫描程序 利用P0口的4×4的矩阵键盘。
159 {
160 1 P0=0xfe;
161 1 temp=P0;
162 1 num=0;
163 1 if (temp!=0xfe)
164 1 {
165 2 delay1(5);
166 2 temp=P0;
167 2 if (temp!=0xfe)
168 2 {
169 3 switch(temp)
170 3 {
171 4 case 0xee:num=16;
172 4 break;
173 4 case 0xde:num=12;
174 4 break;
175 4 case 0xbe:num=8;
176 4 break;
177 4 case 0x7e:num=4;
178 4 break;
179 4 }
C51 COMPILER V6.12 DZB 01/13/2009 19:14:52 PAGE 4
180 3
181 3
182 3 }
183 2 while(temp!=0xfe){temp=P0;}
184 2
185 2 }
186 1
187 1 if (num==16)//判断是否要调整时间
188 1 {
189 2 gnj++;
190 2 if(gnj==4)gnj=0;
191 2 num=0;
192 2 TR0=0;//关定时器
193 2 }
194 1 P0=0xfd;
195 1 temp=P0;
196 1 if (temp!=0xfd)
197 1 {
198 2 delay1(5);
199 2 temp=P0;
200 2 if (temp!=0xfd)
201 2 {
202 3 switch(temp)
203 3 {
204 4 case 0xed:num=15;
205 4 break;
206 4 case 0xdd:num=11;
207 4 break;
208 4 case 0xbd:num=7;
209 4 break;
210 4 case 0x7d:num=3;
211 4 break;
212 4 }
213 3 }
214 2 while(temp!=0xfd){temp=P0;}
215 2
216 2 }
217 1
218 1 P0=0xfb;
219 1 temp=P0;
220 1 if (temp!=0xfb)
221 1 {
222 2 delay1(5);
223 2 temp=P0;
224 2 if (temp!=0xfb)
225 2 {
226 3 switch(temp)
227 3 {
228 4 case 0xeb:num=14;
229 4 break;
230 4 case 0xdb:num=10;
231 4 break;
232 4 case 0xbb:num=6;
233 4 break;
234 4 case 0x7b:num=2;
235 4 break;
236 4 }
237 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -