一.独立键盘
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;
}
}