📄 de.lst
字号:
161 2 break;
162 2 case 0x88: return 16;//0x10
163 2 break;
164 2 default: return 0x00;
165 2 break;
166 2 }
167 1 }
168
169 /***********************************************************
170
171 * 函数名称:getkey();
172
173 * 函数功能描述:按键的扫描判断与取值
174
C51 COMPILER V8.04 DE 11/02/2007 13:39:47 PAGE 4
175 * 输入参数:none;
176 *
177 * 返回数据:none;
178 *
179 * 注 意:none;
180
181 **********************************************************/
182 unsigned char getkey(void)
183 {
184 1 uchar h; //行扫描值
185 1 uchar l; //列扫描值
186 1 SFRPAGE=CONFIG_PAGE ;
187 1 P5=0xF0; //P5.0~P5.3 发全0.准备读列的状态
188 1 if((P5&0xF0)!=0xF0) //如果P5.4~P5.7不全为1,可能有键按下
189 1 {
190 2 delay(100);
191 2 delay(100); //延时去抖动
192 2
193 2 if((P5&0xF0) != 0xF0) //重读高4位,如果还是不全为1,有按键按下
194 2 {
195 3 h=0xFE; //P5.0置0,开始行扫描
196 3 while((h&0x10)!=0xF0) //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
197 3 { //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
198 4 P5=h;
199 4 delay(100);
200 4
201 4 if((P5&0xF0) != 0xF0) //如果P5.4~P5.7不全为1,可能有键按下
202 4 {
203 5 l=((P5&0xF0)|0x0F); //保留P5口高四位.低四位变为1,作为列值
204 5 delay(100);
205 5 return ((~h)+(~l)); //按键值=行扫描值+列扫描值
206 5
207 5 }
208 4 else //如果该行无键按下,行扫描值左移.扫描下一行
209 4
210 4 h=(h<<1)|0x01; //这样做保证每一次就只有一位为"0"
211 4
212 4 }
213 3 }
214 2 }
215 1 return 0; //无键按下,返回0
216 1 }
217
218 /*************************************************
219 * 函数名称:keyup();
220
221 * 函数功能描述:按键的释放;
222
223 * 输入参数:none;
224 *
225 * 返回数据:none;
226 *
227 * 注 意: none;
228 **************************************************/
229
230
231 uchar keyup(void)
232 {
233 1 unsigned char val=0xff;
234 1 while(1)
235 1 {
236 2 val=getkey();
C51 COMPILER V8.04 DE 11/02/2007 13:39:47 PAGE 5
237 2 if(val != 0)
238 2 break;
239 2 }
240 1 while(1)
241 1 {
242 2 if(val!=getkey())break;
243 2 }
244 1 return val;
245 1 }
246
247 /**************************************************
248 * TIMER0
249
250 *定时器0;
251 ***************************************************/
252
253 timer0() interrupt 1
254 {
255 1 TH0=0xfa;
256 1 TL0=0x00; //1ms的初始值
257 1 time_1ms_flag=1;
258 1 time_10ms++;
259 1 if(time_10ms == 10)
260 1 {
261 2 time_50ms++;
262 2 time_10ms=0;
263 2 time_10ms_flag=1;
264 2 }
265 1 if(time_50ms == 5) //设置50ms扫描一次键盘
266 1 {
267 2 time_100ms++;
268 2 time_50ms = 0;
269 2 time_50ms_flag = 1;
270 2 key=keyup(); //按键扫描
271 2 if( key!= 0 ) //表示有按键按下
272 2 {
273 3 send_flag = 1;
274 3 }
275 2 }
276 1 if(time_100ms == 2)
277 1 {time_500ms++;time_100ms=0;time_100ms_flag=1;}
278 1 if(time_500ms == 5)
279 1 {time_1s++;time_500ms=0;time_500ms_flag=1;}
280 1 if(time_1s == 2)
281 1 {time_60s++;time_1s=0;time_1s_flag=1;}
282 1 if(time_60s == 60)
283 1 {time_60s=0;time_60s_flag=1;}
284 1 }
285
286 /************************************************************************
287
288 //主循环程序
289
290 *LED灯点亮表示等待按键.
291
292 ************************************************************************/
293
294 void main()
295 {
296 1 Init_Device();
297 1 SFRPAGE=UART0_PAGE;
298 1 P3_5=1;
C51 COMPILER V8.04 DE 11/02/2007 13:39:47 PAGE 6
299 1 P2_4=1;
300 1 P2_5=1;
301 1 P2_6=1;
302 1 while(1)
303 1 {
304 2 if(send_flag== 1) //表示有按键值,下一步的动作就是送串口显示
305 2 {
306 3 rs232_send_size=0;
307 3 temp=KeySPI(key);
308 3 SFRPAGE=UART0_PAGE;
309 3 TI0=1;
310 3 send_flag= 0;
311 3
312 3 }
313 2 }
314 1 }
315 /***********************************************************************************/
316 // 文件结束
317 /***********************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 677 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 58 ----
IDATA SIZE = ---- ----
BIT SIZE = 8 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -