📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 05/14/2009 21:52:33 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #define uchar unsigned char
4
5 void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255
6 void key_scan(); // 按键扫描
7 void key_to(); // 按键处理
8
9 /*uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表
10 // 0 1 2 3 4 对应内容
11 0x92,0x82,0xf8,0x80,0x90,0xbf};
12 // 5 6 7 8 9 -
13 */
14 uchar code dis_code[11] = {0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0xf7};
15
16 uchar data dis[8]; // dis[0]为秒个位值,dis[1]为秒十位值
17 // dis[2],dis[5]为'-'段码的偏移量
18 // dis[3]为分个位值,dis[4为分十位值
19 // dis[6]为时个位值,dis[7]为时十位值
20
21 uchar data sec = 0; // 秒计数器(00s-59s)
22 uchar data min = 0; // 分计数器(00m-59m)
23 uchar data hou = 0; // 时计数器)00h-23h)
24
25 uchar data cou = 0; // 软计数器,对10ms时基信号累加到1s
26
27 uchar data dis_b; // dis_b为位码选通数码管
28 uchar data dis_r; // dis_r为取段码时的偏移量
29
30 uchar data key_v = 0; // 存储键值
31 uchar data key_t = 0; // 按键扫描中临时存储键值
32
33 void main()
34 {
35 1 P2 = 0xff; // 关所有数码管
36 1 P1 = 0xff; // p1为准双向口,作输入时先写1
37 1 dis[2] = 10; // '-'在段码表中偏移量为10
38 1 dis[5] = 10; // '-'在段码表中偏移量为10
39 1 dis_b = 0x7f; // 初始选通P2.7口数码管
40 1 dis_r = 0; // 初始化偏移量为0
41 1
42 1 TMOD = 0x11; // 定时/计数器0,1工作于方式1
43 1 TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号
44 1 TL0 = 0xf0;
45 1 TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示
46 1 TL1 = 0x18;
47 1 EA = 1; // 开总中断
48 1 ET0 = 1; // 定时/计数器0允许中断
49 1 ET1 = 1; // 定时/计数器1允许中断
50 1 TR0 = 1; // 开闭定时/计数器0
51 1 TR1 = 1; // 启动定时/计数器1
52 1 while(1)
53 1 {
54 2 key_t = P1; // 读入键值
55 2 if(key_t != key_v) // 键值改变
C51 COMPILER V8.08 MAIN 05/14/2009 21:52:33 PAGE 2
56 2 {
57 3 delay_ms(10); // 延时10ms消抖
58 3 key_t = P1; // 再次读入键值
59 3 if(key_t != key_v) // 键值仍未改变则不是抖动
60 3 {
61 4 key_v = key_t; // 保存键值
62 4 key_to(); // 键处理
63 4 }
64 3 }
65 2 }
66 1 }
67 void key_to() // 按键处理子程序
68 {
69 1 if(key_v == 0xef) // P1.4口键值
70 1 {
71 2 if(min == 59) // 分计数已加到59
72 2 min = 0; // 清零之
73 2 else
74 2 min++; // 否则加1
75 2 }
76 1 else if(key_v == 0xdf) // P1.5口键值
77 1 {
78 2 if(hou == 23) // 时计数已加到23
79 2 hou = 0; // 清零之
80 2 else
81 2 hou++; // 否则加1
82 2 }
83 1 else if(key_v==0xbf)
84 1 sec=0;
85 1
86 1 }
87 void time0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号)
88 {
89 1 cou++; // 软计数器加1
90 1 if(cou == 100) // 计数值到100(1s)
91 1 {
92 2 cou = 0; // 软计数器清零
93 2 sec++; // 秒计数器加1(进位10ms*100=1s)
94 2 if(sec == 60) // 秒计数值到60
95 2 {
96 3 sec = 0; // 秒计数器清零
97 3 min++; // 分计数器加1(进位60s=1m)
98 3 if(min == 60) // 分计数到60
99 3 {
100 4 min = 0; // 分计数器清零
101 4 hou++; // 时计数器加1(进位60m=1h)
102 4 if(hou == 23) // 时计数到23
103 4 hou = 0; // 时计数器清零
104 4 }
105 3 }
106 2 }
107 1 TH0 = 0xd8; // 重置定时常数
108 1 TL0 = 0xf0;
109 1 }
110 void time1(void) interrupt 3 // T/C1中断服务程序(延时1ms数码管动态显示)
111 {
112 1 dis[0] = sec % 10; // 秒计数器个位赋绐dis[0]
113 1 dis[1] = sec / 10; // 秒计数器十位赋绐dis[1]
114 1 dis[3] = min % 10; // 分计数器个位赋绐dis[3]
115 1 dis[4] = min / 10; // 分计数器十位赋绐dis[4]
116 1 dis[6] = hou % 10; // 时计数器个位赋绐dis[6]
117 1 dis[7] = hou / 10; // 时计数器十位赋绐dis[7]
C51 COMPILER V8.08 MAIN 05/14/2009 21:52:33 PAGE 3
118 1
119 1 P0 = dis_code[dis[dis_r]]; // 段码送P0口(dis[0]...dis[7])
120 1 P2 = dis_b; // 位码送P2口
121 1
122 1 dis_r++; // 偏移量加1,下次中断时显示下个数
123 1 dis_r &= 0x07; // dis_r增到8时自动清0(使之在0到7间循环)
124 1
125 1 dis_b = _cror_(dis_b,1); // 位码循环右移,下次中断时选通下个数码管
126 1
127 1 TH1 = 0xfc; // 重置定时常数
128 1 TL1 = 0x18;
129 1
130 1 }
131 void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255
132 {
133 1 uchar i;
134 1 while(ms--)
135 1 for(i = 0; i < 124; i++);
136 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 312 ----
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 + -