📄 key.lst
字号:
C51 COMPILER V8.08 KEY 02/14/2009 08:52:26 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************
2 #include<AT89X51.H>
3 #include"key.h"
4
5 unsigned char temp;
6 unsigned char key;
7 unsigned char i,j;
8
9 void delay()
10 {
11 for(i=50;i>0;i--)
12 for(j=200;j>0;j--);
13 }
14 unsigned char keyscan(void)
15 {
16 P3=0xff;
17 P3_4=0;
18 temp=P3;
19 temp=temp & 0x0f;
20 if (temp!=0x0f)
21 {
22 delay();
23 temp=P3;
24 temp=temp & 0x0f;
25 if (temp!=0x0f)
26 {
27 temp=P3;
28 temp=temp & 0x0f;
29 switch(temp)
30 {
31 case 0x0e:key=0;break;
32 case 0x0d:key=1;break;
33 case 0x0b:key=2;break;
34 case 0x07:key=3;break;
35 }
36 }
37 }
38 P3=0xff;
39 P3_5=0;
40 temp=P3;
41 temp=temp & 0x0f;
42 if (temp!=0x0f)
43 {
44 delay();
45 temp=P3;
46 temp=temp & 0x0f;
47 if (temp!=0x0f)
48 {
49 temp=P3;
50 temp=temp & 0x0f;
51 switch(temp)
52 {
53 case 0x0e:key=4;break;
54 case 0x0d:key=5;break;
55 case 0x0b:key=6;break;
C51 COMPILER V8.08 KEY 02/14/2009 08:52:26 PAGE 2
56 case 0x07:key=7;break;
57 }
58 }
59 }
60
61 P3=0xff;
62 P3_6=0;
63 temp=P3;
64 temp=temp & 0x0f;
65 if (temp!=0x0f)
66 {
67 delay();
68 temp=P3;
69 temp=temp & 0x0f;
70 if (temp!=0x0f)
71 {
72 temp=P3;
73 temp=temp & 0x0f;
74 switch(temp)
75 {
76 case 0x0e:key=8;break;
77 case 0x0d:key=9;break;
78 case 0x0b:key=10;break;
79 case 0x07:key=11;break;
80 }
81 }
82 }
83
84 P3=0xff;
85 P3_7=0;
86 temp=P3;
87 temp=temp & 0x0f;
88 if (temp!=0x0f)
89 {
90 delay();
91 temp=P3;
92 temp=temp & 0x0f;
93 if (temp!=0x0f)
94 {
95 temp=P3;
96 temp=temp & 0x0f;
97 switch(temp)
98 {
99 case 0x0e:key=12;break;
100 case 0x0d:key=13;break;
101 case 0x0b:key=14;break;
102 case 0x07:key=15;break;
103 }
104 }
105 }
106 return(key);
107 }
108
109 //-------------------------------- ------------------------------------------------------------------
110 // 函数名称: program_SCANkey
111 // 函数功能: 程序扫描键盘,
112 // 有键按下完成按键处理,无键按下直接返回
113 //--------------------------------------------------------------------------------------------------
114
115 unsigned char i,j;
116 bit judge_hitkey() ;
117 unsigned char scan_key() ;
C51 COMPILER V8.08 KEY 02/14/2009 08:52:26 PAGE 3
118
119 void delay()
120 {
121 for(i=500;i>0;i--)
122 for(j=200;j>0;j--);
123 }
124 unsigned char program_SCANkey()
125 {
126 unsigned char key_code;
127 if(judge_hitkey()) //判断是否有键按下
128 {
129 delay(); //延时20ms左右,消除抖动干扰
130 if(judge_hitkey()) //判断是否有效按键
131 {
132 key_code=scan_key();// key_code=scan_key();;// //获取键值
133 while(judge_hitkey()); //等待按键释放
134 {
135 }
136 return(key_code); // key_manage(key_code); //键盘扫描、键盘散转、按键处理
137 }
138 }
139 }
140
141 //--------------------------------------------------------------------------------------------------
142 // 函数名称: judge_hitkey
143 // 函数功能: //判断是否有键按下,有返回1,没有返回0
144 // 列判断,还可以用行判断。
145 //--------------------------------------------------------------------------------------------------
146 bit judge_hitkey() //判断是否有键按下,有返回1,没有返回0
147 {
148 unsigned char scancode,keycode;
149 scancode=0x0F; //开始设定P1.0~P1.3输出全1(初值)即表明无键闭合
150 KEY=scancode;
151 keycode=KEY; //读取P1.0~P1.3的真实状态,从而确定有没有键被按下
152 if(keycode==0x0F)
153 return(0); //全1则无键闭合
154 else
155 return(1); //否则有键闭合
156 }
157 /*******************************************************
158 //--------------------------------------------------------------------------------------------------
159 // 函数名称: scan_key
160 // 函数功能: //扫描键盘,返回键值(高四位代表行,低四位代表列)
161 // 说明:scancode 扫描码,keycode 键值,keycode_line 行,keycode_row 列
162 // 过程:先扫描行,确定那行的按键被按下。再扫描列,确定那列的按键被按下,从而确定那个按键被按下。
163 //--------------------------------------------------------------------------------------------------
164
165 unsigned char scan_key() //扫描键盘,返回键值(高四位代表行,低四位代表列)
166 {
167 unsigned char scancode,keycode,keycode_line,keycode_row;
168 scancode=0xF0; //列置低,行置高
169 KEY = scancode; //输入扫描码,扫描行
170 keycode_line=KEY; //KEY的值是与键盘相连的P的状态值。若没有按键按下KEY的值为0xF0,若有按键按
-下则KEY的值就不是0xF0
171 delay();
172 scancode=0x0F; //列置高,行置低
173 KEY=scancode; //输入扫描码,扫描列
174 keycode_row=KEY; //KEY的值是与键盘相连的P的状态值。若没有按键按下KEY的值为0x0F,若有按键按下则
-KEY的值就不是0x0F
175 keycode = ((keycode_line&0xF0)|(keycode_row&0x0F));
176 return(keycode);
177 }
C51 COMPILER V8.08 KEY 02/14/2009 08:52:26 PAGE 4
178 *****************************************************/
179 #include <AT89X51.H>
180 #define L1 P1_0
181
182 void delay02s(void) //延时0.2秒子程序
183 {
184 1 unsigned char i,j,k;
185 1 for(i=20;i>0;i--)
186 1 for(j=20;j>0;j--)
187 1 for(k=248;k>0;k--);
188 1 }
189
190
191 void main(void)
192 {
193 1 while(1)
194 1
195 1 {
196 2 L1=0;
197 2 delay02s();
198 2 L1=1;
199 2 delay02s();
200 2 }
201 1
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 25 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
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 + -