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