第一个STC89C52项目(密码锁)
工具:
这里可以用的语言有C,C++还有汇编,我用的是对于初学者比较友好的C语言。
编译软件我用的是Keil uVision5,烧录用的是STC—ISP。
本博客只提供了部分代码,如果需要完整代码请前往*钦某/51project - 码云 - 开源中国 (gitee.com)*
函数及模块:
1.延迟函数Delay
可以直接从STC—ISP上的软件延时计算器上拷贝

但是我这里用的Delay是根据b站上的up主修改过的,可以随意定义要延迟的时间,非常好用!
1 2 3 4 5 6 7 8 9 10 11 12 13
| void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } }
|
2.液晶屏(LCD1602)显示模块
这个模块定义了许多函数,我们可以使用这些函数让屏幕上显示我们所需要的参数,这让我们在调试程序的时候更加方便直观。非常好用!
1 2 3 4 5 6 7 8 9 10 11 12 13
| #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口进行扫描,如过按下某个键,此函数将会返回所对应的数值。非常好用!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #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主写的,可能还有其它实现办法,但是相对来说这可能是最浅显易懂的一种方法。
主函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #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) { Password*=10; Password+=KeyNum%10; count++; LCD_ShowNum(2,1,Password,4); } if(KeyNum==11) { 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) { 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语言和单片机学习的不断深入,我对计算机的底层逻辑的认识越来越清晰,

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