📄 key_new.lst
字号:
C51 COMPILER V7.50 KEY_NEW 08/23/2007 13:11:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEY_NEW
OBJECT MODULE PLACED IN key_new.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE key_new.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //-------------------------------- ------------------------------------------------------------------
2 #include<reg51.h>
3 #include<key.h>
4 #define uchar unsigned char
5 #define uchar unsigned char
6 #define uint unsigned int
7 void delays(void);
8 uchar kbscan(void);
9 bit flag_P2;
10
11 /***********************************
12 //函数名称: kbscan 键盘扫描子程序
13 //传递参数: 无
14 //返 回 值: 无
15 //函数功能: 判断是否有键按下,有返回键值,没有返回0
16 //函数说明: 先根据列判断是否有键按下,没有返回0,有,则逐行扫描以确定按键所在的行,再确定按键所在列
17 // 从而最终确定该按键。
18 ***********************************/
19 uchar kbscan(void)
20 {
21 1 uchar sccode,recode;
22 1 P3=0x0f; //置所有行为低电平,行扫描,列线输入(此时)
23 1 P2=0x00;
24 1 //if((P2&0x02)!=0x020)
25 1 // delays();
26 1 // if((P2&0x02)!=0x02)
27 1 if((P3&0x0f)!=0x0f) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 00
-00),有往下执行
28 1 {
29 2 delays(); //延时去抖动(10ms)
30 2 if((P3&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
31 2 {
32 3 sccode=0xef; //逐行扫描初值(即先扫描第1行)
33 3 while((sccode&0x80)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序
-
34 3 {
35 4 P3=sccode; //输出行扫描码
36 4 if ((P3&0x0f)!=0x0f) //本行有键按下(即P1(真实的状态)的高四位不全为1)
37 4 {
38 5 recode=(P3&0x0f)|0xf0; //列
39 5 //if(flag_P2==0){sccode=0xff;}
40 5 return((~sccode)+(~recode)); //返回行和列
41 5 }
42 4 else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 1111 退出
-while程序
43 4 {
44 5 sccode=(sccode<<1)|0x01;//行扫描码左移一位
45 5 if(sccode==0x7f)
46 5 {
47 6 P2=0x00;
48 6 flag_P2=0;
49 6 }
50 5 else
51 5 {
52 6 P2=0xff;
C51 COMPILER V7.50 KEY_NEW 08/23/2007 13:11:50 PAGE 2
53 6 flag_P2=1;
54 6 }
55 5 }
56 4 }
57 3 }
58 2 }
59 1 else
60 1 {
61 2 return 0; //无键按下,返回0
62 2 }
63 1
64 1 }
65
66 /***********************************
67 //函数名称: delays 键消抖的延时函数
68 //传递参数: 无
69 //返 回 值: 无
70 //函数功能: 延时去抖
71 //函数说明: 无
72 ***********************************/
73 void delays(void)
74 {
75 1 uchar i;
76 1 for(i=300;i>0;i--);
77 1 }
78 //--------------------------------------------------------------------------------------------------
79 // 函数名称: kbscan 键盘扫描子程序
80 // 函数功能: 判断是否有键按下,有返回键值,没有返回0
81 // p1的高四位为列,低四位为行 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2
- P1.1 P1.0
82 // 列4 列3 列2 列1 行4 行3
- 行2 行1
83 // 过程:先根据列判断是否有键按下,没有返回0,有,则逐行扫描以确定按键所在的行,再确定按键所在列
84 // 从而最终确定该按键。
85 //--------------------------------------------------------------------------------------------------
86 uchar kbscan1(void)
87 {
88 1 uchar sccode,recode;
89 1 P3=0xf0; //置所有行为低电平,行扫描,列线输入(此时)
90 1 P2=0x0f;
91 1 if((P2&0x0f)!=0x0f)
92 1 {
93 2 delays(); //延时去抖动(10ms)
94 2 if((P2&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
95 2 {
96 3 sccode=0xFE; //逐行扫描初值(即先扫描第1行)
97 3 while((sccode&0x10)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while
-程序
98 3 {
99 4 P3=sccode; //输出行扫描码
100 4 if ((P2&0x0f)!=0x0f) //本行有键按下(即P1(真实的状态)的高四位不全为1)
101 4 {
102 5 recode=(P3&0x0f)|0xf0;//列
103 5 return((~sccode)); //返回行和列
104 5 }
105 4 else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 111
-1 退出while程序
106 4 {
107 5 sccode=(sccode<<1)|0x01;//行扫描码左移一位
108 5 }
109 4 }
110 3 }
C51 COMPILER V7.50 KEY_NEW 08/23/2007 13:11:50 PAGE 3
111 2 }
112 1
113 1
114 1 if((P3&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111
- 0000),有往下执行
115 1 {
116 2 delays(); //延时去抖动(10ms)
117 2 if((P3&0xf0)!=0xf0) //再次判断列中是否是干扰信号,不是则向下执行
118 2 {
119 3 sccode=0xFE; //逐行扫描初值(即先扫描第1行)
120 3 while((sccode&0x10)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while
-程序
121 3 {
122 4 P3=sccode; //输出行扫描码
123 4 if ((P3&0xf0)!=0xf0) //本行有键按下(即P1(真实的状态)的高四位不全为1)
124 4 {
125 5 recode=(P3&0xf0)|0x0f; //列
126 5 return((~sccode)+(~recode)); //返回行和列
127 5 }
128 4 else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 111
-1 退出while程序
129 4 {
130 5 sccode=(sccode<<1)|0x01;//行扫描码左移一位
131 5 }
132 4 }
133 3 }
134 2 }
135 1 else
136 1 {
137 2 return 0; //无键按下,返回0
138 2 }
139 1
140 1 }
141
142
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 199 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -