.h和.c说明函数和上一节一样
Matrixkey.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif
Martixkey.c
#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;
}
接下来进入正题
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
unsigned int Password,Count;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Password");
while(1)
{
KeyNum=Matrixkey();
if(KeyNum)
{
if(KeyNum<=10) //按下s1-s10的按键,输入密码
{
if(Count<4) //如果输入次数小于四
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
}
Count++;//计数加一
}
LCD_ShowNum(2,1,Password,4); //显示更新
}
if(KeyNum==11) //如果s11按下 确认
{
if(Password==2345) //如果输入密码等于正确密码2345,输出OK
{
LCD_ShowString(1,14,"OK ");
Password=0; //密码清零,每次判断完密码,因为可能后续还要输入密码测试
Count=0; //计数清零 同上理
}
else //否则
{
LCD_ShowString(1,14,"ERR");
Password=0;
Count=0;
LCD_ShowNum(2,1,Password,4);//显示更新
}
}
if(KeyNum==12) //如果按键s12按下 取消
{
//Count=0;//同理上面 密码清零。
//Password=0;
Password/=10; //解释这行和下面的,逐步清零,除以10是清楚最后一位数。
Count--; //此时count是4此如果直接清零会导致后续再输入密码有空余位0,所以按一次s12次数就减一
LCD_ShowNum(2,1,Password,4);//显示更新
}
}
}
关于密码一位下图解释
最开始是0000然后乘10再加下一个按键输入的数字来实现移位。
很简单。
最后又想到能不能实现逐步清零呢就像手机退格键一样呢。