📄 key.lst
字号:
C51 COMPILER V7.02b KEY 04/27/2007 09:49:01 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN .\output\key.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c LARGE BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\key.obj)
stmt level source
1 /************************************************************************************
2 * Copyright (c) 2004,西安铭朗电子科技有限责任公司
3 * All rights reserved.
4 *
5 * 文件名称: key.C
6 * 文件标识: none
7 * 适用器件: C8051F120
8 *
9 * 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
10 *
11 * 当前版本:1.2
12 * 作 者:李林利
13 * 完成日期:2005年6月19日
14 *
15 * 当前版本:1.0
16 * 作 者:卢 阳
17 * 完成日期:2004年11月14日
18 *
19 * 历史版本:0.9
20 * 原作者 : 李林利
21 * 完成日期:2004年1月1日
22 *************************************************************************************/
23
24 /************************************************************************************/
25 // 引用外部头文件
26
27 #include "c8051F120.h"
28 #include <INTRINS.H>
29 #include "key.h"
30 #include "Delay.h"
31
32
33 /************************************************************************************/
34
35 /************************************************************************************
36 // 常量及全局变量定义
37 *************************************************************************************/
38
39 unsigned char code Key_Value_Table[16]=
40 {0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
41 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff
42 };
43 bit bKeyUp_Flag;
44 sbit LED=P3^5;
45
46 /************************************************************************************
47 * key功能子程序
48 *************************************************************************************/
49
50 /***********************************************************************************
51 * 函数名称:Key_Init;
52 *
53 * 函数功能描述:键盘初始化,将标志位置1;
54 *
55 * 输入参数:none;
C51 COMPILER V7.02b KEY 04/27/2007 09:49:01 PAGE 2
56 *
57 * 返回数据:none;
58 *
59 * 注意: none;
60 ************************************************************************************/
61
62 void Key_Init(void)
63 {
64 1 bKeyUp_Flag=1;//标志位置1
65 1 }
66
67 /***********************************************************************************
68 * 函数名称:GetScanKey;
69 *
70 * 函数功能描述:键盘扫描函数,得到键的行列位置;
71 *
72 * 输入参数:none;
73 *
74 * 返回数据:none;
75 *
76 * 注意: none;
77 ************************************************************************************/
78
79 unsigned char GetScanKey(void)
80 {
81 1 unsigned char key, i, temp;
82 1 char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
83 1 SFRPAGE = SFR_PAGE_F; // set SFR page F
84 1
85 1 key=0xff;
86 1
87 1 for (i=1; i<0x10; i<<=1)//i的低4位为行数位
88 1 {
89 2 Key_Scan |= 0x0f;//保留高4位,低4位置1
90 2 Delay_us(1);
91 2 Key_Scan &= ~i; //取行数位
92 2 Delay_us(1);
93 2
94 2 temp = Key_Scan; //取高4位列数位
95 2 temp = ~temp; //取反
96 2 temp>>=4; //右移4位
97 2
98 2 if (temp!=0x00) //有键值
99 2 {
100 3 key = i<<4; //左移4位
101 3 key|=temp; //取键值
102 3 break;
103 3 }
104 2 }
105 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
106 1 return key; //返回行位(高四)和列位(低四)
107 1 }
108
109 /***********************************************************************************
110 * 函数名称:GetKey;
111 *
112 * 函数功能描述:取键值,长按无效;
113 *
114 * 输入参数:none;
115 *
116 * 返回数据:none;
117 *
C51 COMPILER V7.02b KEY 04/27/2007 09:49:01 PAGE 3
118 * 注意: none;
119 ************************************************************************************/
120
121 unsigned char GetKey(void)
122 {
123 1 unsigned char key, temp;
124 1
125 1 if (!bKeyUp_Flag) //判断标志,是1执行
126 1 {
127 2 key=GetScanKey();
128 2 if (key==0xff) //没有按键,置标志位
129 2 bKeyUp_Flag=1;
130 2 else //保持按键
131 2 return 0xff;
132 2 }
133 1
134 1 key=GetScanKey();
135 1 if (key==0xff) //没有按键
136 1 return key;
137 1 else
138 1 temp=key; //取键值
139 1
140 1 Delay_ms(20); //延时20ms
141 1
142 1 key=GetScanKey(); //键盘扫描
143 1
144 1 if(key!=temp) //判断两次键值是否相同
145 1 {
146 2 key=0xff;
147 2 return key;
148 2 }
149 1 else //取键值
150 1 {
151 2 temp=Key_Value_Table[key>>4];
152 2 if (temp==0xff)
153 2 {
154 3 key=0xff;
155 3 return key;
156 3 }
157 2
158 2 temp=Key_Value_Table[key&0x0f];
159 2 if (temp==0xff)
160 2 {
161 3 key=0xff;
162 3 return key;
163 3 }
164 2
165 2 key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
166 2 if (key>15)
167 2 {
168 3 key=0xff;
169 3 return key;
170 3 }
171 2
172 2 bKeyUp_Flag=0;
173 2 return key;
174 2 }
175 1 }
176
177 /***********************************************************************************
178 * 函数名称:Key_SPI;
179 *
C51 COMPILER V7.02b KEY 04/27/2007 09:49:01 PAGE 4
180 * 函数功能描述:键值到LED显示码转换;
181 *
182 * 输入参数:none;
183 *
184 * 返回数据:none;
185 *
186 * 注意: none;
187 ************************************************************************************/
188
189 unsigned char Key_SPI(unsigned char key)
190 {
191 1 switch(key)
192 1 {
193 2 case 0x00: return 0x3f;//0
194 2 case 0x01: return 0x06;//1
195 2 case 0x02: return 0x5b;//2
196 2 case 0x03: return 0x4f;//3
197 2 case 0x04: return 0x66;//4
198 2 case 0x05: return 0x6d;//5
199 2 case 0x06: return 0x7d;//6
200 2 case 0x07: return 0x07;//7
201 2 case 0x08: return 0x7f;//8
202 2 case 0x09: return 0x6f;//9
203 2 case 0x0a: return 0x77;//a
204 2 case 0x0b: return 0x7c;//b
205 2 case 0x0c: return 0x39;//c
206 2 case 0x0d: return 0x5e;//d
207 2 case 0x0e: return 0x79;//e
208 2 case 0x0f: return 0x71;//f
209 2 default: return 0x00;
210 2 }
211 1 }
212
213 /***********************************************************************************
214 * 函数名称:Alarm;
215 *
216 * 函数功能描述:蜂鸣器开关控制 0:关闭,其他:开启;
217 *
218 * 输入参数:0:关闭,其他:开启;
219 *
220 * 返回数据:none;
221 *
222 * 注意: none;
223 ************************************************************************************/
224
225 void Alarm(unsigned char flag)
226 {
227 1 char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
228 1 SFRPAGE = SFR_PAGE_F; // set SFR page F
229 1
230 1 if(flag)
231 1 P4|=0x10;
232 1 else
233 1 P4&=0xef;
234 1
235 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
236 1 }
237
238 /***********************************************************************************
239 * 函数名称:LED_state;
240 *
241 * 函数功能描述:LED开关控制 0:关闭,其他:开启;
C51 COMPILER V7.02b KEY 04/27/2007 09:49:01 PAGE 5
242 *
243 * 输入参数:0:关闭,其他:开启;
244 *
245 * 返回数据:none;
246 *
247 * 注意: none;
248 ************************************************************************************/
249
250 void LED_state(unsigned char flag)
251 {
252 1 if(flag)
253 1 LED=1;
254 1 else
255 1 LED=0;
256 1 }
257
258 /*
259 SPI0DAT=0x3f; //显示0
260 SPI0DAT=0x06; //显示1
261 SPI0DAT=0x5b; //显示2
262 SPI0DAT=0x4f; //显示3
263 SPI0DAT=0x66; //显示4
264 SPI0DAT=0x6d; //显示5
265 SPI0DAT=0x7d; //显示6
266 SPI0DAT=0x07; //显示7
267 SPI0DAT=0x7f; //显示8
268 SPI0DAT=0x6f; //显示9
269 SPI0DAT=0x77; //显示a
270 SPI0DAT=0x7c; //显示b
271 SPI0DAT=0x39; //显示c
272 SPI0DAT=0x5e; //显示d
273 SPI0DAT=0x79; //显示e
274 SPI0DAT=0x71; //显示f
275 SPI0DAT=0x80; //显示.
276 */
277
278 /***********************************************************************************/
279 // 文件结束
280 /***********************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 366 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- 4
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -