📄 keyboard.lst
字号:
C51 COMPILER V8.02 KEYBOARD 08/23/2007 12:54:42 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN KeyBoard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe KeyBoard.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)
line level source
*** WARNING C500 IN LINE 1 OF KEYBOARD.C: LICENSE ERROR (R225: REGISTRATION FILE 'TOOLS.INI' NOT FOUND)
1 /*+++++++++++++++++++++++++++++++++++++++++++++++++++/
2 程序名 :KeyBoard.c 键盘扫描子程序
3 入口:
4 出口:键盘值
5 +++++++++++++++++++++++++++++++++++++++++++++++++++*/
6 #include "CPLD.h"
7
8 //===============================================
9 unsigned char idata ucKeyState;
10 float p1;
11 float p2;
12
13 float *p=&p1;
14 unsigned char idata op;
15 int flag=1;//控制小数点个数
16
17 unsigned int f1;
18 unsigned int f2;
19
20
21 void ISR_int1(void) interrupt 2 using 0
22 {
23 1 //ucSKey初始化
24 1
25 1 unsigned int uiI;
26 1 unsigned char ucLcdPosX;
27 1 unsigned char ucLcdPosY;
28 1
29 1 for (uiI=0;uiI<10000;uiI++);
30 1 //延时,去掉抖动
31 1 if(INT1==1) goto end01; //读入int0,
32 1 //关闭外部中断
33 1 for (uiI=0;uiI<10000;uiI++);
34 1 //延时,去掉抖动 ;
35 1 //ucSKey=GetKey();
36 1 ucKeyState=GetKey();
37 1 //按键所对应的符号first=first&ucKeyState;
38 1 while(INT1==0);
39 1
40 1 //按键是否弹起
41 1 if(ucLcdPosX==16||ucLcdPosX==32)
42 1
43 1 {
44 2 ucLcdPosY^=1,ucLcdPosX=0;
45 2
46 2 }
47 1
48 1
49 1
50 1
51 1 //按下后显示按键所对应的单个字符
52 1 if(ucKeyState!='=')
53 1
54 1 {
C51 COMPILER V8.02 KEYBOARD 08/23/2007 12:54:42 PAGE 2
55 2 if(ucKeyState>='0'&&ucKeyState<='9') //如果用户输入的字符是数字,那么就把对相应的操作数进行处理
56 2 {
57 3 if(ucLcdPosX==16||ucLcdPosX==32)
58 3 {
59 4 ucLcdPosY^=1,ucLcdPosX=0;
60 4 }
61 3 DispOneChar(ucLcdPosX++,ucLcdPosY,ucKeyState);
62 3
63 3
64 3 (*p)=(*p)*f1+(ucKeyState-'0')*1.0/f2;
65 3 //'0'的意思是把用户输入的字符转变为对应的数字,如果用户没有输入小数点,那么f1=10,f2=1,否则f1=1,f2的
-值会每次都改变。
66 3 f2=(f2==1)?1:(f2*10);
67 3
68 3 }
69 2 //用户输入的不是数字,则可能是小数点或者运算符
70 2
71 2 else if(ucKeyState=='.'&&flag) //是小数点,那么改变状态变量,准备接受操作数的小数部分
72 2 {
73 3 flag=0;
74 3 f1=1;
75 3 f2=10;
76 3 if(ucLcdPosX==16||ucLcdPosX==32)
77 3 {
78 4 ucLcdPosY^=1,ucLcdPosX=0;
79 4 }
80 3 DispOneChar(ucLcdPosX++,ucLcdPosY,ucKeyState);
81 3
82 3 // DispOneChar(ucLcdPosX++,ucLcdPosY,'.');
83 3
84 3
85 3 }
86 2 else if(ucKeyState=='+'||ucKeyState=='-'||ucKeyState=='*'||ucKeyState=='/') // 是操作符,把操作符保存在
-变量o里,同时改变指针p指向的变量,准备接受第二个操作数,并把状态变量设为始值
87 2
88 2 {
89 3 flag=1;
90 3 op=ucKeyState;
91 3
92 3 p=&p2;
93 3
94 3 f1=10;
95 3 f2=1;
96 3
97 3 cls();
98 3
99 3 ucLcdPosX=0,ucLcdPosY=0;
100 3
101 3 }
102 2 else if(ucKeyState=='a')
103 2 {
104 3 flag=1;
105 3
106 3 cls();
107 3 p1=0,p2=0,p=&p1;
108 3 f1=10;f2=1;
109 3 ucLcdPosX=0;
110 3 }
111 2
112 2
113 2 }
114 1
C51 COMPILER V8.02 KEYBOARD 08/23/2007 12:54:42 PAGE 3
115 1 //NextPos();
116 1
117 1 end01:;
118 1 }
119
120 unsigned char GetKey(void)
121 {
122 1
123 1 unsigned char kc,ucRetKc;
124 1 unsigned char m;
125 1 m=1;
126 1 ucRetKc=XBYTE[0x8000]& 0x0f;
127 1 if(ucRetKc!=0x0f)
128 1 while(m<=0x10){
129 2 if(m==0x01)ucRetKc=XBYTE[0x80f7]&0x0f;
130 2 if(m==0x02)ucRetKc=XBYTE[0x80ef]&0x0f;
131 2 if(m==0x04)ucRetKc=XBYTE[0x80df]&0x0f;
132 2 if(m==0x08)ucRetKc=XBYTE[0x80bf]&0x0f;
133 2 if(m==0x10)ucRetKc=XBYTE[0x807f]&0x0f;
134 2 if(ucRetKc!=0x0f)
135 2 {ucRetKc=ucRetKc<<4;
136 3 kc=ucRetKc+m;
137 3 goto end00;}
138 2 m*=2;}
139 1 end00:
140 1
141 1 switch (kc) //按键所在的具体位置对应于相应的符号
142 1 {
143 2 case 0xE1: kc='+' ;
144 2 break;
145 2 case 0xD1: kc='9' ;
146 2 break;
147 2 case 0xB1: kc='8' ; //--- + 9 8 7 ---
148 2 break;
149 2 case 0x71: kc='7'; //--- - 6 5 4 ---
150 2 break;
151 2 case 0xE2: kc='-' ; //--- * 3 2 1 ---
152 2 break;
153 2 case 0xD2: kc='6' ; //--- / = . 0 ---
154 2 break;
155 2 case 0xB2: kc='5' ;
156 2 break;
157 2 case 0x72: kc='4' ;
158 2 break;
159 2 case 0xE4: kc= '*';
160 2 break;
161 2 case 0xD4: kc= '3';
162 2 break;
163 2 case 0xB4: kc='2' ;
164 2 break;
165 2 case 0x74: kc='1' ;
166 2 break;
167 2
168 2 case 0xE8: kc='/' ;
169 2 break;
170 2 case 0xD8: kc='=' ;
171 2 break;
172 2 case 0xB8: kc= '.';
173 2 break;
174 2 case 0x78: kc='0' ;
175 2 break;
176 2 case 0xF0: kc='a' ;
C51 COMPILER V8.02 KEYBOARD 08/23/2007 12:54:42 PAGE 4
177 2 break;
178 2 case 0xE0: kc='b' ;
179 2 break;
180 2 case 0xC0: kc='c' ;
181 2 break;
182 2 case 0x80: kc='d' ;
183 2 break;
184 2 default: kc='q';
185 2 }
186 1
187 1 return kc;
188 1
189 1 }
C51 COMPILER V8.02 KEYBOARD 08/23/2007 12:54:42 PAGE 5
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
ucKeyState . . . . . . . . . . . . . . PUBLIC IDATA U_CHAR 0000H 1
IE . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A8H 1
size_t . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
f1 . . . . . . . . . . . . . . . . . . PUBLIC DATA U_INT 0000H 2
_DispOneChar . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
f2 . . . . . . . . . . . . . . . . . . PUBLIC DATA U_INT 0002H 2
IP . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B8H 1
flag . . . . . . . . . . . . . . . . . PUBLIC DATA INT 0004H 2
INT1 . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B3H 1
p1 . . . . . . . . . . . . . . . . . . PUBLIC DATA FLOAT 0006H 4
p2 . . . . . . . . . . . . . . . . . . PUBLIC DATA FLOAT 000AH 4
SCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0098H 1
TCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0088H 1
cls. . . . . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
GetKey . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
kc . . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
ucRetKc. . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
m. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
end00. . . . . . . . . . . . . . . . LABEL CODE LABEL ----- -----
ISR_int1 . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
uiI. . . . . . . . . . . . . . . . . * REG * DATA U_INT 0006H 2
ucLcdPosX. . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
ucLcdPosY. . . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
end01. . . . . . . . . . . . . . . . LABEL CODE LABEL ----- -----
op . . . . . . . . . . . . . . . . . . PUBLIC IDATA U_CHAR 0001H 1
T2CON. . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C8H 1
p. . . . . . . . . . . . . . . . . . . PUBLIC DATA PTR 000EH 3
PSW. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D0H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 726 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 17 3
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -