目录
型号:STC8952RC
keil5:使用ATC8952
1 矩阵按键模块控制原理
1.1独立按键控制原理
按键K2未按下,接地GND的一端与接P30口的一端断开不导通,当K2按键按下,按键内部金属相接导通,从P30将接地端的0电势输入单片机芯片,芯片就知道了K2被按下(因为该型单片机P口均为弱上拉、强下拉、准(准相当于基本)双向通信即高电平驱动能力弱,低电平驱动能力强;即使P某一端输出为高电平,但外界直接接地为0,该高电平会被0强下拉为0,这样就做到了相当于输入为0)
1.2 矩阵按键模块控制原理
为了节省IO口,可以用矩阵方式控制多个按键。
可以通过逐行或逐列扫描,利用独立按键控制原理进行按键选择,例如S10被按下,怎么让单片机芯片知道:我们选择用逐列扫描,即依次快速的(芯片频率多快就有多快)给每一列低电平0(相当于独立按键一端接地),再检测哪一行被导通了(即该端电势与低电平那一端一样),根据行列便可以知道哪个按键被按下。
具体的:假设某一时刻 (P13,P12,P11,P10) = (1,0,1,1) ,我们同时检测(P17,P16,P15,P14)的输入为(1,1,0,1),证明S10处导通了,即被按下了。
注意同一极小时间段,只能扫描一列,只能检测出一个按键被按下。
2.矩阵按键模块
#include <REGX52.H>
void Delay1ms(unsigned int xms);
/*
* 按列扫描矩阵键盘返回按键所代表的意义(本函数按钮S1~S16表示数字1~16)
* 返回无符号数字1~16
*/
unsigned char MaxtrixKey() {
unsigned char kayvalue=0;
P1 = 0xff; P1_3 = 0;//扫描第P13所对应那一列
//Delay1ms(20); while(P1_7 == 0);Delay1ms(20); 按键消抖
//判断这一列上哪一行导通
if(P1_7 == 0) {Delay1ms(20); while(P1_7 == 0);Delay1ms(20); kayvalue = 1;}
if(P1_6 == 0) {Delay1ms(20); while(P1_6 == 0);Delay1ms(20); kayvalue = 5;}
if(P1_5 == 0) {Delay1ms(20); while(P1_5 == 0);Delay1ms(20); kayvalue = 9;}
if(P1_4 == 0) {Delay1ms(20); while(P1_4 == 0);Delay1ms(20); kayvalue = 13;}
P1 = 0xff; P1_2 = 0;
if(P1_7 == 0) {Delay1ms(20); while(P1_7 == 0);Delay1ms(20); kayvalue = 2;}
if(P1_6 == 0) {Delay1ms(20); while(P1_6 == 0);Delay1ms(20); kayvalue = 6;}
if(P1_5 == 0) {Delay1ms(20); while(P1_5 == 0);Delay1ms(20); kayvalue = 10;}
if(P1_4 == 0) {Delay1ms(20); while(P1_4 == 0);Delay1ms(20); kayvalue = 14;}
P1 = 0xff; P1_1 = 0;
if(P1_7 == 0) {Delay1ms(20); while(P1_7 == 0);Delay1ms(20); kayvalue = 3;}
if(P1_6 == 0) {Delay1ms(20); while(P1_6 == 0);Delay1ms(20); kayvalue = 7;}
if(P1_5 == 0) {Delay1ms(20); while(P1_5 == 0);Delay1ms(20); kayvalue = 11;}
if(P1_4 == 0) {Delay1ms(20); while(P1_4 == 0);Delay1ms(20); kayvalue = 15;}
P1 = 0xff; P1_0 = 0;
if(P1_7 == 0) {Delay1ms(20); while(P1_7 == 0);Delay1ms(20); kayvalue = 4;}
if(P1_6 == 0) {Delay1ms(20); while(P1_6 == 0);Delay1ms(20); kayvalue = 8;}
if(P1_5 == 0) {Delay1ms(20); while(P1_5 == 0);Delay1ms(20); kayvalue = 12;}
if(P1_4 == 0) {Delay1ms(20); while(P1_4 == 0);Delay1ms(20); kayvalue = 16;}
return kayvalue;
}
//stc-isp软件计时器生成
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
——B站江科大自协学习