第一个STC89C52项目(密码锁)

工具:

这里可以用的语言有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语言和单片机学习的不断深入,我对计算机的底层逻辑的认识越来越清晰,

如果有什么错误,欢迎指出,如果有帮助,点个赞,谢谢。

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嶔某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值