【重拾51单片机(5) 矩阵按键(1)】

原理

在这里插入图片描述
矩阵键盘按列扫描,给P13.12.11.10 赋值,如 0111时候,如果P17等于0的话就是S1按下。
不按行扫描是因为引脚冲突。

矩阵键盘实现键码显示

【Delay,c 】【Delay.h】和【LCD1602.c】【 LCD1602.h】参考前文

【MatrixKey.c】
此处代码对新手友好

// An highlighted block
#include <REGX52.H>
#include "Delay.h"


/**
  * @brief  矩阵键盘读取按键键码
  * @param  
  * @retval Keynumber按下按键的键码值
	
   按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下,返回0;
  */
unsigned char MatrixKey()
 {
  unsigned char Keynumber=0;
	 
	 P1=0xFF;
	 P1_3=0;
	 if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=1;}
	 if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=5;}
	 if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=9;}
	 if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=13;}
	 
	 P1=0xFF;
	 P1_2=0;
	 if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=2;}
	 if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=6;}
	 if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=10;}
	 if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=14;}
	 
	 P1=0xFF;
	 P1_1=0;
	 if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=3;}
	 if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=7;}
	 if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=11;}
	 if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=15;}
	 
	 P1=0xFF;
	 P1_0=0;
	 if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=4;}
	 if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=8;}
	 if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=12;}
	 if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=16;}
	 return Keynumber;
 
 }

【MatrixKey.h】

// An highlighted block
#ifndef __MATRIX_H__
#define __MATRIX_H__

unsigned char MatrixKey();

#endif

【main.c】

// An highlighted block
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"

unsigned char Keynum;
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"MatrixKey:");
  
	while(1)
 {
 Keynum=MatrixKey();
	
	if (Keynum)//if变量非0即增,如果==0,返回1或0
	{
	LCD_ShowNum(2,1,Keynum,2);
 	}
  }
}


结果是液晶显示屏显示,第一排MatrixKey:,第二排显示键码。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值