📄 keyboard.lst
字号:
C51 COMPILER V8.02 KEYBOARD 08/23/2007 14:58:57 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 float f1;
18 float f2;
19
20
21
22 void ISR_int1(void) interrupt 2 using 0
23 {
24 1 //ucSKey初始化
25 1
26 1 unsigned int uiI;
27 1 unsigned char ucLcdPosX;
28 1 unsigned char ucLcdPosY;
29 1
30 1 for (uiI=0;uiI<10000;uiI++);
31 1 //延时,去掉抖动
32 1 if(INT1==1) goto end01; //读入int0,
33 1 //关闭外部中断
34 1 for (uiI=0;uiI<10000;uiI++);
35 1 //延时,去掉抖动 ;
36 1 //ucSKey=GetKey();
37 1 ucKeyState=GetKey();
38 1 //按键所对应的符号first=first&ucKeyState;
39 1 while(INT1==0);
40 1
41 1 //按键是否弹起
42 1 if(ucLcdPosY==16||ucLcdPosY==32)
43 1
44 1 {
45 2 ucLcdPosX^=1,ucLcdPosY=0;
46 2
47 2 }
48 1
49 1
50 1
51 1
52 1 //按下后显示按键所对应的单个字符
53 1 if(ucKeyState!='=')
54 1
C51 COMPILER V8.02 KEYBOARD 08/23/2007 14:58:57 PAGE 2
55 1 {
56 2 if(ucKeyState>='0'&&ucKeyState<='9') //如果用户输入的字符是数字,那么就把对相应的操作数进行处理
57 2 {
58 3 if(ucLcdPosY==16||ucLcdPosY==32)
59 3
60 3 {
61 4 ucLcdPosX^=1,ucLcdPosY=0;
62 4
63 4 }
64 3 DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);
65 3
66 3
67 3 (*p)=(*p)*f1+(ucKeyState-'0')/f2;
68 3 //'0'的意思是把用户输入的字符转变为对应的数字,如果用户没有输入小数点,那么f1=10,f2=1,否则f1=1,f2的
-值会每次都改变。
69 3 f2=((f2-1)<1)?1:(f2*10);
70 3
71 3 }
72 2 //用户输入的不是数字,则可能是小数点或者运算符
73 2
74 2 else if(ucKeyState=='.'&&flag) //是小数点,那么改变状态变量,准备接受操作数的小数部分
75 2 {
76 3 flag=0;
77 3 f1=1;
78 3 f2=10;
79 3 if(ucLcdPosY==16||ucLcdPosY==32)
80 3
81 3 {
82 4 ucLcdPosX^=1,ucLcdPosY=0;
83 4
84 4 }
85 3 DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);
86 3
87 3 // DispOneChar(ucLcdPosX++,ucLcdPosY,'.');
88 3
89 3
90 3 }
91 2 else if(ucKeyState=='+'||ucKeyState=='-'||ucKeyState=='*'||ucKeyState=='/') // 是操作符,把操作符保存在
-变量o里,同时改变指针p指向的变量,准备接受第二个操作数,并把状态变量设为始值
92 2
93 2 {
94 3 flag=1;
95 3 op=ucKeyState;
96 3
97 3 p=&p2;
98 3
99 3 f1=10;
100 3 f2=1;
101 3
102 3 cls();
103 3
104 3 ucLcdPosX=0,ucLcdPosY=0;
105 3
106 3 }
107 2 else if(ucKeyState=='a')
108 2 {
109 3 flag=1;
110 3
111 3 cls();
112 3 p1=0,p2=0,p=&p1;
113 3 f1=10;f2=1;
114 3 ucLcdPosY=0;
C51 COMPILER V8.02 KEYBOARD 08/23/2007 14:58:57 PAGE 3
115 3 }
116 2
117 2
118 2 }
119 1
120 1 //NextPos();
121 1
122 1 end01:;
123 1 }
124
125 unsigned char GetKey(void)
126 {
127 1
128 1 unsigned char kc,ucRetKc;
129 1 unsigned char m;
130 1 m=1;
131 1 ucRetKc=XBYTE[0x8000]& 0x0f;
132 1 if(ucRetKc!=0x0f)
133 1 while(m<=0x10){
134 2 if(m==0x01)ucRetKc=XBYTE[0x80f7]&0x0f;
135 2 if(m==0x02)ucRetKc=XBYTE[0x80ef]&0x0f;
136 2 if(m==0x04)ucRetKc=XBYTE[0x80df]&0x0f;
137 2 if(m==0x08)ucRetKc=XBYTE[0x80bf]&0x0f;
138 2 if(m==0x10)ucRetKc=XBYTE[0x807f]&0x0f;
139 2 if(ucRetKc!=0x0f)
140 2 {ucRetKc=ucRetKc<<4;
141 3 kc=ucRetKc+m;
142 3 goto end00;}
143 2 m*=2;}
144 1 end00:
145 1
146 1 switch (kc) //按键所在的具体位置对应于相应的符号
147 1 {
148 2 case 0xE1: kc='+' ;
149 2 break;
150 2 case 0xD1: kc='9' ;
151 2 break;
152 2 case 0xB1: kc='8' ; //--- + 9 8 7 ---
153 2 break;
154 2 case 0x71: kc='7'; //--- - 6 5 4 ---
155 2 break;
156 2 case 0xE2: kc='-' ; //--- * 3 2 1 ---
157 2 break;
158 2 case 0xD2: kc='6' ; //--- / = . 0 ---
159 2 break;
160 2 case 0xB2: kc='5' ;
161 2 break;
162 2 case 0x72: kc='4' ;
163 2 break;
164 2 case 0xE4: kc= '*';
165 2 break;
166 2 case 0xD4: kc= '3';
167 2 break;
168 2 case 0xB4: kc='2' ;
169 2 break;
170 2 case 0x74: kc='1' ;
171 2 break;
172 2
173 2 case 0xE8: kc='/' ;
174 2 break;
175 2 case 0xD8: kc='=' ;
176 2 break;
C51 COMPILER V8.02 KEYBOARD 08/23/2007 14:58:57 PAGE 4
177 2 case 0xB8: kc= '.';
178 2 break;
179 2 case 0x78: kc='0' ;
180 2 break;
181 2 case 0xF0: kc='a' ;
182 2 break;
183 2 case 0xE0: kc='b' ;
184 2 break;
185 2 case 0xC0: kc='c' ;
186 2 break;
187 2 case 0x80: kc='d' ;
188 2 break;
189 2 default: kc='q';
190 2 }
191 1
192 1 return kc;
193 1
194 1 }
C51 COMPILER V8.02 KEYBOARD 08/23/2007 14:58:57 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 FLOAT 0000H 4
_DispOneChar . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
f2 . . . . . . . . . . . . . . . . . . PUBLIC DATA FLOAT 0004H 4
IP . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B8H 1
flag . . . . . . . . . . . . . . . . . PUBLIC DATA INT 0008H 2
INT1 . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B3H 1
p1 . . . . . . . . . . . . . . . . . . PUBLIC DATA FLOAT 000AH 4
p2 . . . . . . . . . . . . . . . . . . PUBLIC DATA FLOAT 000EH 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 0012H 3
PSW. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D0H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 777 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 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 + -