4*4按键控制屏幕变化

                            **怎么耍4*4按键**

这周学了一个4*4按键,挺有意思的,也有许多知识点,与大家分享下。如下图
是不是有点花,有点乱,我一开始也是。
可以看到有16个按键(51板子上也是有个16个按键部分),通常按键是松开的,一按就接到下面两个触点,就连起来了。
行扫描与列扫描
1:列扫描:将接在列上的所有IO口拉高,接在行上的所有IO口置低。当接收到的数据,列上IO口不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下

就是从下往上看,11110000(4个列对应的线都为1,行为0)。
举个例子,原本进行列扫描初始为11110000,按下s6就变成11100000,s8变成10111111,这我们就确认了我们按下的键在那一列。

2:行扫描:反过来,将接在行上的所有IO口拉高,接在列上的所有IO口置低。然后根据接收到的行上IO口的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

同理,行扫描初始为00001111,按下s6变成00001110,s10为00001101,这不就确认了行吗,加上上面的列与之结合,就找到按下的按键。
怎么结合,两者加起来,如11110000+00001101=11111101
按键消抖下面要代码用,可以先了解下
下面要用哈
松手检测
在这里插入图片描述
代码来

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char
	
sbit du =P2^6;
sbit we =P2^7;

uchar keyscan();
void keypro();
void delay(uint z)               //延时函数dealy(1000)=1秒
{
	uint x,y;
	for(x=z;x>0;x--)
	   for(y=120;y>0;y--);
}

unsigned char leddata[]={      //字符数组好找
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //???
                         };
void main(){
	we = 1;       //位选为0;
	P0 = 0; 
	we = 0;
	
	du = 1;     //段选打开
	while(1)
	{
		keypro();     //主角登场,要按多次就放在while里了    
	}
	
}

uchar keyscan()
{
	uchar h,l;       //h为列扫描,l为行扫描
	P1=0xf0;         //列扫描11110000
	if(P1!=0xf0)            //不等于,就是有按键被按下了呗
	{
		delay(5);              //这是消抖,看上图
		if(P1!=0xf0)
		{
			l=P1;                
			P1=0x0f;            //列扫描的值定在了l,到行了,用完就换一个
			h=P1;      
			while(P1!=0x0f);        //这是松手检测,你松开时,p1就等于0xff了,看上面的图
		}
		return(h+l);
	}
}

void keypro(){
	switch(keyscan()){
		case 0xee: P0 = leddata[0];break;               //接下来就判断是那个被按下的了,16个按键,每个按键都对应给p0一个值,大家可以按自己喜欢来定这16个按键分别对应什么
		case 0xde: P0 = leddata[1];break;
		case 0xbe: P0 = leddata[2];break;
		case 0x7e: P0 = leddata[3];break;
		
		case 0xed: P0 = leddata[4];break;
		case 0xdd: P0 = leddata[5];break;
		case 0xbd: P0 = leddata[6];break;
		case 0x7d: P0 = leddata[7];break;
		
		case 0xeb: P0 = leddata[8];break;
		case 0xdb: P0 = leddata[9];break;
		case 0xbb: P0 = leddata[10];break;
		case 0x7b: P0 = leddata[11];break;
		
		case 0xe7: P0 = leddata[12];break;
		case 0xd7: P0 = leddata[13];break;
		case 0xb7: P0 = leddata[14];break;
		case 0x77: P0 = leddata[15];break;	
	}
}

接下来看看工程图在这里插入图片描述
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值