目录
原理
矩阵键盘按列扫描,给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:,第二排显示键码。