工具:
这里可以用的语言有C,C++还有汇编,我用的是对于初学者比较友好的C语言。
编译软件我用的是Keil uVision5,烧录用的是STC—ISP。
本博客只提供了部分代码,如果需要完整代码请前往钦某/51project - 码云 - 开源中国 (gitee.com)
函数及模块:
1.延迟函数Delay
可以直接从STC—ISP上的软件延时计算器上拷贝
但是我这里用的Delay是根据b站上的up主修改过的,可以随意定义要延迟的时间,非常好用!
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
2.液晶屏(LCD1602)显示模块
这个模块定义了许多函数,我们可以使用这些函数让屏幕上显示我们所需要的参数,这让我们在调试程序的时候更加方便直观。非常好用!
#ifndef __LCD1602_H__
#define __LCD1602_H__
//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
#endif
3.矩阵键盘函数(MatrixKey)
将这个函数放入while(1)循环里就可以不断对矩阵键盘的8个I/O口进行扫描,如过按下某个键,此函数将会返回所对应的数值。非常好用!
#include <REGX52.H>
#include "Delay.h"
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=1;}
if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=5;}
if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=9;}
if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=2;}
if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=6;}
if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=10;}
if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=3;}
if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=7;}
if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=11;}
if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=4;}
if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=8;}
if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=12;}
if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=16;}
return KeyNumber;
}
声明:此函数是作者跟着江协科技up主写的,可能还有其它实现办法,但是相对来说这可能是最浅显易懂的一种方法。
主函数:
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#define password 2345 //初始密码
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&&count<4)//s1—s10对等1 2 3 4 5 6 7 8 9 0
{
Password*=10; //CSDN回文对称 http://t.csdnimg.cn/4cN6e
Password+=KeyNum%10;//获取密码
count++;
LCD_ShowNum(2,1,Password,4); //计次加一
}
if(KeyNum==11) //将s11设置成确认键
{
if(Password==password)
{
LCD_ShowString(1,11,"True ");
Password = 0; //清零
count = 0; //清零
LCD_ShowNum(2,1,Password,4);
}
else
{
LCD_ShowString(1,11,"False");
Password = 0; //清零
count = 0; //清零
LCD_ShowNum(2,1,Password,4);
}
}
if(KeyNum==12) //将s12设置为取消键
{
Password = 0; //清零
count = 0; //清零
LCD_ShowNum(2,1,Password,4);
}
}
}
}
Ⅰ.首先在主函数前面要包含一系列的头文件。
因为我们在做的是一个密码锁,那么就要有正确的密码,这里我把密码设置成4位,直接宏定义password方便修改。
Ⅱ.然后我们来到main函数里面。
LCD_Init();对LCD1602进行初始化,LCD_ShowString(1,1,"Password:");让Password:显示在屏幕的第一排第一列
Ⅲ.之后是我们的重头戏循环,我们要不间断的对键盘进行扫描:while(1)。定义一个KeyNum来接收MatrixKey()返回来的值并进行判断,如果KeyNum非0,进入到第一个if里面。
Ⅳ.我们将s1到s9设置为所对应的数字,s10设置为数字0,s11为确认,s12为取消。
第二个if判断了反回来的KeyNum范围在10以内,由于只有4位密码,为了防止多输入,我们再在外面定义一个计数器count默认值位0。并在第二个if同时判断count。在第二个if里面的代码在作者往期的博客里面有类似的,这里就不解释了。(详情:CSDN回文对称 http://t.csdnimg.cn/4cN6e)
Ⅴ.第三个if语句里面对按键s11进行了定义。
判断输入的密码是否和定义的密码相等,如果相等在LCD上显示“真” LCD_ShowString(1,11,"True ")否则显示“假” LCD_ShowString(1,11,"False")。(注意这里True比False少一个字母,应该在True后面加一个空格才能保证能把False全部覆盖掉。)之后将Password和count归零。
声明:这里除了让屏幕显示真假,还可以写一些函数代码让外部电机转动以此来实现物理上的开关
Ⅵ.第五个if语句定义了按键s12
当KeyNum等于12时将Password和count归零。
总结:
这个项目需要我们对单片机的各个外设有一定的认识并懂得使用,总的来说代码较为简单,逻辑比较复杂。随着对C语言和单片机学习的不断深入,我对计算机的底层逻辑的认识越来越清晰,
如果有什么错误,欢迎指出,如果有帮助,点个赞,谢谢。