4X4按键扫描程序_AD,Allegro,pads,PCB设计,电源模块,硬件,stm32,嵌入式,单片机,小北设计 Allegro,pads,PCB电路板设计,硬件及芯片资料分享—小北设计

4X4按键扫描程序

51单片机 by AD,Allegro,pads,PCB设计,电源模块,硬件,stm32,嵌入式,单片机,小北设计
本例键盘矩阵行线连接P0.0~P0.3,列线连接P0.4~P0.7,扫描过程如下:
程序首先判断是否有键按下。为判断16个按键中是否有键按下,程序首先在4条行线上放
置4个0,即在P1端口输出0xFO,如果有任一按键按下,则4条列线上必有一位为0.
如果已有键按下,则判断按键所在行、列位置,并返回按键序号。代码中行扫描码samao初
值为0xFE(11111110),通过将该值循环右移,可对P1.0~P1.3对应的4行逐行发送0,每次发送
扫描码后即判断高4位的4个1中是否有0出现,如果出现0则说明按键在该行上,这时可将发
送的低4位与读取的高4位取反,也就是P1取反,这样P1中将出现2个1,其余位均变为0,2
个1分别处在低4位和高4位中,高低4位中1所处的位置各有4种可能,共有16种可能,对

应16个不同按键,根据取反后的值查询键盘矩阵按键特征码表,即可得到按键序号。

通过网盘分享的文件:4X4按键扫描程序
链接: https://pan.baidu.com/s/1AuT23xu4suiAxE96Ju1fdw 提取码: 5ww5
#include#include<reg51.h>
#include<intrins.h>


#define uchar unsigned char
#define uint unsigned int
uchar code shu_zi[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF};
uchar code an_jian_weizhi[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//延时
void yan_shi(uchar ms)
{
uchar i,j;
for(i=0;i for(j=0;j<110;j++);
}
//键盘矩阵扫描
uchar an_jian_samao(void)
{
uchar samao,anjian,i,k;
P1=0XF0;
if((P1&0XF0)!=0XF0)//与001&101等于001
{
yan_shi(1);//消抖
if((P1&0XF0)!=0XF0)//再次判断按键是否按下。
{
samao=0xFE;//扫描初始值
for(k=0;k<4;k++)
{
P1=samao;
  if((P1&0XF0)!= 0XF0)//例如,1111 1110 
{
anjian=~P1;//按下键后,为1110 1110 ,取反后为0001 0001
for(i=0;i<16;i++)
if(anjian==an_jian_weizhi[i])//例:是0x11,
return i;//return语句主要用于从函数中返回一个值i,并在执行过程中终止函数的执行
}
else samao=_crol_(samao,1); //如果没有得到,左移一位是1111 1101 十六进制为0xfd ,samao=0xfd;
}
}
}
return 22;//扫描没有按键按下,反回值为22
}
//主程序
void main()
{
uchar xuhao=22,shuzi_1=0,shuzi_2=0;
P1=0XFF;
P2=0XFF;
P3=0XFF;
while(1)
{
xuhao=an_jian_samao();读取按键值
if(xuhao!=22)
{
shuzi_1=xuhao%10; //取个位数
shuzi_2=xuhao/10%10;//取十位数
if(xuhao<=9)
{
P2=shu_zi[shuzi_1];
  P3=0xff;
}
else
{
P2=shu_zi[shuzi_1];
P3=shu_zi[shuzi_2];
}

}
}

}

4X4按键扫描程序

    Message:

    Name:
    Email:
    Content:
PgUP ...
Allegro,pads,PCB电路板设计,电源模块件及芯片资料分享—小北设计