📄 4_bit_digital_clock.lst
字号:
C51 COMPILER V6.12 4_BIT_DIGITAL_CLOCK 06/26/2009 03:18:36 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 4_BIT_DIGITAL_CLOCK
OBJECT MODULE PLACED IN 4_Bit_Digital_Clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 4_Bit_Digital_Clock.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************************************/
2
3 #include <STC12C2052AD.H> //STC头文件
4
5 /**********************************************************************************************/
6 //“程序开发调试设置项”
7 #define DY_LI 9 //设置LED显示的亮度(值域:1~9)
8 #define DY_DELAY 12 //设置每一个点显示的时间长度(1~20)
9 /**********************************************************************************************/
10 sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口
11 sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口
12 sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口
13 sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口
14
15 sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口
16 sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口
17 sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口
18 sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口
19 sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口
20 sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口
21 sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口
22 sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口
23
24 //sbit DY_BEEP =P2 ^ 2; //扬声器
25 //sbit DY_KEY1 =P0 ^ 2; //按键1(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)
26 //sbit DY_KEY2 =P3 ^ 0; //按键2(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)
27 //sbit DY_KEY3 =P3 ^ 6; //按键3(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)
28
29 #define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
30 #define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000
31 #define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000
32 #define DY_P3M1SET 0xff //设置I/O口工作方式//10010100
33 data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分
-、秒和温度存放区
34 data unsigned char cou = 0; // 软计数器,对10ms时基信号累加到1s
35 data unsigned char bn;//扫描映射全局变量
36 data unsigned char KEY_BIT = 0;//按键值
37 data unsigned char DY_PWM;//显示亮度
38 data unsigned char DY_PWM2;//显示暂存
39
40
41 unsigned char code disdata[]={
42 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)
43 };
44 /*********************************************************************************************/
45 void delay (unsigned int a){ // 用于点扫描的延时
46 1 unsigned int i;
47 1 while( --a != 0){
48 2 for(i = 0; i < DY_DELAY; i++);
49 2 }
50 1 }
51 /*********************************************************************************************/
52 void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
53 1 unsigned int i;
54 1 while( --a != 0){
C51 COMPILER V6.12 4_BIT_DIGITAL_CLOCK 06/26/2009 03:18:36 PAGE 2
55 2 for(i = 0; i < 600; i++);
56 2 }
57 1 }
58 /*********************************************************************************************/
59 void dis_off (void){
60 1 P1 = ~DY_P1M1SET; //关所有显示
61 1 P3 = ~DY_P3M1SET;
62 1 delay(10-DY_PWM);
63 1 }
64 /*********************************************************************************************/
65 void displayHH1 (unsigned char d){ //第1列横向显示程序
66 1 unsigned char i;
67 1 i = d & 0x01;
68 1 if(i == 0x01){
69 2 DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
70 1 i = d & 0x02;
71 1 if(i == 0x02){
72 2 DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
73 1 i = d & 0x04;
74 1 if(i == 0x04){
75 2 DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
76 1 i = d & 0x08;
77 1 if(i == 0x08){
78 2 DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
79 1 i = d & 0x10;
80 1 if(i == 0x10){
81 2 DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
82 1 i = d & 0x20;
83 1 if(i == 0x20){
84 2 DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
85 1 i = d & 0x40;
86 1 if(i == 0x40){
87 2 DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
88 1 i = d & 0x80;
89 1 if(i == 0x80){
90 2 DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
91 1 }
92 /*********************************************************************************************/
93 void displayHH2 (unsigned char d){ //第2列横向显示程序
94 1 unsigned char i;
95 1 i = d & 0x01;
96 1 if(i == 0x01){
97 2 DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
98 1 i = d & 0x02;
99 1 if(i == 0x02){
100 2 DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
101 1 i = d & 0x04;
102 1 if(i == 0x04){
103 2 DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
104 1 i = d & 0x08;
105 1 if(i == 0x08){
106 2 DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
107 1 i = d & 0x10;
108 1 if(i == 0x10){
109 2 DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
110 1 i = d & 0x20;
111 1 if(i == 0x20){
112 2 DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
113 1 i = d & 0x40;
114 1 if(i == 0x40){
115 2 DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
116 1 i = d & 0x80;
C51 COMPILER V6.12 4_BIT_DIGITAL_CLOCK 06/26/2009 03:18:36 PAGE 3
117 1 if(i == 0x80){
118 2 DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
119 1
120 1 }
121 /*********************************************************************************************/
122 void displayHH3 (unsigned char d){ //第3列横向显示程序
123 1 unsigned char i;
124 1 i = d & 0x01;
125 1 if(i == 0x01){
126 2 DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
127 1 i = d & 0x02;
128 1 if(i == 0x02){
129 2 DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
130 1 i = d & 0x04;
131 1 if(i == 0x04){
132 2 DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
133 1 i = d & 0x08;
134 1 if(i == 0x08){
135 2 DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
136 1 i = d & 0x10;
137 1 if(i == 0x10){
138 2 DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
139 1 i = d & 0x20;
140 1 if(i == 0x20){
141 2 DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
142 1 i = d & 0x40;
143 1 if(i == 0x40){
144 2 DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
145 1 i = d & 0x80;
146 1 if(i == 0x80){
147 2 DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
148 1
149 1 }
150 /*********************************************************************************************/
151 void displayHH4 (unsigned char d){ //第4列横向显示程序
152 1 unsigned char i;
153 1 i = d & 0x01;
154 1 if(i == 0x01){
155 2 DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
156 1 i = d & 0x02;
157 1 if(i == 0x02){
158 2 DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
159 1 i = d & 0x04;
160 1 if(i == 0x04){
161 2 DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
162 1 i = d & 0x08;
163 1 if(i == 0x08){
164 2 DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
165 1 i = d & 0x10;
166 1 if(i == 0x10){
167 2 DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
168 1 i = d & 0x20;
169 1 if(i == 0x20){
170 2 DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
171 1 i = d & 0x40;
172 1 if(i == 0x40){
173 2 DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
174 1 i = d & 0x80;
175 1 if(i == 0x80){
176 2 DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
177 1 }
178 /*********************************************************************************************/
C51 COMPILER V6.12 4_BIT_DIGITAL_CLOCK 06/26/2009 03:18:36 PAGE 4
179 void diplay_data (unsigned char l,unsigned char d){
180 1 switch (l){//显示的列位置
181 2 case 1://
182 2 displayHH1(d); //将显示数据送入
183 2 break;//
184 2 case 2://
185 2 displayHH2(d); //将显示数据送入
186 2 break;//
187 2 case 3://
188 2 displayHH3(d); //将显示数据送入
189 2 break;//
190 2 case 4://
191 2 displayHH4(d); //将显示数据送入
192 2 break;//
193 2 }
194 1 }
195 /*********************************************************************************************/
196 void init (void){ //上电初始化
197 1 P1M0 = DY_P1M0SET;
198 1 P1M1 = DY_P1M1SET;
199 1 P3M0 = DY_P3M0SET;
200 1 P3M1 = DY_P3M1SET;
201 1 ////
202 1 dis_off();
203 1 DY_PWM = DY_LI;
204 1 ////
205 1 TMOD = 0x11; // 定时/计数器0,1工作于方式1
206 1 TH0 = 0x3c; // 预置产生50ms时基信号
207 1 TL0 = 0xb0;
208 1 EA = 1; // 开总中断
209 1 ET0 = 1; // 定时/计数器0允许中断
210 1 TR0 = 1; // 开闭定时/计数器0
211 1 ////
212 1 //TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值
213 1 //TIME_MO = 5; //初始时间:2009年5月18日周一,20时13分40秒
214 1 //TIME_YY = 9;
215 1 //TIME_WW = 1;
216 1 //TIME_HH = 22;
217 1 //TIME_MM = 13;
218 1 //TIME_SS = 40;
219 1 }
220 /*********************************************************************************************/
221 void main (void){ //主程序
222 1 init();
223 1 while (1){
224 2 diplay_data (1,disdata[TIME_MM/10]);
225 2 diplay_data (2,disdata[TIME_MM%10]);
226 2 diplay_data (3,disdata[TIME_SS/10]+0x80);
227 2 diplay_data (4,disdata[TIME_SS%10]+0x80);
228 2
229 2 }
230 1 }
231 /**********************************************************************************************/
232 void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生50ms时基信号)
233 1 cou++; // 软计数器加1
234 1 if(cou > 19){ // 计数值到100(1s)
235 2 cou = 0; // 软计数器清零
236 2 TIME_SS++; // 秒计数器加1(进位10ms*100=1s)
237 2 if(TIME_SS > 59){ // 秒计数值到60
238 3
239 3 TIME_SS = 0; // 秒计数器清零
240 3 TIME_MM++; // 分计数器加1(进位60s=1m)
C51 COMPILER V6.12 4_BIT_DIGITAL_CLOCK 06/26/2009 03:18:36 PAGE 5
241 3 if(TIME_MM > 59){ // 分计数到60
242 4 TIME_MM = 0; // 分计数器清零
243 4 TIME_HH++; // 时计数器加1(进位60m=1h)
244 4 if(TIME_HH > 23){ // 时计数到23
245 5 TIME_HH = 0; // 时计数器清零
246 5 }
247 4 }
248 3 }
249 2 }
250 1 TH0 = 0x3c; // 重置定时常数
251 1 TL0 = 0xb0;
252 1 }
253 /**********************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 743 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 ----
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 + -