📄 keytest.lst
字号:
C51 COMPILER V7.50 KEYTEST 11/21/2007 23:29:53 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEYTEST
OBJECT MODULE PLACED IN keytest.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE keytest.c BROWSE DEBUG OBJECTEXTEND TABS(3)
line level source
1 #include<reg51.h>
2 #include<math.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 #define KEYPORT P1
6 static unsigned long int counter;//用来记录输入的数据
7 static unsigned long int counter_save;
8 unsigned char value[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
9 char code row[4]={0x70,0xb0,0xd0,0xe0};
10 char code line[4]={0x07,0x0b,0x0d,0x0e};
11 unsigned char code LED[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
12 bit XFLAG=0;
13 char k;
14 uchar keyvalue;
15
16 //----------------------------------------------------------------------
17 senddata(uchar b)
18 {
19 1 char i;
20 1 i=b;
21 1
22 1 SBUF=LED[i];
23 1 while(TI==0);
24 1 TI=0;
25 1
26 1
27 1 }
28 //----------------------------延时程序---------------------------
29 void delay(uint delaytime)
30 {
31 1 char i;
32 1 for(;delaytime>0;delaytime--)
33 1 for(i=0;i<121;i++)
34 1 {;}
35 1 }
36 //-------------------------------------------------------------------
37
38 uchar keyscan(void)
39 {
40 1 uchar xinvalue,yinvalue,i,j;
41 1 uchar kvalue;
42 1 KEYPORT=0x0f;
43 1 while(KEYPORT==0x0f);
44 1
45 1 if(KEYPORT!=0x0f)
46 1 {
47 2 delay(20);//延时消抖
48 2 if(KEYPORT!=0x0f)
49 2 {
50 3 KEYPORT=0x0f;//输出行扫描码
51 3 xinvalue=KEYPORT;
52 3 KEYPORT=0xf0;//输出列扫描码
53 3 yinvalue=KEYPORT;
54 3 for(i=0;i<4;i++)
55 3 {
C51 COMPILER V7.50 KEYTEST 11/21/2007 23:29:53 PAGE 2
56 4 if((xinvalue&0x0f)==line[i])
57 4 for(j=0;j<4;j++)
58 4 {
59 5 if((yinvalue&0xf0)==row[j])
60 5 {
61 6 kvalue=value[i][j];
62 6 return(kvalue);//反回按键值
63 6 }
64 5
65 5 }
66 4 }
67 3 }
68 2 }
69 1 }
70 //------------------------keyprocess函数-----------------------
71 void keyprocess(uchar kvalue)
72 {
73 1 char cosave[8];
74 1 char i;
75 1 char a=0;
76 1 a=0;
77 1 //输出数据
78 1 switch(kvalue)
79 1 {
80 2 case 0:
81 2 senddata(0);
82 2 counter=counter*10;
83 2 break;
84 2 case 1:
85 2 senddata(1);
86 2 counter=counter*10+1;
87 2 break;
88 2 case 2:
89 2 senddata(2);
90 2 counter=counter*10+2;
91 2 break;
92 2 case 3:
93 2 senddata(3);
94 2 counter=counter*10+3;
95 2 break;
96 2 case 4:
97 2 senddata(4);
98 2 counter=counter*10+4;
99 2 break;
100 2 case 5:
101 2 senddata(5);
102 2 counter=counter*10+5;
103 2 break;
104 2 case 6:
105 2 senddata(6);
106 2 counter=counter*10+6;
107 2 break;
108 2 case 7:
109 2 senddata(7);
110 2 counter=counter*10+7;
111 2 break;
112 2 case 8:
113 2 senddata(8);
114 2 counter=counter*10+8;
115 2 break;
116 2 case 9:
117 2 senddata(9);
C51 COMPILER V7.50 KEYTEST 11/21/2007 23:29:53 PAGE 3
118 2 counter=counter*10+9;
119 2 break;
120 2 case 10:
121 2 for(i=0;i<8;i++)
122 2 senddata(10);
123 2 counter=0;
124 2 counter_save=0;
125 2 break;
126 2 case 11:
127 2 for(i=0;i<8;i++)
128 2 senddata(10);//清除屏幕
129 2 if(XFLAG==0)//查询是加法还是减法
130 2 counter_save=counter_save+counter;
131 2 if(XFLAG==1)
132 2 counter_save=counter_save-counter;
133 2 counter=counter_save;
134 2 for(i=0;i<8;i++)
135 2 {
136 3 cosave[i]=(counter_save%10);
137 3 counter_save/=10;
138 3 }
139 2 for(i=7;i>=0;i--)
140 2 {
141 3 if(cosave[i]>0)
142 3 {
143 4 a=i;
144 4 break;
145 4 }
146 3 }
147 2 for(;a>=0;a--)
148 2 {
149 3 senddata(cosave[a]);
150 3 }
151 2 break;
152 2 case 12:
153 2 XFLAG=0;
154 2 counter_save=counter;//保存加数
155 2 counter=0;//清除原来计数用来记录下一个输入的加数
156 2 for(i=0;i<8;i++)
157 2 senddata(10);//清除屏幕以便显示下一个加数
158 2 break;
159 2 case 13:
160 2 XFLAG=1;//减法标志位有效
161 2 counter_save=counter;//保存被减数
162 2 counter=0;//清除计数用来储存减数
163 2 for(i=0;i<8;i++)
164 2 senddata(10);//清除屏幕用来显示下一个减数
165 2 break;
166 2 case 14:
167 2 for(i=0;i<8;i++)
168 2 senddata(10);//清除屏幕可以显示以下的数据
169 2 counter=counter*10+1;
170 2 counter_save=counter;
171 2 for(i=0;i<8;i++)
172 2 {
173 3 cosave[i]=counter_save%10;
174 3 counter_save/=10;
175 3 }
176 2 for(i=7;i>=0;i--)
177 2 {
178 3 if(cosave[i]>0)
179 3 {
C51 COMPILER V7.50 KEYTEST 11/21/2007 23:29:53 PAGE 4
180 4 a=i;
181 4 break;
182 4 }
183 3 }
184 2 for(;a>=0;a--)
185 2 {
186 3 senddata(cosave[a]);
187 3 }
188 2 break;
189 2
190 2 case 15:
191 2 for(i=0;i<8;i++)
192 2 senddata(10);//清除屏幕可以显示以下的数据
193 2 counter=counter*10-1;
194 2 counter_save=counter;
195 2 for(i=0;i<8;i++)
196 2 {
197 3 cosave[i]=counter_save%10;
198 3 counter_save/=10;
199 3 }
200 2 for(i=7;i>=0;i--)
201 2 {
202 3 if(cosave[i]>0)
203 3 {
204 4 a=i;
205 4 break;
206 4 }
207 3
208 3 }
209 2 for(;a>=0;a--)
210 2 {
211 3 senddata(cosave[a]);
212 3 }
213 2 break;
214 2 }
215 1 }
216
217 //----------------------------主函数--------------------------------------
218 void main(void)
219 {
220 1 counter=0;
221 1 counter_save=0;
222 1 for(k=0;k<8;k++)
223 1 senddata(10);
224 1 while(1)
225 1 {
226 2
227 2 keyvalue=keyscan();
228 2 if(keyvalue>=0&&keyvalue<=15)
229 2 keyprocess(keyvalue);
230 2 delay(600);
231 2 }
232 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1238 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 10
IDATA SIZE = ---- ----
C51 COMPILER V7.50 KEYTEST 11/21/2007 23:29:53 PAGE 5
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 + -