📄 led_time.lst
字号:
C51 COMPILER V7.50 LED_TIME 10/20/2007 15:12:15 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LED_TIME
OBJECT MODULE PLACED IN led_time.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE led_time.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * *
3 * File : led_time.c *
4 * Date : 2007-09-10 *
5 * Version : 1.0 *
6 * Powerd by : shenyae86 QQ:184676957 *
7 ********************************************************************************
8 * Descriptoon: *
9 * LED数码管显示时钟程序 *
10 * 操作顺序: *
11 * 1.延时 启动等待 约400MS 待显示器进入工作状态 *
12 * 2.LCDInit(); 显示器初始化 清屏... *
13 * 3.延时片刻 约5MS 可不要 *
14 * 4.写入字符 检测是否忙 继续写入 *
15 * *
16 * --- 管脚名 ---------- 管脚端口 ---- 变量名 --------- *
17 * RW P26 LCD_RW pin4 *
18 * RS P27 LCD_RS pin5 *
19 * 使能端 P25 LCD_E pin6 *
20 * 背光正 P21 LCD_light pin15 *
21 * 数据 P0 LCD_Data pin7-14 *
22 * *
23 *******************************************************************************/
24
25 // AN1---时调整
26 // AN2---分调整
27 // 上电时初始化显示: 12-00-00
28 #include <reg51.h>
29 #include <intrins.h>
30
31 unsigned char data dis_digit;
32 unsigned char key_s, key_v;
33 unsigned int i;
34 unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
35 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
36 unsigned char data dis_buf[8];
37 unsigned char data dis_index;
38 unsigned char hour,min,sec;
39 unsigned char sec100,bell_flag;
40 sbit AN1 = P3^4;
41 sbit AN2 = P3^5;
42 sbit AN3 = P3^2;
43 sbit AN4 = P3^3;
44 sbit led = P3^6;
45 sbit bell= P3^7;
46 bit scan_key();
47 void proc_key();
48 void inc_sec();
49 void inc_min();
50 void inc_hour();
51 void display();
52 void delayms(unsigned char ms);
53
54 void main(void)
55 {
C51 COMPILER V7.50 LED_TIME 10/20/2007 15:12:15 PAGE 2
56 1 P1 = 0xff;
57 1 P2 = 0xff;
58 1 TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
59 1 TH0 = 0xD8;
60 1 TL0 = 0XEF;
61 1 bell_flag=0;
62 1 TH1 = 0xFC;
63 1 TL1 = 0x17;
64 1 hour = 12;
65 1 min = 00;
66 1 sec = 00;
67 1 bell=1;
68 1 sec100 = 0;
69 1 dis_buf[0] = 0xbf; // 显示"-"
70 1 dis_buf[1] = 0xbf; // 显示"-"
71 1 dis_buf[2] = 0xff; // 秒十位
72 1 dis_buf[3] = dis_code[sec % 10]; // 秒个位
73 1 dis_buf[4] = dis_code[hour / 10]; // 时十位
74 1 dis_buf[5] = dis_code[hour % 10]& 0x7f; // 时个位
75 1 dis_buf[6] = dis_code[min / 10]; // 分十位
76 1 dis_buf[7] = dis_code[min % 10]; // 分个位
77 1 dis_digit = 0xfe;
78 1 dis_index = 0;
79 1 IE = 0x8a; // 使能timer0,1 中断
80 1 TR0 = 1;
81 1 TR1 = 1;
82 1
83 1 key_v = 0x03;//11b
84 1 dis_digit = _crol_(dis_digit,4); // 位选通值左移, 下次按键时左移一位
85 1 while(1)
86 1 {
87 2 if(scan_key())
88 2 {
89 3 delayms(10);
90 3 if(scan_key())
91 3 {
92 4 key_v = key_s;
93 4 proc_key();
94 4 }
95 3 }
96 2 if(AN3==0)
97 2 {
98 3 delayms(200);
99 3 if(AN3==0)
100 3 dis_digit = _crol_(dis_digit,4); // 位选通值左移, 下次按键时左移一位
101 3 }
102 2 }
103 1 }
104
105 bit scan_key()
106 {
107 1 key_s = 0x00;
108 1 key_s |= AN2;
109 1 key_s <<= 1;
110 1 key_s |= AN1;
111 1 return(key_s ^ key_v);
112 1 }
113
114 void proc_key()
115 {
116 1 EA = 0;
117 1 if((key_v & 0x01) == 0) // AN1
C51 COMPILER V7.50 LED_TIME 10/20/2007 15:12:15 PAGE 3
118 1 {
119 2 inc_hour();
120 2 }
121 1 else if((key_v & 0x02) == 0) // AN2
122 1 {
123 2 min++;
124 2 if(min > 59)
125 2 {
126 3 min = 0;
127 3 }
128 2 dis_buf[6] = dis_code[min / 10]; // 分十位
129 2 dis_buf[7] = dis_code[min % 10]; // 分个位
130 2 }
131 1
132 1 EA = 1;
133 1 }
134
135 void timer1() interrupt 3
136 // 定时器0中断服务程序, 用于数码管的动态扫描
137 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
138 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
139 // 选通P2.0口数码管
140 // dis_buf --- 显于缓冲区基地址
141 {
142 1 TH1 = 0xFC;
143 1 TL1 = 0x17;
144 1
145 1 P2 = 0xff; // 先关闭所有数码管
146 1 P1 = dis_buf[dis_index]; // 显示代码传送到P0口
147 1 P2 = dis_digit; //
148 1
149 1 dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
150 1 dis_index++; //
151 1
152 1 dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
153 1 }
154
155 void timer0() interrupt 1
156 {
157 1 TH0 = 0xd8;
158 1 TL0 = 0xEF;
159 1 sec100++;
160 1 if(hour==7)
161 1 {
162 2 if(min==15)
163 2 bell_flag=1;
164 2 }
165 1 else
166 1 bell=1;
167 1 if(sec100%50==0)
168 1 {
169 2 led=~led;
170 2 if(bell_flag==1)
171 2 {
172 3 bell=~bell;
173 3 i++;
174 3 if(i>6000) {bell_flag=0;i=0;}//报警时间次数到,关闭状态,次数清零
175 3 }
176 2 if(dis_buf[5]>127)
177 2 dis_buf[5]&=0x7f;
178 2 else
179 2 dis_buf[5]|=0x80;
C51 COMPILER V7.50 LED_TIME 10/20/2007 15:12:15 PAGE 4
180 2 }
181 1 if(sec100 >= 100)
182 1 {
183 2 sec100 = 0;
184 2 inc_sec();
185 2 }
186 1 }
187
188 void inc_sec()
189 {
190 1 sec++;
191 1 if(sec > 59)
192 1 {
193 2 sec = 0;
194 2 inc_min();
195 2 }
196 1 dis_buf[0] = dis_code[sec / 10]; // 秒十位
197 1 dis_buf[1] = dis_code[sec % 10]; // 秒个位
198 1 }
199
200 void inc_min()
201 {
202 1 min++;
203 1 if(min > 59)
204 1 {
205 2 min = 0;
206 2 inc_hour();
207 2 }
208 1 dis_buf[6] = dis_code[min / 10]; // 分十位
209 1 dis_buf[7] = dis_code[min % 10]; // 分个位
210 1 }
211
212 void inc_hour()
213 {
214 1 hour++;
215 1 if(hour > 23)
216 1 {
217 2 hour = 0;
218 2 }
219 1 if(hour > 9)
220 1 dis_buf[4] = dis_code[hour / 10]; // 时十位
221 1 else
222 1 dis_buf[4] = 0xc0; // 当小时的十位为0时不显示
223 1 dis_buf[5] = dis_code[hour % 10]& 0x7f; // 时个位
224 1
225 1 }
226
227 void delayms(unsigned char ms)
228 // 延时子程序
229 {
230 1 unsigned char i;
231 1 while(ms--)
232 1 {
233 2 for(i = 0; i < 120; i++);
234 2 }
235 1 }
236
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 610 ----
CONSTANT SIZE = 11 ----
C51 COMPILER V7.50 LED_TIME 10/20/2007 15:12:15 PAGE 5
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 ----
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 + -