#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
//unsigned char MatrixKeyboard () {
void main(){
unsigned char KeyNumber=0;
while(1){
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;}
//left 1, S1/S5/S9/S13
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;}
//left 2, s2/s6/s10/s14
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;}
//left 3,s3/s7/s11/s15
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;}
//left 4,s4/s8/s12/s16
//return KeyNumber;
LCD_Init();
LCD_ShowNum(1,1,KeyNumber,2);
}
}
内置LCD1602.c and LCD1602.h 的文件,运行前提是现有LCD1602的模块
本代码采用列扫描,即先确定P1_3~P1_0 所对应四列所在位置,
再用P1_7~P1_4 确定四行所在位置即可定位出具体s1~s16与P1_ 端口之间的关系,
最后利用 LCD_ShowNum()将数字在LCD1602液晶显示屏上显示出来。
矩阵按键模块原理图: