【STC89C52】独立键盘和矩阵键盘

今天我分享的是基于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的值(松开之后默认是恢复成这样)进行比较。 

以上就是我今天的分享,如果有什么建议或补充欢迎评论区留言哟~

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值