8.矩阵按键

        使用行列扫描法判断是否有按键按下以及哪个按键按下。

        

        假设m行n列有一个按键S按下。

         先让高4位为0,低4位为1,即P1=0000 1111。那么由于S的按下,按键两端的导线接通,低4位必有一个端口检测到低电平。芯片便可以判断出第n列有一个按键按下。

        然后令高4位为1,低4位为0,即P1=1111 0000。那么由于S的按下,按键两端的导线接通,高4位必有一个端口检测到低电平。芯片便可以判断出第m行有一个按键按下。

        由此便可以知道是m行n列有一个按键S按下。

        序号=m*4+n

#include"reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

void delay(u16 s);
int key(void);	//key返回按键的序号,0-15

unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff/*0xff表示全亮*/};

u8 line,row,number=16; 
u8 a=0;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

void main()
{
	

	LSA=1;LSB=1;LSC=1;//选中最高位的数码管显示,不过单片机默认高电平,这3条不要也罢

	while(1)
	{
		P0=num[key()];		
	}
}

void delay(u16 s)						  //延时函数
{
	while(s--);	
}

int key(void)
{
	P1=0x0f;//0000 1111

	if(P1!=0x0f)
	{	 
		delay(1000);
		if(P1!=0x0f)
		{
			switch(P1)					   //判断是哪一列按下
			{
				case 0x07:line=0;break; 
				case 0x0b:line=1;break; 
				case 0x0d:line=2;break; 
				case 0x0e:line=3;break; 
			}
		}
		P1=0xf0;
		if(P1!=0xf0)
		{
			switch(P1)					   //判断是哪一行按下
			{
				case 0x70:row=0;break; 
				case 0xb0:row=1;break; 
				case 0xd0:row=2;break; 
				case 0xe0:row=3;break; 
			}
		}
		number=row*4+line;		
	}
	while((a<50)&&(P1!=0xf0))
	{
			delay(100);
			a++;
	}
	return number;//如果有按下,number的值就是按下的值;如果没有按下,number在上面被初始化为16,即全亮,单片机在没有按键按下时就是全亮 
}







			







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我是小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值