ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

独立键盘与矩阵键盘

2021-07-22 21:33:16  阅读:156  来源: 互联网

标签:leddata case P0 矩阵 独立 键盘 按下 按键 break


一.独立键盘

请添加图片描述

1.特点:每个按键占用一个IO口,当按键数量多时,IO口利用效率不高,(适合功能少的场合)
当按键被按下,IO口为低电压,松开后为高电压
2.原理:经过非门5V变0V(中间直线没有导通),内部上拉电阻传出5V,如果按键没有被按下,5V直接传5V数据(也就是转出信号“1”)。反之按下后,5V接入地线,命整条线路为0V(转出信号“0”)。
3.知识
按键消抖
在这里插入图片描述
松手检测
在这里插入图片描述


#include "reg52.h"			 
sbit key1=P3^1;	 //按键位置     
sbit led=P2^0;	  //小灯位置
void delay(unsigned int i)
{
	while(i--);	
}
void keypros()
{
	if(key1==0)		 
	{	
		delay(1000);         //按键消抖,中间有个延时函数,过后再次判定 
		if(key1==0)	
		{
			led=~led;	   //一旦按下,小灯发光或暗  
		}
		while(!key1);	 //松手检测,如果松手,Key1的值就变回来
	}		
}
void main()
{	
	led=1;
	while(1)
	{	
		keypros();  	
	}		
}

一.矩阵键盘

请添加图片描述
可以看到有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"	
unsigned char keyscan();
void keypro();
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 delay(unsigned int z)    //延时函数
{
	unsigned int x,y;
	for(x=z;x>0;x--)
	   for(y=120;y>0;y--);
}
void main()
{
	
	while(1)
	{
		keypro();
	}

}

unsigned char keyscan()
{
	unsigned char r,l;      //建立两个变量,一个来接受行数据,一个接受列
	P1 = 0XF0;              //行初始化
	if(P1 != 0XF0)          //不等于,就是有按键按下
	{
		delay(10);     
		if(P1!=0XF0)      //按键消抖
		{
			r = P1;       //行变化的数据赋予r
            P1 = 0X0F;    //这时列初始化
            l = P1;       //因为这时候,还没有松开,故直接P1已经变化了
            while(P1!=0X0F);  //松手检测			
		}
		return(r+l);         //两者相加就可以确认按下的是那个键
	 }
}
void keypro(){
	switch(keyscan()){
		case 0xee: P0 = leddata[0];break;   //用返回的值r+l判定,赋予给P0口(这里P0口控制亮什么样子,亮那个位置没有调,默认第一个)。
		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;	
	}

}

标签:leddata,case,P0,矩阵,独立,键盘,按下,按键,break
来源: https://blog.csdn.net/qq_54674051/article/details/119008485

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有