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