学习日志-C51-矩阵键盘与LCD1602简易密码锁
矩阵键盘:
采用逐行或者逐列扫描,即可读取任意一个按键状态。
采用逐列扫描:
P13、P12、P11、P10四列中选取一个赋值为0,其余为1,在读取行P17、P16、P15、P14的电平状态,按下即低电平。
采用逐行扫描:
P17、P16、P15、P14四行中选取一个赋值为0,其余为1,在读取列P13、P12、P11、P10
的电平状态,按下即低电平。
LCD1602函数及作用:
可利用上述函数实现相关显示。
以下为部分代码
矩阵键盘(逐列扫描):
#include <REGX52.H>
#include "delay.h"
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"
unsigned char matrixkey()
{
unsigned char keynumber=0;
P1=0xff;
P1_7=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);keynumber=1;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);keynumber=2;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);keynumber=3;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);keynumber=4;}
P1=0xff;
P1_6=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);keynumber=5;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);keynumber=6;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);keynumber=7;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);keynumber=8;}
P1=0xff;
P1_5=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);keynumber=9;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);keynumber=10;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);keynumber=11;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);keynumber=12;}
P1=0xff;
P1_4=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);keynumber=13;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);keynumber=14;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);keynumber=15;}
if(P1_0==0){Delay(20);while(P1_0==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)//非0即真
{
if(keynum<=10)//设置前10位为密码位
{
if(count<4)//设置按键次数为4,超过4不予读取
{
password*=10;//possword=possword*10,使得密码可以左移一位
password+=keynum%10;//password=password+keynum%10,1~9对10取余还为本身,10对10取余即为0
count++;//次数加1
}
LCD_ShowNum(2,1,password,4);
}
if(keynum==11)//设置按键11为确认键
{
if(password==1720)//设置正确密码,注意若首位为0,比如0720,则此处设为password==720即可
{
LCD_ShowString(1,12,"OK ");
password=0;//密码清零
count=0;//计次清零
LCD_ShowNum(2,1,password,4);//显示归0,password=0000
}
else
{
LCD_ShowString(1,12,"NO ");
password=0;
count=0;
LCD_ShowNum(2,1,password,4);
}
}
if(keynum==12)//设置按键12为取消键
{
LCD_ShowString(1,12,"again");
password=0;
count=0;
LCD_ShowNum(2,1,password,4);
}
}
}
}
LCD1602代码等可在我的资源处自行下载,或者UP主江协科技处下载。