今天我分享的是基于STC89C52的独立键盘与矩阵键盘实验的学习笔记。希望对你有所帮助!
目录
一、原理图分析
二、独立键盘
三、矩阵键盘
一、原理图分析
键盘在现实生活中很常见,手机的虚拟键盘,电脑的实体键盘。
键盘是由一个个按键构成,按键常态下与两端触点断开,按下时与两端触点闭合。
键盘分为编码键盘和非编码键盘,电脑用的是编码键盘,单片机用的是非编码键盘。非编码键盘又分为矩阵键盘和独立键盘。
独立键盘与矩阵键盘共用P3口。
独立键盘按键一端接地,一端接I\O口。通过控制IO口输出高电平检测是否按下按键,按下按键为低电平,松开恢复高电平。
矩阵键盘用行扫描和列扫描。行扫描行高电平,列低电平,任意按下一个键对应的行线低电平。列扫描列高电平,行低电平,任意按下一个键对应的列线低电平。
二、独立键盘
效果:按S2数码管显示加一加到9,按S3数码管显示减1减到0。
#include<reg52.h>
sbit WE=P2^7;
sbit DU=P2^6;
sbit key_S2=P3^0;
sbit key_S3=P3^1;
#define uint unsigned int
#define uchar unsigned char
void delay(uint z){uint x=0;uint y=0;for(x=z;x>0;x--)for(y=114;y>0;y--);
}
uchar board[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
void main(){uint num=0;WE=1;P0=0xfe;//11111110WE=0;while(1){if(key_S2==0){delay(20);//按键消抖if(key_S2==0){if(num<9)num++;while(!key_S2);//松开按键 }}if(key_S3==0){delay(20);//按键消抖if(key_S3==0){ if(num>0)num--;while(!key_S3);//松开按键 }}DU=1;P0=board[num];DU=0;}
}
记得一定要按键消抖,不然数据是乱的。消抖完还要再次判断是否按下,来确定是人工按键还是机械抖动。按键消抖通过延时5-20毫秒解决。
还要再写一个确保按一次键只产生按一次键效果的代码,不会因为一直按着就产生按了很多次的效果,通常是用循环解决这个问题,按着进入循环,松开退出循环。
三、矩阵键盘
效果:按矩阵键盘显示0-9、A-F、H、L、-、清除。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE=P2^7;
sbit DU=P2^6;
void delay(uint z){
uint x=0;
uint y=0;
for(x=z;x>0;x--)for(y=114;y>0;y--);
}
uint num=19;
uchar board[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//0-9
0x77,0x7C,0x39,0x5E,0x79,0x71,//A-F
0x76, //H
0x38, //L
0x40, //-
0x00}; //清除void keyscanf(){P3=0xf0;//矩阵键盘扫描//列扫描if(P3!=0xf0){delay(10);//按键消抖if(P3!=0xf0){switch(P3){case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}P3=0x0f;//行扫描switch (P3){case 0x0e:num=num;break;case 0x0d:num=num+4;break;case 0x0b:num=num+8;break;case 0x07:num=num+12;break;}while(P3!=0x0f);//松开按键}}P3=0xff;//独立键盘扫描if(P3!=0xff){delay(10);//按键消抖if(P3!=0xff){switch(P3){case 0xfe:num=16;break;case 0xfd:num=17;break;case 0xfb:num=18;break;case 0xf7:num=19;break;}while(P3!=0xff);//松开按键}}
}
void main(){WE=1;P0=0xfe;//11111110WE=0;while(1){keyscanf();//扫描按键DU=1;P0=board[num];DU=0;}
}
松开按键的代码是与最近的赋给P3的值(松开之后默认是恢复成这样)进行比较。
以上就是我今天的分享,如果有什么建议或补充欢迎评论区留言哟~