📄 keyled.lst
字号:
C51 COMPILER V7.02a KEYLED 04/25/2006 13:40:53 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE KEYLED
OBJECT MODULE PLACED IN KeyLed.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE KeyLed.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <reg51all.h>
3 #include <intrins.h>
4
5 #define SEGCODE P1 // 数码管字型码由P1输出,A~H对应D7~D0,0点亮,1熄灭
6 #define POSCTRL0 P34
7 #define POSCTRL1 P35
8 #define LS0 P30 // 位置码同时作为键盘列扫描码,共8列,2行
9 #define LS1 P31 // 行扫描由P36,P37完成,D0~D7对应1~8列,为0表示有键按下
10 #define JCON0 P32 //继电器选通
11 #define JCON1 P33 //继电器选通
12 #define BRAY P37
13
14
15 unsigned char Row,Col; // 按键的行列值
16 unsigned char ucTH,ucTL; // 定时器初值
17 unsigned char start,set,position,ii; //按键设置标记和选路标记
18 unsigned char hnum,lnum; //定时数的高位和低位
19
20 unsigned char count[2]; //定时数
21 int jj; //中断计数
22 unsigned char logo; //倒计时时间到标记
23 /*******************************************************************************
24 键盘连接方式:
25 C0 C1
26 R0 -|---|- P30
27 R1 -|---|- P31
28 P34 P35
29 *******************************************************************************/
30
31
32 // 根据A~H对应D7~D0的关系设定0~F的字形码
33 unsigned char code SEGTABLE[] = {
34 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x5f,0x7c,0x58,0x5e,0x79,0x71};
35
36 unsigned char CurrRow[2],CurrCol[2],LastRow[2],LastCol[2]; // 存放当前和前次两行和两列扫描码
37
38 //******************************************************************************
39 // 函数名:T0ISR
40 // 功 能:2.5ms中断服务程序
41 // 作 者:mudfish 2005-10-31 10:12
42 // 注 释:
43 //******************************************************************************
44 void T0ISR(void) interrupt 1
45 {
46 1 unsigned char i,j,k;
47 1
48 1 // 重新设置定时常数
49 1 TH0 = ucTH;
50 1 TL0 = ucTL;
51 1 TR0 = 1;
52 1
53 1 if(logo==1) //倒计时时间到标记
54 1 BRAY=1; //鸣叫1秒
55 1 else BRAY=0; //关闭鸣叫
C51 COMPILER V7.02a KEYLED 04/25/2006 13:40:53 PAGE 2
56 1
57 1 // 先进行键盘扫描
58 1 SEGCODE = 0xff; // 关闭所有段显示
59 1 CurrRow[0] = 0;
60 1 CurrRow[1] = 0;
61 1 CurrCol[0] = 0;
62 1 CurrCol[1] = 0;
63 1
64 1 POSCTRL0 = 0; // 当前扫描列送0
65 1 POSCTRL1 = 1;
66 1 LS0 = 1;
67 1 _nop_();_nop_();_nop_();_nop_();
68 1 if(LS0 == 0)
69 1 {
70 2 CurrRow[0] =1;
71 2 CurrCol[0]=1; // 该位置0
72 2 }
73 1
74 1 LS1 = 1;
75 1 _nop_();_nop_();_nop_();_nop_();
76 1 if(LS1 == 0)
77 1 {
78 2 CurrRow[1] =1;
79 2 CurrCol[0]=1; // 该位置1
80 2 }
81 1
82 1
83 1
84 1 POSCTRL0 = 1;
85 1 POSCTRL1 = 0; // 当前扫描列送0
86 1 LS0 = 1;
87 1 _nop_();_nop_();_nop_();_nop_();
88 1 if(LS0 == 0)
89 1 {
90 2 CurrRow[0] =1;
91 2 CurrCol[1]=1; // 该位置1
92 2 }
93 1
94 1 LS1 = 1;
95 1 _nop_();_nop_();_nop_();_nop_();
96 1 if(LS1 == 0)
97 1 {
98 2 CurrRow[1] =1;
99 2 CurrCol[1]=1; // 该位置1
100 2 }
101 1
102 1
103 1
104 1 // 扫描完成
105 1
106 1 // 开始按键处理
107 1
108 1 Row = 0xff; // 缺省无按键状态
109 1 Col = 0xff;
110 1 for(j=0;j<2;j++)
111 1 {
112 2 if( (CurrRow[j]^LastRow[j]) != 0) // 按键状态有变化
113 2 {
114 3 for(i=0;i<2;i++)
115 3 {
116 4 if( LastCol[i]== 1 )
117 4 {
C51 COMPILER V7.02a KEYLED 04/25/2006 13:40:53 PAGE 3
118 5 Row = j; // 本次扫描按键状态有变化且上次为按下
119 5 Col = i; // 说明本次为按键松开,有效
120 5 break; // 每次只处理一个按键
121 5 }
122 4 }
123 3 }
124 2 if( (Row!=0xff) && (Col!=0xff) ) break; // 每次只处理一个按键
125 2 }
126 1
127 1 for(j=0;j<2;j++)
128 1 {
129 2 LastRow[j] = CurrRow[j];
130 2 LastCol[j]=CurrCol[j]; // 将本次扫描码保存到上次扫描码
131 2 }
132 1
133 1
134 1 //加法按键
135 1 if(Row==0 && Col==0)
136 1 {
137 2 count[position]=count[position]+1; //加1
138 2 if(count>99)
139 2 count[position]=0; //值0~99
140 2 BRAY=1; //鸣叫
141 2 }
142 1
143 1 //减法按键
144 1 if(Row==0 && Col==1)
145 1 {
146 2 count[position]=count[position]-1; //减1
147 2 if(count<0) //值0~99
148 2 count[position]=99;
149 2 BRAY=1; //鸣叫
150 2 }
151 1
152 1 //选路按键
153 1 if(Row==1 && Col==0)
154 1 {
155 2 set=1; //设置标志
156 2 start=0;
157 2 position=(position+1)%2; //选路
158 2 BRAY=1; //鸣叫
159 2 }
160 1
161 1 //开始倒计时按键
162 1 if(Row==1 && Col==1)
163 1 {
164 2 set=0;
165 2 start=1; //开始标记
166 2 JCON0=1; //继电器0选通
167 2 JCON1=1; //继电器1选通
168 2 BRAY=1; //鸣叫
169 2 }
170 1
171 1 //设置倒计时间时数码管的显示处理
172 1 if(set==1)
173 1 {
174 2 hnum=count[position]/10; //高位
175 2 lnum=count[position]%10; //低位
176 2 POSCTRL0=1; //显示高位
177 2 POSCTRL1=0;
178 2 SEGCODE=SEGTABLE[hnum];
179 2 _nop_();_nop_();_nop_();_nop_();
C51 COMPILER V7.02a KEYLED 04/25/2006 13:40:53 PAGE 4
180 2 POSCTRL0=0;
181 2 POSCTRL1=1; //显示低位
182 2 SEGCODE=SEGTABLE[lnum];
183 2
184 2 }
185 1
186 1 //开始倒计后的显示处理和计时到处理
187 1 if(start==1)
188 1 {
189 2 hnum=count[ii]/10; //高位
190 2 lnum=count[ii]%10; //低位
191 2
192 2 POSCTRL0=1; //显示高位
193 2 POSCTRL1=0;
194 2 SEGCODE=SEGTABLE[hnum];
195 2 _nop_();_nop_();_nop_();_nop_();
196 2
197 2 POSCTRL0=0;
198 2 POSCTRL1=1; //显示低位
199 2 SEGCODE=SEGTABLE[lnum];
200 2
201 2 jj++;
202 2 if(jj>200) ii=(ii+1)%2; //0.5秒 显示另外一路
203 2 if(jj>400) //1秒
204 2 {
205 3 jj=1;
206 3 logo=0; //1秒重设标记
207 3 for(k=0;k<2;k++)
208 3 {
209 4 count[k]=count[k]-1; //1秒 减1
210 4 if(count[k]==0) //计时到
211 4 {
212 5 logo=1; //倒计时间到标记
213 5 if(k==0)
214 5 JCON0=0; //继电器0该路关闭
215 5 if(k==1)
216 5 JCON1=0; //继电器1该路关闭
217 5
218 5 }
219 4
220 4 }
221 3
222 3
223 3
224 3 }
225 2
226 2
227 2
228 2 }
229 1
230 1 }
231
232
233 void main(void)
234 {
235 1
236 1 position=0; //选第一路
237 1 count[0]=0; //第一路初值为0
238 1 count[1]=0; //第二路初值为0
239 1 JCON0=0; //关闭继电器0
240 1 JCON1=0; //关闭继电器1
241 1 ii=1;
C51 COMPILER V7.02a KEYLED 04/25/2006 13:40:53 PAGE 5
242 1 jj=1;
243 1
244 1 EA = 0; // 停止所有中断
245 1
246 1 ucTH = (65536-22118400/12/400)/256; // 计算2.5ms定时的时间常数(22.1184M OSC)
247 1 ucTL = (65536-22118400/12/400)%256;
248 1
249 1 TMOD = 0x01; // T0:模式1,16位定时器
250 1
251 1 TH0 = ucTH; //定时器赋初值
252 1 TL0 = ucTL;
253 1
254 1 ET0 = 1; // T0允许中断
255 1
256 1 TR0 = 1; //开始计数
257 1
258 1 EA = 1; //开所有的中断
259 1
260 1 while(1);
261 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 563 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 ----
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 + -