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

这篇具有很好参考价值的文章主要介绍了【STC89C52】独立键盘和矩阵键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天我分享的是基于STC89C52的独立键盘与矩阵键盘实验的学习笔记。希望对你有所帮助!

目录

一、原理图分析 

二、独立键盘

三、矩阵键盘


一、原理图分析 

【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毫秒解决。

还要再写一个确保按一次键只产生按一次键效果的代码,不会因为一直按着就产生按了很多次的效果,通常是用循环解决这个问题,按着进入循环,松开退出循环。

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

三、矩阵键盘

效果:按矩阵键盘显示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

到了这里,关于【STC89C52】独立键盘和矩阵键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://blog.csdn.net/m0_71989017/article/details/128046495

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包