1.看电路板的原理图
2.确定如何读取数据
首先把P1口全置为1,然后如果想读取一列,就把哪个口设置为0,之后再检测P1_7到P1_4这几个口的状态,因为默认按键状态为1,所以按键按下为0。
可以按行扫描也可以按列扫描,但因为P15口联系到了蜂鸣器,所以按列扫描。
此单片机是弱上拉模式,所以两个端口1个口1一个口0,正常工作。
3.编写代码
把之前的延时代码.c和延时代码.h以及LCD1602.c和LCD1602.h复制到本项目中来;随后编写读取按键的代码keyboard.c如下所示:
#include <REGX52.H>
#include "Delay.h"
unsigned char keyboard()
{
unsigned char keyInput=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=16;}
return keyInput;
}
keyboard.h如下所示:
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
unsigned char keyboard();
#endif
main.c如下所示:
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "keyboard.h"
void main()
{
unsigned char keynum=0;
LCD_Init();
LCD_ShowString(1,3,"Hello!");
while(1)
{
keynum=keyboard();
if(keynum) //这里是为了判断是由有按键按下,不添加不会显示数值
{
LCD_ShowNum(2,3,keynum,2);
}
}
}
4.结果实现