📄 text11.lst
字号:
C51 COMPILER V7.50 TEXT11 07/27/2005 15:52:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEXT11
OBJECT MODULE PLACED IN Text11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text11.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include <stdio.h>
3 #include <reg51.h>
4
5 // 0 - 9 的编码
6 unsigned char code table[] = { 0x11,0xb7,0x29,0x23,0x87,0x43,0x41,0x37,0x01,0x03,0x00 };
7 unsigned int count2;
8
9 //第1-6 位的片选线
10 unsigned char code dig[] = { 0x7f,0xfd,0xdf,0xf7,0xef,0xfb };
11 unsigned char buffer[8],val[6];
12 unsigned char count1,scan,i,ch,KeyVal,modify,OverTime;
13 bit fKey,fSec,Key1,Key2,Key3,OldKey1,OldKey2,OldKey3,blink,fTimer,fSTOP;
14 unsigned long int cn,tmp;
15 sbit P30=P3^0;
16
17 void init(void);
18 void display(void);
19 void Cal_cn(void);
20 void Cal_val(void);
21
22 main()
23 {
24 1 init();
25 1
26 1
27 1 while(1) {
28 2
29 2
30 2 if(fSec) { // 秒标志被置位?
31 3 fSec = 0; // 清除秒标志
32 3 if(!fSTOP && modify==0) {
33 4 if(cn!=0) cn--; else { fTimer = 1; fSTOP = 1; }
34 4 }
35 3 display();
36 3 }
37 2
38 2
39 2 if(fKey) { // 有按键按下?
40 3 fKey = 0; // 清除按件标志,并处理该按键
41 3
42 3 if(KeyVal==1) { // 是调整按钮?
43 4 fSTOP = 0; modify++; // 进入相应状态,并重置超时定时器
44 4 if(modify==7) { modify = 0; OverTime = 0; } else OverTime = 10;
45 4 }
46 3
47 3 if(KeyVal==2 && modify!=0) { // +1按钮,相应位+1
48 4 Cal_val();
49 4 if(val[modify-1]<9) val[modify-1]++;
50 4 Cal_cn();
51 4 display(); OverTime = 10; // 刷新显示,并重置超时定时器
52 4 }
53 3
54 3 if(KeyVal==3 && modify!=0) { // -1按钮,相应位-1
55 4 Cal_val();
C51 COMPILER V7.50 TEXT11 07/27/2005 15:52:50 PAGE 2
56 4 if(val[modify-1]>0) val[modify-1]--;
57 4 Cal_cn();
58 4 display(); OverTime = 10; // 刷新显示,并重置超时定时器
59 4 }
60 3
61 3 }
62 2
63 2 }
64 1 }
65
66 void init(void) {
67 1
68 1 count1 = count2 = 0; scan = 0; KeyVal = 0;
69 1 cn = 0; for(i=0;i<6;i++) val[i] = 0;
70 1 fKey = 0; modify = 0; blink = 0; OverTime = 0; fTimer = 0; fSTOP = 0;
71 1 Key1 = Key2 = Key3 = 0;
72 1 OldKey1 = OldKey2 = OldKey3 = 1;
73 1
74 1 for(i=0;i<6;i++) buffer[i] = 0;
75 1
76 1 TCON &= 0xCF; // 初始化Timer0
77 1 TMOD &= 0xF0;
78 1 TMOD |= 0x01;
79 1 TH0 = TL0 = 0;
80 1 EA = 1;
81 1 ET0 = 1;
82 1 TR0 = 1;
83 1
84 1 }
85
86
87 timerint () interrupt 1 {
88 1
89 1 TR0 = 0;
90 1 TL0 = 0x12;
91 1 TH0 = 0xf7; // 0xf712 for 2.5ms
92 1 TR0 = 1;
93 1
94 1
95 1 if(scan==1 && !fKey) { // 扫描调整按钮
96 2 Key1 = P30;
97 2 if(!Key1 && OldKey1) { fKey = 1; KeyVal = 1; }
98 2 }
99 1
100 1
101 1 if(scan==3 && !fKey) { // 扫描+1按钮
102 2 Key2 = P30;
103 2 if(!Key2 && OldKey2) { fKey = 1; KeyVal = 2; }
104 2 }
105 1
106 1 if(scan==4 && !fKey) { // 扫描-1按钮
107 2 Key3 = P30;
108 2 if(!Key3 && OldKey3) { fKey = 1; KeyVal = 3; }
109 2 }
110 1
111 1 OldKey1 = Key1; OldKey2 = Key2; OldKey3 = Key3;
112 1
113 1
114 1 P1 = 0xff; P3 = dig[scan];
115 1 ch = buffer[scan]; // 依次显示6位
116 1
117 1 if(modify==0) {
C51 COMPILER V7.50 TEXT11 07/27/2005 15:52:50 PAGE 3
118 2 if(fTimer) P1 = table[ch] & 0xfe; // 倒计时结束,启动P10(P10低电平)
119 2 else P1 = table[ch];
120 2 }
121 1 else if(modify==1 && blink && scan==0) P1 = 0xff;
122 1 else if(modify==2 && blink && scan==1) P1 = 0xff;
123 1 else if(modify==3 && blink && scan==2) P1 = 0xff;
124 1 else if(modify==4 && blink && scan==3) P1 = 0xff;
125 1 else if(modify==5 && blink && scan==4) P1 = 0xff;
126 1 else if(modify==6 && blink && scan==5) P1 = 0xff;
127 1 else P1 = table[ch];
128 1
129 1 scan++; if(scan==6) scan = 0;
130 1
131 1 count1++;
132 1 if(count1==200) { count1 = 0; blink = ~blink; } // 0.5s闪烁定时器
133 1
134 1 count2++;
135 1 if(count2==400) {
136 2 count2 = 0; fSec = 1; fTimer = 0; // 秒脉冲标志置位,并关闭P10输出
137 2
138 2 if(OverTime) { OverTime--; if(OverTime==0) modify = 0; } // 10s超时定时器
139 2
140 2 }
141 1
142 1 }
143
144 void Cal_cn(void) {
145 1
146 1 cn = 0;
147 1 for(i=0;i<6;i++) {
148 2 cn *= 10; cn += val[i];
149 2 }
150 1
151 1 }
152
153 void Cal_val(void) {
154 1
155 1 tmp = cn;
156 1 for(i=0;i<6;i++) {
157 2 val[5-i] =(unsigned char) ( tmp % 10 );
158 2 tmp = tmp / 10;
159 2 }
160 1
161 1 }
162
163 void display(void) {
164 1
165 1 tmp = cn;
166 1 for(i=0;i<6;i++) {
167 2 buffer[5-i] =(unsigned char) ( tmp % 10 );
168 2 tmp = tmp / 10;
169 2 }
170 1
171 1 }
172
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 812 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
C51 COMPILER V7.50 TEXT11 07/27/2005 15:52:50 PAGE 4
DATA SIZE = 31 ----
IDATA SIZE = ---- ----
BIT SIZE = 11 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -