📄 keyscan.lst
字号:
C51 COMPILER V8.02 KEYSCAN 06/04/2007 21:32:09 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEYSCAN
OBJECT MODULE PLACED IN keyscan.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE keyscan.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h> // 引用标准库的头文件
2 #include <intrins.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 sbit DIN = P2^0; // 串行数据输入
8 sbit CLK = P2^1; // 串行时钟
9 sbit LOAD = P2^2; // 显示数据锁存控制
10
11
12
13 #define Digit0 0x01 // 数码管1寄存器
14 #define Digit1 0x02 // 数码管2寄存器
15 #define Digit2 0x03 // 数码管3寄存器
16 #define Digit3 0x04 // 数码管4寄存器
17 #define Digit4 0x05 // 数码管5寄存器
18 #define Digit5 0x06 // 数码管6寄存器
19 #define Digit6 0x07 // 数码管7寄存器
20 #define Digit7 0x08 // 数码管8寄存器
21
22
23 #define DecodeMode 0x09 // 译码模式寄存器
24 #define Intensity 0x0a // 亮度寄存器
25 #define ScanLimit 0x0b // 扫描位数寄存器
26 #define ShutDown 0x0c // 低功耗模式寄存器
27 #define DisplayTest 0x0f // 显示测试寄存器
28
29
30 #define ShutdownMode 0x00 // 低功耗方式
31 #define NormalOperation 0x01 // 正常操作方式
32
33 #define ScanDigit 0x07 // 扫描位数设置,显示8位数码管
34 #define DecodeDigit 0xff // 译码设置,8位均为BCD码
35 #define IntensityGrade 0x0a // 亮度级别设置
36
37 #define TestMode 0x01 // 显示测试模式
38 #define TextEnd 0x00 // 显示测试结束,恢复正常工作模式
39
40
41
42 uchar keycode;
43 uchar numbit,digit[5];
44 void KeyDisplay(void);
45 void clear(void);
46
47 /* 延时t毫秒 */
48 void delay(uint t)
49 {
50 1 uint i;
51 1 while(t--)
52 1 {
53 2 /* 对于12M时钟,约延时1ms */
54 2 for (i=0;i<125;i++)
55 2 {}
C51 COMPILER V8.02 KEYSCAN 06/04/2007 21:32:09 PAGE 2
56 2 }
57 1 }
58
59
60
61 /* 向MAX7219写入字节(8位)*/
62 void SendChar (uchar ch)
63 {
64 1 uchar i,temp;
65 1 _nop_();
66 1 for (i=0;i<8;i++)
67 1 {
68 2 temp=ch&0x80;
69 2 ch=ch<<1;
70 2 if(temp)
71 2 {
72 3 DIN=1;
73 3 CLK=0;
74 3 CLK=1;
75 3 }
76 2 else
77 2 {
78 3 DIN=0;
79 3 CLK=0;
80 3 CLK=1;
81 3 }
82 2 }
83 1 }
84
85
86
87 /* 向MAX7219写入字(16位)*/
88 void WriteWord (uchar addr,uchar num)
89 {
90 1 LOAD=0;
91 1 _nop_();
92 1 SendChar(addr);
93 1 _nop_();
94 1 SendChar(num);
95 1 _nop_();
96 1 LOAD=1; // 锁存进相应寄存器
97 1 }
98
99
100
101 /* MAX7219初始化 */
102 void InitDisplay (void)
103 {
104 1 WriteWord (ScanLimit, ScanDigit); // 设置扫描界限
105 1 WriteWord (DecodeMode, DecodeDigit); // 设置译码模式
106 1 WriteWord (Intensity, IntensityGrade); // 设置亮度
107 1 WriteWord (ShutDown, NormalOperation); // 设置为正常工作模式
108 1 }
109
110
111
112 void keyscan(void) //键盘扫描子程序
113 {
114 1 uchar scancode, rowcode;
115 1 P3=0xf0; //向行扫描输出口发全0,查询列信号
116 1 if((P3&0xf0)!=0xf0)//若有键按下
117 1 {
C51 COMPILER V8.02 KEYSCAN 06/04/2007 21:32:09 PAGE 3
118 2 delay(50); //延时消抖
119 2 if((P3&0xf0)!=0xf0)
120 2 {
121 3 scancode=0xfe;
122 3 while((scancode&0x10)!=0) //逐行扫描
123 3 {
124 4 P3=scancode; //输出行扫描码
125 4 if((P3&0xf0)!=0xf0) //若本行有键按下
126 4 {
127 5 rowcode=(P3&0xf0)|0x0f;
128 5 keycode=((~scancode)+(~rowcode));
129 5 KeyDisplay();
130 5 }
131 4
132 4 else
133 4 { scancode=(scancode<<1)|0x01;}
134 4 }
135 3 }
136 2
137 2 }
138 1
139 1 }
140
141
142 uchar getkey(uchar keycode) //获取键值子程序
143 {
144 1 uchar kb;
145 1 switch(keycode)
146 1 {
147 2 case 0x11:kb=0x04;break;
148 2 case 0x21:kb=0x03;break;
149 2 case 0x41:kb=0x02;break;
150 2 case 0x81:kb=0x01;break;
151 2
152 2 case 0x12:kb=0x08;break;
153 2 case 0x22:kb=0x07;break;
154 2 case 0x42:kb=0x06;break;
155 2 case 0x82:kb=0x05;break;
156 2
157 2 case 0x14:kb=0x0b;break;
158 2 case 0x24:kb=0x0a;break;
159 2 case 0x44:kb=0x00;break;
160 2 case 0x84:kb=0x09;break;
161 2
162 2 case 0x18:kb=0x0f;break;
163 2 case 0x28:kb=0x0e;break;
164 2 case 0x48:kb=0x0d;break;
165 2 case 0x88:kb=0x0c;break;
166 2
167 2 default: kb=0x00;break;
168 2 }
169 1 return(kb);
170 1 }
171
172 void KeyDisplay(void)
173 {
174 1 uchar keydata;
175 1 keydata=getkey(keycode);
176 1 delay(250);
177 1 switch(keydata)
178 1 {
179 2 case 1:
C51 COMPILER V8.02 KEYSCAN 06/04/2007 21:32:09 PAGE 4
180 2 case 2:
181 2 case 3:
182 2 case 4:
183 2 case 5:
184 2 case 6:
185 2 case 7:
186 2 case 8:
187 2 case 9:if(numbit<5)
188 2 {
189 3 digit[4]=digit[3];
190 3 digit[3]=digit[2];
191 3 digit[2]=digit[1];
192 3 digit[1]=digit[0];
193 3 digit[0]=keydata;
194 3 numbit++;
195 3 }break;
196 2
197 2 case 10:clear(); break;
198 2 default:break;
199 2 }
200 1 WriteWord (Digit7, digit[0]);
201 1 WriteWord (Digit6, digit[1]);
202 1 WriteWord (Digit5, digit[2]);
203 1 WriteWord (Digit4, digit[3]);
204 1 WriteWord (Digit3, digit[4]);
205 1 }
206
207 void clear(void)
208 {
209 1 uchar i;
210 1 numbit=0;
211 1 for(i=0;i<5;i++) digit[i]=0;
212 1 for(i=0;i<8;i++) WriteWord (Digit0+i, 0);
213 1 }
214
215
216
217
218
219
220
221
222
223 /* 主函数 */
224 void main(void)
225 {
226 1 InitDisplay (); // MAX7219初始化
227 1 WriteWord(DisplayTest,TestMode); // 开始显示测试,点亮所有LED
228 1 delay(1000); // 延时约3s
229 1 WriteWord (DisplayTest,TextEnd); // 退出显示测试模式
230 1 clear();
231 1 while(1)
232 1 {
233 2 keyscan( );
234 2 }
235 1
236 1 }
237
238
239
240
241
C51 COMPILER V8.02 KEYSCAN 06/04/2007 21:32:09 PAGE 5
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 466 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 3
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 + -