📄 wl010.lst
字号:
C51 COMPILER V7.06 WL010 06/07/2008 09:21:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE WL010
OBJECT MODULE PLACED IN wl010.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wl010.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 * 标题: 伟纳电子ME500B单片机开发系统演示程序 - 数码管显示简易电子时钟 *
3 * 文件: wl010.C *
4 * 日期: 2004-1-5 *
5 * 版本: 1.0 *
6 * 作者: 伟纳电子 - Freeman *
7 * 邮箱: freeman@willar.com *
8 * 网站: http://www.willar.com *
9 ********************************************************************************
10 * 描述: *
11 * 简易电子时钟,LED数码管显示 *
12 * K1---时调整 *
13 * K2---分调整 *
14 * *
15 * 上电时初始化显示: 12-00-00 *
16 * *
17 * * **** **** **** **** **** *
18 * * * * * * * * * * * *
19 * * * * * * * * * * * *
20 * * **** ****** * * * * ****** * * * * *
21 * * * * * * * * * * * *
22 * * * * * * * * * * * *
23 * * **** **** **** **** **** *
24 * *
25 * *
26 ********************************************************************************
27 * 【版权】 Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
28 * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
29 *******************************************************************************/
30
31 #include <reg51.h>
32 #include <intrins.h>
33
34 unsigned char data dis_digit;
35 unsigned char key_s, key_v;
36
37 unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
38 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
39 unsigned char data dis_buf[8];
40 unsigned char data dis_index;
41 unsigned char hour,min,sec;
42 unsigned char sec100;
43
44 sbit K1 = P1^4;
45 sbit K2 = P1^5;
46
47 bit scan_key();
48 void proc_key();
49 void inc_sec();
50 void inc_min();
51 void inc_hour();
52 void display();
53 void delayms(unsigned char ms);
54
55 void main(void)
C51 COMPILER V7.06 WL010 06/07/2008 09:21:42 PAGE 2
56 {
57 1 P0 = 0xff;
58 1 P2 = 0xff;
59 1 TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
60 1 TH1 = 0xdc;
61 1 TL1 = 0;
62 1
63 1 TH0 = 0xFC;
64 1 TL0 = 0x17;
65 1
66 1 hour = 12;
67 1 min = 00;
68 1 sec = 00;
69 1
70 1 sec100 = 0;
71 1
72 1 dis_buf[0] = dis_code[hour / 10]; // 时十位
73 1 dis_buf[1] = dis_code[hour % 10]; // 时个位
74 1 dis_buf[3] = dis_code[min / 10]; // 分十位
75 1 dis_buf[4] = dis_code[min % 10]; // 分个位
76 1 dis_buf[6] = dis_code[sec / 10]; // 秒十位
77 1 dis_buf[7] = dis_code[sec % 10]; // 秒个位
78 1 dis_buf[2] = 0xbf; // 显示"-"
79 1 dis_buf[5] = 0xbf; // 显示"-"
80 1
81 1 dis_digit = 0xfe;
82 1 dis_index = 0;
83 1
84 1 TCON = 0x01;
85 1 IE = 0x8a; // 使能timer0,1 中断
86 1
87 1 TR0 = 1;
88 1 TR1 = 1;
89 1
90 1 key_v = 0x03;
91 1
92 1 while(1)
93 1 {
94 2 if(scan_key())
95 2 {
96 3 delayms(10);
97 3 if(scan_key())
98 3 {
99 4 key_v = key_s;
100 4 proc_key();
101 4 }
102 3 }
103 2
104 2 }
105 1 }
106
107 bit scan_key()
108 {
109 1 key_s = 0x00;
110 1 key_s |= K2;
111 1 key_s <<= 1;
112 1 key_s |= K1;
113 1 return(key_s ^ key_v);
114 1 }
115
116 void proc_key()
117 {
C51 COMPILER V7.06 WL010 06/07/2008 09:21:42 PAGE 3
118 1 EA = 0;
119 1 if((key_v & 0x01) == 0) // K1
120 1 {
121 2 inc_hour();
122 2 }
123 1 else if((key_v & 0x02) == 0) // K2
124 1 {
125 2 min++;
126 2 if(min > 59)
127 2 {
128 3 min = 0;
129 3 }
130 2 dis_buf[3] = dis_code[min / 10]; // 分十位
131 2 dis_buf[4] = dis_code[min % 10]; // 分个位
132 2 }
133 1
134 1 EA = 1;
135 1 }
136
137 void timer0() interrupt 1
138 // 定时器0中断服务程序, 用于数码管的动态扫描
139 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
140 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
141 // 选通P2.0口数码管
142 // dis_buf --- 显于缓冲区基地址
143 {
144 1 TH0 = 0xFC;
145 1 TL0 = 0x17;
146 1
147 1 P2 = 0xff; // 先关闭所有数码管
148 1 P0 = dis_buf[dis_index]; // 显示代码传送到P0口
149 1 P2 = dis_digit; //
150 1
151 1 dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
152 1 dis_index++; //
153 1
154 1 dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
155 1 }
156
157 void timer1() interrupt 3
158 {
159 1 TH1 = 0xdc;
160 1
161 1 sec100++;
162 1
163 1 if(sec100 >= 100)
164 1 {
165 2 sec100 = 0;
166 2 inc_sec();
167 2 }
168 1 }
169
170 void inc_sec()
171 {
172 1 sec++;
173 1 if(sec > 59)
174 1 {
175 2 sec = 0;
176 2 inc_min();
177 2 }
178 1 dis_buf[6] = dis_code[sec / 10]; // 秒十位
179 1 dis_buf[7] = dis_code[sec % 10]; // 秒个位
C51 COMPILER V7.06 WL010 06/07/2008 09:21:42 PAGE 4
180 1 }
181
182 void inc_min()
183 {
184 1 min++;
185 1 if(min > 59)
186 1 {
187 2 min = 0;
188 2 inc_hour();
189 2 }
190 1 dis_buf[3] = dis_code[min / 10]; // 分十位
191 1 dis_buf[4] = dis_code[min % 10]; // 分个位
192 1 }
193
194 void inc_hour()
195 {
196 1 hour++;
197 1 if(hour > 23)
198 1 {
199 2 hour = 0;
200 2 }
201 1 if(hour > 9)
202 1 dis_buf[0] = dis_code[hour / 10]; // 时十位
203 1 else
204 1 dis_buf[0] = 0xff; // 当小时的十位为0时不显示
205 1 dis_buf[1] = dis_code[hour % 10]; // 时个位
206 1
207 1 }
208
209
210 void delayms(unsigned char ms)
211 // 延时子程序
212 {
213 1 unsigned char i;
214 1 while(ms--)
215 1 {
216 2 for(i = 0; i < 120; i++);
217 2 }
218 1 }
219
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 494 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -