今天我分享的是基于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;//11111110
WE=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;//11111110
WE=0;
while(1){
keyscanf();//扫描按键
DU=1;
P0=board[num];
DU=0;
}
}
松开按键的代码是与最近的赋给P3的值(松开之后默认是恢复成这样)进行比较。 文章来源:https://www.toymoban.com/news/detail-411317.html
以上就是我今天的分享,如果有什么建议或补充欢迎评论区留言哟~文章来源地址https://www.toymoban.com/news/detail-411317.html
到了这里,关于【STC89C52】独立键盘和矩阵键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!