CT107D板子上的键盘可以通过跳线J5选择矩阵键盘与独立键盘。
简单地检测P30,P31,P32,P33口的电平变化(低电平按下),再通过去抖动处理过滤干扰就可以较为精准地得到键盘按下的状态。(注意在操作端口前先进行位定义sbit,定义端口对应的变量。)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code dig_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff};
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uchar times=0;
uchar mode=0;
void delay(uint t)
{
while(t--);
while(t--);
}
void select(uchar channel)
{
switch(channel)
{
case 4:
P2=(P2&0X1f)|0X80;//不改变P2其他IO口电平的情况下改变138译码器输入
break;
case 5:
P2=(P2&0X1f)|0Xa0;
break;
case 6:
P2=(P2&0X1f)|0Xc0;
break;
case 7:
P2=(P2&0X1f)|0Xe0;
break;
}
}
void display(uchar dig)
{
select(6);
P0=0X01;
select(7);
P0=dig_code[dig];
}
void scankey_signal()
{
if(S7==0)//检测到S7按下
{
delay(100);
if(S7==0)//延迟一段时间再次检测S7
{
while(S7==0);//等待S7松开,否则一直执行该循环
display(7);//实现S7按下后松开显示数字的功能
}
}
if(S6==0)
{
delay(100);
if(S6==0)
{
display(6);
while(S6==0);
display(18);//实现S6按下时显示数字,松开后熄灭的功能
}
}
if(S5==0)
{
delay(100);
if(S5==0)
{
display(5);
while(S5==0);
times+=1;
if(times==10)
{
times=0;
}
display(times);//实现按键按下时显示当前键位,松开时显示按下次数
}
}
if(S4==0)
{
delay(100);
if(S4==0)
{
while(S4==0);
display(4);
mode=~mode;//每次按键按下时,模式反转
}
}
}
int main()
{
while(1)
{
scankey_signal();
}
}