当前位置: 首页 > news >正文

石家庄城乡建设管理局网站栾城做网站

石家庄城乡建设管理局网站,栾城做网站,html下载官网,设计一个介绍电视剧的网页目录 一、基本功能简介 1.四位密码锁 2.输入密码 3.删除已经输入一位数字 4.删除已经输入的所有数字 5.确认密码 二、进阶功能介绍 1.输入错误密码,进行锁机操作 2.执行开锁步骤,并可以自定义开锁后展示内容 3.重新设定密码 三、模块化代码和主代…

目录

 

一、基本功能简介

1.四位密码锁

2.输入密码

 

3.删除已经输入一位数字

4.删除已经输入的所有数字

5.确认密码

二、进阶功能介绍

1.输入错误密码,进行锁机操作

2.执行开锁步骤,并可以自定义开锁后展示内容

 3.重新设定密码

三、模块化代码和主代码

1.LCD1602初始化代码

2.LCD1602初始化代码调用(.h)

3.延时函数

4.延时函数调用(.h)

5.矩阵按键初始化代码

6.矩阵按键初始化代码(.h)

7.主函数

四、设备和原理图

1.LCD1602

2.STC89C52

3.矩阵键盘模块

4.Keil5界面


 

一、基本功能简介

1.四位密码锁

                默认密码为1201(小彩蛋*1),后续可自由修改密码。

2.输入密码

                按下不同按键,输入相应的数字(最多输入四位,输入少于四位使用0补全)

按键与数字对应表
按键数字
S11
S22
S33
S44
S55
S66
S77
S88
S99
S100

 

			if(KeyNum<=10)//如果S1~S10按键按下,输入密码{if(InputCount<4){Password*= 10;Password+= KeyNum%10;InputCount++;//1~9/10=1~9//10/10=0					}LCD_ShowNum(2,1,Password,4);}

3.删除已经输入一位数字

                按下按键S12,删除已经输入的一位数字。

			if(KeyNum==12)  //如果S12按下,删除已经输入的一位密码{Password = Password/10;InputCount--;LCD_ShowNum(2,1,Password,4);}

 

4.删除已经输入的所有数字

                按下按键S13,删除已经输入的四位数字。

			if(KeyNum==13)  //如果S13按下,删除已经输入的所有密码{Password = 0;InputCount=0;LCD_ShowNum(2,1,Password,4);LCD_ShowString(2,1,"****");				}						

 

5.确认密码

                按下按键S11,确认,将输入的数字与密码比较。

                相同则显示PASS。

c313cce8714e42019cca9d1c7d9aae3a.jpeg

                不同则会显示xx秒后重试(倒计时阶段类似锁机,不能进行操作)。

56b0bdbbadf7474cbb36b9473736746e.jpeg

 

 

			if(KeyNum==11) //如果S11按键按下时,确认输入密码,并且与已保存的密码进行比较{if(Password==secret){LCD_ShowString(1,13,"PASS");Password=0;        //密码清零InputCount=0;      //输入计数清零LCD_ShowNum(2,1,Password,4);LCD_ShowString(2,1,"****");	state=1;}else{/*每输入错一次增加5秒的等待时间变量ErrorCount记录累计输错次数变量InputCount控制每次只能输入4位密码*/	LCD_ShowString(1,11,"ERROR ");LCD_ShowString(2,1,"****");ErrorCount++;LCD_ShowString(1,1,"AFTER            ");LCD_ShowNum(1,8,ErrorCount*5,4);LCD_ShowString(1,13,"S");LCD_ShowString(2,1,"AND TRY AGAIN");state=0;for( i=ErrorCount*5;i>0 ; i--   )//for循环,一秒刷新一次倒计时{LCD_ShowNum(1,8,i,4);Delay(1000);}Password=0;   //密码清零InputCount=0;      //计数清零LCD_ShowString(1,1,"Password:             ");LCD_ShowString(2,1,"****                  ");	}}

 

 

 

二、进阶功能介绍

/*

第一次独自开发这类项目,代码逻辑和格式可能有点混乱。

不过功能都测试过啦,没问题的,还请多多包涵。

*/

1.输入错误密码,进行锁机操作

                每输入错误一次增加5秒的锁机时间,倒计时每秒刷新显示剩余锁机时间

f9ac5ab685bd4c50a3543a13f1f3d2bd.jpeg

                                                        图例:累计输入错误三次

			for( i=ErrorCount*5;i>0 ; i--   )//for循环,一秒刷新一次倒计时{LCD_ShowNum(1,8,i,4);Delay(1000);}

 

2.执行开锁步骤,并可以自定义开锁后展示内容

                按下按键S11,确认,将输入的数字与密码比较。

                相同则显示PASS,并且更改状态state=1。

              (当密码输入正确的时候状态变更为1,未输入时和密码输入错误是仍然为0)

                再按下按键S14,执行开锁步骤

4f23acd8f6124cbba5026454bb29786f.jpeg

 

                自定义展示开锁内容(小彩蛋*1)

			/*&&两个条件都满足,才能触发||两个条件任一满足都可以触发前面正确输入密码,并且按下按键14执行类似开锁的步骤*/if(KeyNum==14 && state==1)  {LCD_ShowString(1,1,"      OPEN       ");	LCD_ShowString(2,1,"Waiting...          ");		Delay(2000);LCD_ShowString(2,1,"                   ");LCD_ShowString(1,1,"   I LOVE YOU!          ");//可以自定义LCD屏幕的显示内容(彩蛋在此!!!)Delay(2000);LCD_ShowString(1,1,"Password:             ");LCD_ShowString(2,1,"****                  ");				}						

 3.重新设定密码

                按下按键S15                     

effc43427a1f4a54bc9f84f756a86307.jpeg

                                                                        加载

 

55e770ca8b1d462ba13b03b5a539ba69.jpeg

                                                      进入重新设定密码的界面

             

			if(KeyNum==15)  //如果S15按下,执行重新输入密码的操作{					Password=0;   //密码清零InputCount=0; //输入计数清零state=0;LCD_ShowString(1,1,"RESET Password             ");	LCD_ShowString(2,1,"Waiting...                ");	Delay(2000);				LCD_ShowString(1,1,"                   ");LCD_ShowString(2,1,"                   ");			LCD_ShowString(1,1,"NEW Password                   ");LCD_ShowString(2,1,"****                   ");						}	

 

                   输入新的四位密码(不输入默认密码为4个0)

                   在此之后按下S16

                2e3d5ae0e5cd4b9eabb360b60ce633c5.jpeg

                                                             显示新密码0226已经修改成功

 

			if(KeyNum==16)//如果S16按下,重新设定密码并且显示新密码{secret=Password;Password=0;InputCount=0;LCD_ShowString(1,1,"                   ");LCD_ShowString(2,1,"                   ");			LCD_ShowString(1,1,"NEW Password                   ");LCD_ShowString(2,1,"CHANGED           ");	LCD_ShowNum(2,9,secret,4);	Delay(2000);LCD_ShowString(1,1,"Password:             ");LCD_ShowString(2,1,"****                  ");					}

 

三、模块化代码

1.LCD1602初始化代码

#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned c;char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

2.LCD1602初始化代码调用(.h)

#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.延时函数

void Delay(unsigned int xms)	
{unsigned char data i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}

 

4.延时函数调用(.h)

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

 

5.矩阵按键初始化代码

#include <REGX52.H>
#include "Delay.h"
/*** @brief 矩阵键盘读取按键键码* @param  无* @retval KeyNumber 按下按键的键码值如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键的键码,没有按键按下的时候放回0*/
int MatrixKey()
{//矩阵扫描,按一行或者按一列,依次输入扫描,要扫描的给0,其余给1int KeyNumber=0;P1=0xFF; //默认都是1(高电平)P1_3=0;//检测按键按下,就是判断是否变成0if(P1_7==0)//1行1列的按钮=1
{Delay(20);while(P1_7==0){Delay(20);}KeyNumber=1;
}if(P1_6==0)//2行1列的按钮=5
{Delay(20);while(P1_6==0){Delay(20);}KeyNumber=5;
}if(P1_5==0)//3行1列的按钮=9
{Delay(20);while(P1_5==0){Delay(20);}KeyNumber=9;
}if(P1_4==0)//4行1列的按钮=13
{Delay(20);while(P1_4==0){Delay(20);}KeyNumber=13;
}P1=0xFF; //默认都是1(高电平)P1_2=0;//检测按键按下,就是判断是否变成0if(P1_7==0)//1行2列的按钮=2
{Delay(20);while(P1_7==0){Delay(20);}KeyNumber=2;
}if(P1_6==0)//2行2列的按钮=6
{Delay(20);while(P1_6==0){Delay(20);}KeyNumber=6;
}if(P1_5==0)//3行2列的按钮=10
{Delay(20);while(P1_5==0){Delay(20);}KeyNumber=10;
}if(P1_4==0)//4行2列的按钮=14
{Delay(20);while(P1_4==0){Delay(20);}KeyNumber=14;	
}P1=0xFF; //默认都是1(高电平)P1_1=0;	//检测按键按下,就是判断是否变成0if(P1_7==0)//1行3列的按钮=3
{Delay(20);while(P1_7==0){Delay(20);}KeyNumber=3;
}if(P1_6==0)//2行3列的按钮=7
{Delay(20);while(P1_6==0){Delay(20);}KeyNumber=7;
}if(P1_5==0)//3行3列的按钮=11
{Delay(20);while(P1_5==0){Delay(20);}KeyNumber=11;
}if(P1_4==0)//4行3列的按钮=15
{Delay(20);while(P1_4==0){Delay(20);}KeyNumber=15;
}P1=0xFF; //默认都是1(高电平)P1_0=0;//检测按键按下,就是判断是否变成0if(P1_7==0)//1行4列的按钮=4
{Delay(20);while(P1_7==0){Delay(20);}KeyNumber=4;
}if(P1_6==0)//2行4列的按钮=8
{Delay(20);while(P1_6==0){Delay(20);}KeyNumber=8;
}if(P1_5==0)//3行4列的按钮=12
{Delay(20);while(P1_5==0){Delay(20);}KeyNumber=12;
}if(P1_4==0)//4行4列的按钮=16
{Delay(20);while(P1_4==0){Delay(20);}KeyNumber=16;
}return KeyNumber;
}

 

 

6.矩阵按键初始化代码(.h)

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif

 

四、设备和原理图

1.LCD1602

 

c5bdf5fe6fb8b991dfb913b08bccf986.png

 

 

2.STC89C52

 

ebd4422f84c5032e9402be38187d0be7.png

 

 

 

3.矩阵键盘模块

 

9667bfd2c9fe21799656ad309c89821e.png

                     (原理图从转载“普中-2&普中-3&普中-4开发板原理图",非商业用途。)

 

4.Keil5界面

 

0ea2265068f532e3c5d2bb4c45df7a6a.png

 

                                      (创作不易,主函数在主页下载资源内)                             【免费】51单片机:进阶版密码锁资源-CSDN文库

                                                                谢谢大家!

                                                        小白一枚,请多指教!                                                               

                                                         FROM 明月清风mls

 

 

 

 

 

 

 

http://www.yayakq.cn/news/566617/

相关文章:

  • 互联网公司排名中国2022站长工具seo综合查询是什么意思
  • 品牌外贸网站建设网站服务器拒绝连接
  • 漳州网站建设公司推荐竹子林网站建设
  • 建立网站的步骤筝晃湖南岚鸿官网建设网站宽度最好是多少
  • 自动生成作文网站门户网站 费用
  • 苍南公司网站建设wordpress 制作微信小程序
  • 宁夏建设工程造价网站长沙网站排名
  • 网站建设与维护大作业外贸公司出口退税流程
  • 网站开发 xmind互联网最赚钱的行业
  • 机顶盒视频网站建设衣服网站建设策划书
  • 梁山手机网站建设武宁县建设工程招标公告门户网站
  • 站内优化怎么做中英文网站域名的区别
  • 做外贸网站有哪些做电商网站注意什么
  • php网站开发实例视频网店推广的目的是什么
  • 帮别人做网站被抓淮安做网站 卓越凯欣
  • 平安建设宣传音频免费下载网站哪些网站可以做ppt
  • 天辰建设网站公司装房和城乡建设部网站
  • 用源码怎么做网站海口网站建设联系方式
  • 做电子手抄报的网站推广普通话的文章
  • 一般什么企业需要建站天猫网站怎么做
  • 精品课程网站建设的背景及意义wordpress简洁cms主题
  • 网站ip需要备案wordpress主题贴吧
  • 临沂市建设局网站上海专业建站公
  • 如何建个使用自己帐户的网站武昌网站建设哪家便宜
  • 福建建设局网站wordpress 降低版本
  • 广州产品网站设计wap入口
  • 制作自己盈利的网站重庆城市建设集团官方网站
  • wordpress 评论添加表情久久seo正规吗
  • 飞沐网站建设公司北京开发公司年终工作总结ppt
  • 微信网站应用开发wordpress 设计