📄 key.lst
字号:
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN Key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Key.c LARGE BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS
line level source
1 #define __KEY_H__
2 #include "Config.h"
3
4 #define KEYPORT P6 //定义端口
5 #define KEYPORTPINCFG P6PINCFG //定义端口
6 #define KEYMASK 0x0F //按键的屏蔽码,屏蔽掉高位的LED,定义成宏方便使用.
7 /********************************************************************************************************
8 **函数名称:KeyDelay
9 **函数功能:用于按键的延时去抖
10 **输 入:uchar DelayLoops 延时循环次数,控制延时时间
11 **输 出:无
12 ********************************************************************************************************/
13 void KeyDelay(uchar DelayLoops)
14 {
15 1 uint i;
16 1 for(; DelayLoops > 0; DelayLoops --)
17 1 {
18 2 for(i = 5000; i > 0; i --)
19 2 {;}
20 2 }
21 1 }
22
23 /****************************************************************************************************
24 **函数名称:KeyRead
25 **函数功能:读按键程序
26 **输 入:无
27 **输 出:返回读到的键值
28 **全局变量:uchar code KeyDecode[4]->用于按键解码
29 ** GlKeyFlag 保存上次的键值
30 ****************************************************************************************************/
31 uchar code KeyDecode[4] = {0x0E,0x0D,0x0B,0x07}; //按下不同键对应的代码
32 uchar GlKeyFlag = KEYMASK; //纪录上一次按键的全局变量
33
34 uchar KeyRead(void)
35 {
36 1 uchar KeyBuf,KeyBuf1,i;
37 1
38 1 PORTINEN |= (BIT0 | BIT1 | BIT2 | BIT3); //使能按键输入
39 1 //KEYPORTPINCFG |= 0x0F; //设置低四位为输入
40 1 //------------------------------------------------------------------------------
41 1 //判定本次有无按键按下
42 1 //------------------------------------------------------------------------------
43 1 KeyBuf = KEYPORT;
44 1 KeyBuf &= KEYMASK; //屏蔽无关位
45 1 if(KeyBuf1 != KEYMASK) //有键按下
46 1 {
47 2 KeyDelay(1); //延时去抖
48 2
49 2 KeyBuf1 = KEYPORT;
50 2 KeyBuf1 &= KEYMASK; //再读
51 2 if((KeyBuf1 != KEYMASK) && (KeyBuf1 == KeyBuf))
52 2 //延时后还是有按键中断且与第一次的相同说明有键按下
53 2 {;} //有键按下,则键值被保存,随后再判断
54 2 else
55 2 {
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 2
56 3 KeyBuf = KEYMASK;
57 3 KeyBuf1 = KEYMASK; //无键按下,将所有标志清零
58 3 }
59 2 }
60 1 //------------------------------------------------------------------------------
61 1 //根据本次读到的键值和全局变量保存的值判定有无键按下
62 1 //------------------------------------------------------------------------------
63 1 if(KeyBuf == KEYMASK) //本次无键按下,清全局标志
64 1 {
65 2 if(GlKeyFlag != KEYMASK) //如果全局变量保存的是有键状态,则将其清除
66 2 {
67 3 GlKeyFlag = KEYMASK; //保存无键状态
68 3 }
69 2 }
70 1 else //如果检测到有键按下
71 1 {
72 2 if(GlKeyFlag == KEYMASK) //如果上次没有键按下则判定这次按键有效
73 2 {
74 3 GlKeyFlag = KeyBuf; //将这次的键值保存到全局变量
75 3 }
76 2 else //这次的键值与上次的键值一样或为其他键值,说明健还未松手,判定无键
77 2 {
78 3 KeyBuf = KEYMASK; //判定无键
79 3 }
80 2 }
81 1 //------------------------------------------------------------------------------
82 1 //返回结果
83 1 //------------------------------------------------------------------------------
84 1 if(KeyBuf != KEYMASK) //如果有键按下
85 1 {
86 2 for(i = 0; i < 4; i ++) //通过读到的代码查找按键
87 2 {
88 3 if(KeyBuf == KeyDecode[i])
89 3 {
90 4 return (i + 1 + 0x30); //返回按键对应的ASIIC '1','2','3','4'
91 4 }
92 3 }
93 2 }
94 1
95 1 return 0; //如果没有键按下或是没有找到对应的键值,则返回0,否则返回对应的字符
96 1 }
97
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _KeyDelay (BEGIN)
; SOURCE LINE # 13
;---- Variable 'DelayLoops' assigned to Register 'R7' ----
; SOURCE LINE # 14
; SOURCE LINE # 16
0000 ?C0001:
0000 EF MOV A,R7
0001 D3 SETB C
0002 9400 SUBB A,#00H
0004 4010 JC ?C0007
; SOURCE LINE # 17
; SOURCE LINE # 18
;---- Variable 'i' assigned to Register 'R4/R5' ----
0006 7D88 MOV R5,#088H
0008 7C13 MOV R4,#013H
000A ?C0004:
; SOURCE LINE # 19
000A ED MOV A,R5
000B 1D DEC R5
000C 7001 JNZ ?C0022
000E 1C DEC R4
000F ?C0022:
000F ED MOV A,R5
0010 4C ORL A,R4
0011 70F7 JNZ ?C0004
; SOURCE LINE # 20
0013 ?C0003:
0013 1F DEC R7
0014 80EA SJMP ?C0001
; SOURCE LINE # 21
0016 ?C0007:
0016 22 RET
; FUNCTION _KeyDelay (END)
; FUNCTION KeyRead (BEGIN)
; SOURCE LINE # 34
;---- Variable 'KeyBuf1' assigned to Register 'R6' ----
; SOURCE LINE # 35
; SOURCE LINE # 38
0000 43F70F ORL PORTINEN,#0FH
; SOURCE LINE # 43
;---- Variable 'KeyBuf' assigned to Register 'R3' ----
0003 ABC8 MOV R3,P6
; SOURCE LINE # 44
0005 EB MOV A,R3
0006 540F ANL A,#0FH
0008 FB MOV R3,A
; SOURCE LINE # 45
0009 EE MOV A,R6
000A 640F XRL A,#0FH
000C 6017 JZ ?C0008
; SOURCE LINE # 46
; SOURCE LINE # 47
000E 7F01 MOV R7,#01H
0010 120000 R LCALL _KeyDelay
; SOURCE LINE # 49
0013 AEC8 MOV R6,P6
; SOURCE LINE # 50
0015 EE MOV A,R6
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 4
0016 540F ANL A,#0FH
0018 FE MOV R6,A
; SOURCE LINE # 51
0019 640F XRL A,#0FH
001B 6004 JZ ?C0009
001D EE MOV A,R6
001E 6B XRL A,R3
001F 6004 JZ ?C0008
; SOURCE LINE # 53
0021 ?C0009:
; SOURCE LINE # 55
; SOURCE LINE # 56
0021 7B0F MOV R3,#0FH
; SOURCE LINE # 57
0023 7E0F MOV R6,#0FH
; SOURCE LINE # 58
; SOURCE LINE # 59
0025 ?C0008:
; SOURCE LINE # 63
0025 EB MOV A,R3
0026 B40F0D CJNE A,#0FH,?C0011
; SOURCE LINE # 64
; SOURCE LINE # 65
0029 900000 R MOV DPTR,#GlKeyFlag
002C E0 MOVX A,@DPTR
002D 640F XRL A,#0FH
002F 6012 JZ ?C0013
; SOURCE LINE # 66
; SOURCE LINE # 67
0031 740F MOV A,#0FH
0033 F0 MOVX @DPTR,A
; SOURCE LINE # 68
; SOURCE LINE # 69
0034 800D SJMP ?C0013
0036 ?C0011:
; SOURCE LINE # 71
; SOURCE LINE # 72
0036 900000 R MOV DPTR,#GlKeyFlag
0039 E0 MOVX A,@DPTR
003A B40F04 CJNE A,#0FH,?C0014
; SOURCE LINE # 73
; SOURCE LINE # 74
003D EB MOV A,R3
003E F0 MOVX @DPTR,A
; SOURCE LINE # 75
003F 8002 SJMP ?C0013
0041 ?C0014:
; SOURCE LINE # 77
; SOURCE LINE # 78
0041 7B0F MOV R3,#0FH
; SOURCE LINE # 79
; SOURCE LINE # 80
0043 ?C0013:
; SOURCE LINE # 84
0043 EB MOV A,R3
0044 640F XRL A,#0FH
0046 6014 JZ ?C0016
; SOURCE LINE # 85
; SOURCE LINE # 86
;---- Variable 'i' assigned to Register 'R7' ----
0048 E4 CLR A
0049 FF MOV R7,A
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 5
004A ?C0017:
; SOURCE LINE # 87
; SOURCE LINE # 88
004A EF MOV A,R7
004B 900000 R MOV DPTR,#KeyDecode
004E 93 MOVC A,@A+DPTR
004F B50305 CJNE A,AR3,?C0019
; SOURCE LINE # 89
; SOURCE LINE # 90
0052 EF MOV A,R7
0053 2431 ADD A,#031H
0055 FF MOV R7,A
0056 22 RET
; SOURCE LINE # 91
; SOURCE LINE # 92
0057 ?C0019:
0057 0F INC R7
0058 EF MOV A,R7
0059 B404EE CJNE A,#04H,?C0017
; SOURCE LINE # 93
005C ?C0016:
; SOURCE LINE # 95
005C 7F00 MOV R7,#00H
; SOURCE LINE # 96
005E ?C0021:
005E 22 RET
; FUNCTION KeyRead (END)
C51 COMPILER V8.01 KEY 09/30/2007 11:14:56 PAGE 6
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P6 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C8H 1
size_t . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
KeyRead. . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
KeyBuf . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0003H 1
KeyBuf1. . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
i. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
GlKeyFlag. . . . . . . . . . . . . . . PUBLIC XDATA U_CHAR 0000H 1
wchar_t. . . . . . . . . . . . . . . . TYPEDEF ----- CHAR ----- 1
KeyDecode. . . . . . . . . . . . . . . PUBLIC CODE ARRAY 0000H 4
PORTINEN . . . . . . . . . . . . . . . SFR DATA U_CHAR 00F7H 1
va_list. . . . . . . . . . . . . . . . TYPEDEF ----- PTR ----- 3
_KeyDelay. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
DelayLoops . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
i. . . . . . . . . . . . . . . . . . * REG * DATA U_INT 0004H 2
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 118 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = 1 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -