单片机学习

矩阵键盘的电路结构图

 第一行的行控制线接到p17,第二行的行控制线接到p16,第三行的行控制线接到p15,第4行的行控制线接到p14
第一列的列控制线接到p13,第二列的列控制线接到p12,第三列的列控制线接到p11,第四列的列控制线接到p10
矩阵键盘的原理和独立按键类似,另外我们可以把矩阵键盘的任意一行或一列作为一个独立键盘使用,假如我们把第一行作为独立键盘,那么我们只需要让P17输出高电平,其余7个io口输出低电平即可,假如我们按下了s1,那么p13的电平就会被拉低,变为低电平,所以我们可以通过查找低4位里哪一位为低电平就可以知道哪个按键按下了

unsigned char keyscan(){
	unsigned char key,Row,Col;
	P1=0x0f;
	if(P1!=0x0f){
		delay(10);
		if(P1!=0x0f){
			Row=P1&0x0f;
			P1=0xf0;
			Col=P1&0xf0;

		}
		while((P1&0xf0)!=0xf0);//判断键是否抬起
	}
	switch(Row+Col){
		case 0xee:key=0;break;
		case 0xde:key=1;break;
		case 0xbe:key=2;break;
		case 0x7e:key=3;break;

		case 0xed:key=4;break;
		case 0xdd:key=5;break;
		case 0xbd:key=6;break;
		case 0x7d:key=7;break;

		case 0xeb:key=8;break;
		case 0xdb:key=9;break;
		case 0xbb:key=10;break;
		case 0x7b:key=11;break;

		case 0xe7:key=12;break;
		case 0xd7:key=13;break;
		case 0xb7:key=14;break;
		case 0x77:key=15;break;


	}
	return key;
}

这个代码为矩阵键盘按键的数值

MatrixKey.h:

#ifndef __MatrixKey_H__
#define __MatrixKey_H__

int MatrixKey();

#endif

MareixKey.c:

#include<regx52.h>

void Delay(int x)
{
	while(x!=0)  {x--;}
}

int MatrixKey()
{
	int keynumber=0;
	
	P1=0xFF;   //initialize:1111 1111
	P1_3=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=1;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=5;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=9;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=13;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_2=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=2;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=6;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=10;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=14;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_1=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=3;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=7;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=11;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=15;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_0=0;   
	if(P1_7==0)  {Delay(10000); while(P1_7==0); Delay(100); keynumber=4;}
	if(P1_6==0)  {Delay(10000); while(P1_6==0); Delay(100); keynumber=8;}
	if(P1_5==0)  {Delay(10000); while(P1_5==0); Delay(100); keynumber=12;}
	if(P1_4==0)  {Delay(10000); while(P1_4==0); Delay(100); keynumber=16;}
	
	return keynumber;	
}

main

#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"

int number;

void main()
{
	LCD_Init();
	while(1)
	{
		number=MatrixKey();
		if (number!=0)    
		{
			LCD_ShowNum(1,1,number,3);
		}
	}
}

将该代码输入时即可对单片机的矩阵键盘进行控制

效果如下

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韬Tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值