?? 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 + -