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();
}
}

矩阵键盘

如前文图片,当J5的1与2短接时选择到矩阵键盘,通过行(Row)与列(Column)的扫描来判断按键的按下与否。例如:行1输出低电平,行2,3,4初始化为高电平,列1,2,3,4初始化为高电平。当列1,2,3,4中检测到有低电平产生时,可根据横纵坐标判断按键位置。

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sfr P4=0xc0;//P4端口未包含在标准51库中,需要额外定义
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C4=P3^4;
sbit C3=P3^5;
sbit C2=P4^2;
sbit C1=P4^4;/初始位定义
uchar code dig_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void select(uchar channel)
{
switch(channel)
{
case 4: P2=(P2&0X1F)|0x80;break;
case 5: P2=(P2&0X1F)|0XA0;break;
case 6: P2=(P2&0X1F)|0XC0;break;
case 7: P2=(P2&0X1F)|0XE0;break;
}
}
void init()
{
select(4);
P0=0XFF;
select(5);
P0=0X00;
}
void delay(uint t)
{
while(t--);
}

void display(uchar num)
{
select(6);
P0=0X01;
select(7);
P0=dig_code[num];
}

void key_matrix()
{
R1=0;
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
delay(500);
while(C1==0);
display(0);
}

if(C2==0)
{
delay(500);
while(C2==0);
display(1);
}

if(C3==0)
{
delay(500);
while(C3==0);
display(2);
}

if(C4==0)
{
delay(500);
while(C4==0);
display(3);
}
//判断第一行按键的情况
R2=0;
R1=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
delay(500);
while(C1==0);
display(4);
}

if(C2==0)
{
delay(500);
while(C2==0);
displaaa(5);
}

if(C3==0)
{
delay(500);
while(C3==0);
display(6);
}

if(C4==0)
{
delay(500);
while(C4==0);
display(7);
}
//判断第二行按键的情况
R3=0;
R2=R1=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
delay(500);
while(C1==0);
display(8);
}

if(C2==0)
{
delay(500);
while(C2==0);
display(9);
}

if(C3==0)
{
delay(500);
while(C3==0);
display(10);
}

if(C4==0)
{
delay(500);
while(C4==0);
display(11);
}
//判断第三行按键的情况
R4=0;
R2=R3=R1=1;
C1=C2=C3=C4=1;
if(C1==0)
{
delay(500);
while(C1==0);
display(12);
}

if(C2==0)
{
delay(500);
while(C2==0);
display(13);
}

if(C3==0)
{
delay(500);
while(C3==0);
display(14);
}

if(C4==0)
{
delay(500);
while(C4==0);
display(15);
}
//判断第四行按键的情况
}


void main()
{
init();
while(1)
{
key_matrix();
}
}