📄 ex11.lst
字号:
C51 COMPILER V7.03 EX11 07/08/2005 22:32:54 PAGE 1
C51 COMPILER V7.03, COMPILATION OF MODULE EX11
OBJECT MODULE PLACED IN ex11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ex11.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 ; Title: 演示程序11 - 秒表 *
3 ; Name: ex11.c *
4 ; Date: 2005-5-29 *
5 ; Ver: 1.0 *
6 ; web: http://www.mcustudy.com *
7 ********************************************************************************
8 * 描述: *
9 * 数码管显示秒表, 分辨率0.01s *
10 * *
11 * K1, 启动开始计时 *
12 * K2, 停止 *
13 * K3, 归零 *
14 * *
15 * 秒单位,寄存器与数码管对应关系: *
16 * *
17 * --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器 *
18 * 十万位 P20 dis_buf[7] sec_bcd[7] *
19 * 万位 P21 dis_buf[6] sec_bcd[6] *
20 * 千位 P22 dis_buf[5] sec_bcd[5] *
21 * 百位 P23 dis_buf[4] sec_bcd[4] *
22 * 十位 P24 dis_buf[3] sec_bcd[3] *
23 * 个位(1.s) P25 dis_buf[2] sec_bcd[2] *
24 * 十分位(0.1s) P26 dis_buf[1] sec_bcd[1] *
25 * 百分位(0.01s) P27 dis_buf[0] sec_bcd[0] *
26 * *
27 ********************************************************************************/
28
29 #include <reg51.h>
30 #include <intrins.h>
31
32
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 dis_buf[8]; // 显示缓冲区
40 unsigned char sec_bcd[8]; // 秒计数值, BCD码
41 unsigned char dis_index; //
42
43
44 void clr_time();
45 void update_disbuf();
46 unsigned char scan_key();
47 void proc_key(unsigned char key);
48 void delayms(unsigned char ms);
49
50 sbit K1 = P3^2;
51 sbit K2 = P3^3;
52 sbit K3 = P3^4;
53
54 void main(void)
55 {
C51 COMPILER V7.03 EX11 07/08/2005 22:32:54 PAGE 2
56 1 unsigned char key;
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 clr_time(); //
67 1
68 1 dis_digit = 0x7f; // 初始显示P20口数码管
69 1 dis_index = 0; //
70 1
71 1
72 1 IE = 0x8a; // 使能timer0, timer1中断
73 1
74 1 TR0 = 1;
75 1 TR1 = 0;
76 1 while(1)
77 1 {
78 2 key = scan_key();
79 2 proc_key(key);
80 2 }
81 1 }
82
83 void clr_time()
84 {
85 1 unsigned char i;
86 1 for(i=0;i<8;i++)
87 1 sec_bcd[i] = 0x0;
88 1 update_disbuf();
89 1
90 1 }
91
92 unsigned char scan_key()
93 {
94 1 unsigned char key_s;
95 1 key_s = P3 & 0x1c;
96 1 delayms(20);
97 1 key_v = P3 & 0x1c;
98 1 if(key_s == key_v)
99 1 return key_s;
100 1 else
101 1 return 0 ;
102 1 }
103
104
105
106 void proc_key(unsigned char key)
107 {
108 1 switch(key)
109 1 {
110 2 case 0x18: // k1
111 2 TR1 = 1;
112 2 break;
113 2 case 0x14: //k2
114 2 TR1 = 0;
115 2 break;
116 2 case 0x0c: //k3
117 2 clr_time();
C51 COMPILER V7.03 EX11 07/08/2005 22:32:54 PAGE 3
118 2 break;
119 2 default:
120 2 break;
121 2 }
122 1 }
123
124
125 // 定时器0中断服务程序, 用于数码管的动态扫描
126 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
127 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
128 // 选通P2.0口数码管
129 // dis_buf --- 显于缓冲区基地址
130 void timer0() interrupt 1
131 {
132 1 TH0 = 0xFC;
133 1 TL0 = 0x17;
134 1
135 1 P2 = 0xff; // 先关闭所有数码管
136 1 P0 = dis_buf[dis_index]; // 显示代码传送到P0口
137 1 P2 = dis_digit; //
138 1
139 1 dis_digit = _cror_(dis_digit,1); // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管
140 1 dis_index++; //
141 1
142 1 dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
143 1 }
144
145 void timer1() interrupt 3
146 {
147 1 unsigned char i;
148 1 TH1 |= 0xdc;
149 1 for(i = 0; i < 8; i++)
150 1 {
151 2 sec_bcd[i]++; // 低位加1
152 2 if(sec_bcd[i] < 10) // 如果低位满10则向高位进1
153 2 break; // 低位未满10
154 2 sec_bcd[i] = 0; // 低位满10清0
155 2 }
156 1 update_disbuf(); // 更新显示缓冲区
157 1 }
158
159 void update_disbuf()
160 // 更新显示缓冲区
161 {
162 1 dis_buf[0] = dis_code[sec_bcd[0]];
163 1 dis_buf[1] = dis_code[sec_bcd[1]];
164 1 dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f; // 加上小数点
165 1 dis_buf[3] = dis_code[sec_bcd[3]];
166 1 dis_buf[4] = dis_code[sec_bcd[4]];
167 1 dis_buf[5] = dis_code[sec_bcd[5]];
168 1 dis_buf[6] = dis_code[sec_bcd[6]];
169 1 dis_buf[7] = dis_code[sec_bcd[7]];
170 1 }
171
172 // 延时子程序
173 void delayms(unsigned char ms)
174 {
175 1 unsigned char i;
176 1 while(ms--)
177 1 {
178 2 for(i = 0; i < 120; i++);
179 2 }
C51 COMPILER V7.03 EX11 07/08/2005 22:32:54 PAGE 4
180 1 }
181
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 314 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 2
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 + -