入门51单片机矩阵按键控制原理与模块代码记录

目录

1 矩阵按键模块控制原理

1.1独立按键控制原理

1.2 矩阵按键模块控制原理

2.矩阵按键模块


型号: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站江科大自协学习

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值