中小型网站开发,湘潭响应式网站建设 磐石网络,东莞建设工程招标网,.net网站目录 一、基本功能简介
1.四位密码锁
2.输入密码 3.删除已经输入一位数字
4.删除已经输入的所有数字
5.确认密码
二、进阶功能介绍
1.输入错误密码#xff0c;进行锁机操作
2.执行开锁步骤#xff0c;并可以自定义开锁后展示内容 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补全
按键与数字对应表 按键数字S11S22S33S44S55S66S77S88S99S100 if(KeyNum10)//如果S1~S10按键按下输入密码{if(InputCount4){Password* 10;Password KeyNum%10;InputCount;//1~9/101~9//10/100 }LCD_ShowNum(2,1,Password,4);}
3.删除已经输入一位数字 按下按键S12删除已经输入的一位数字。 if(KeyNum12) //如果S12按下删除已经输入的一位密码{Password Password/10;InputCount--;LCD_ShowNum(2,1,Password,4);} 4.删除已经输入的所有数字 按下按键S13删除已经输入的四位数字。 if(KeyNum13) //如果S13按下删除已经输入的所有密码{Password 0;InputCount0;LCD_ShowNum(2,1,Password,4);LCD_ShowString(2,1,****); } 5.确认密码 按下按键S11确认将输入的数字与密码比较。 相同则显示PASS。 不同则会显示xx秒后重试倒计时阶段类似锁机不能进行操作。 if(KeyNum11) //如果S11按键按下时确认输入密码并且与已保存的密码进行比较{if(Passwordsecret){LCD_ShowString(1,13,PASS);Password0; //密码清零InputCount0; //输入计数清零LCD_ShowNum(2,1,Password,4);LCD_ShowString(2,1,****); state1;}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);state0;for( iErrorCount*5;i0 ; i-- )//for循环一秒刷新一次倒计时{LCD_ShowNum(1,8,i,4);Delay(1000);}Password0; //密码清零InputCount0; //计数清零LCD_ShowString(1,1,Password: );LCD_ShowString(2,1,**** ); }} 二、进阶功能介绍
/*
第一次独自开发这类项目代码逻辑和格式可能有点混乱。
不过功能都测试过啦没问题的还请多多包涵。
*/
1.输入错误密码进行锁机操作 每输入错误一次增加5秒的锁机时间倒计时每秒刷新显示剩余锁机时间 图例累计输入错误三次 for( iErrorCount*5;i0 ; i-- )//for循环一秒刷新一次倒计时{LCD_ShowNum(1,8,i,4);Delay(1000);} 2.执行开锁步骤并可以自定义开锁后展示内容 按下按键S11确认将输入的数字与密码比较。 相同则显示PASS并且更改状态state1。 当密码输入正确的时候状态变更为1未输入时和密码输入错误是仍然为0 再按下按键S14执行开锁步骤 自定义展示开锁内容小彩蛋*1 /*两个条件都满足才能触发||两个条件任一满足都可以触发前面正确输入密码并且按下按键14执行类似开锁的步骤*/if(KeyNum14 state1) {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 加载 进入重新设定密码的界面 if(KeyNum15) //如果S15按下执行重新输入密码的操作{ Password0; //密码清零InputCount0; //输入计数清零state0;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 显示新密码0226已经修改成功 if(KeyNum16)//如果S16按下重新设定密码并且显示新密码{secretPassword;Password0;InputCount0;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_RSP2^6;
sbit LCD_RWP2^5;
sbit LCD_ENP2^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_RS0;LCD_RW0;LCD_DataPortCommand;LCD_EN1;LCD_Delay();LCD_EN0;LCD_Delay();
}/*** brief LCD1602写数据* param Data 要写入的数据* retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS1;LCD_RW0;LCD_DataPortData;LCD_EN1;LCD_Delay();LCD_EN0;LCD_Delay();
}/*** brief LCD1602设置光标位置* param Line 行位置范围1~2* param Column 列位置范围1~16* retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line1){LCD_WriteCommand(0x80|(Column-1));}else if(Line2){LCD_WriteCommand(0x80|(Column-10x40));}
}/*** 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(i0;String[i]!\0;i){LCD_WriteData(String[i]);}
}/*** brief 返回值X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned c;char i;int Result1;for(i0;iY;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(iLength;i0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%100);}
}/*** 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(Number0){LCD_WriteData();Number1Number;}else{LCD_WriteData(-);Number1-Number;}for(iLength;i0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%100);}
}/*** 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(iLength;i0;i--){SingleNumberNumber/LCD_Pow(16,i-1)%16;if(SingleNumber10){LCD_WriteData(SingleNumber0);}else{LCD_WriteData(SingleNumber-10A);}}
}/*** 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(iLength;i0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%20);}
}
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 KeyNumber0;P10xFF; //默认都是1高电平P1_30;//检测按键按下就是判断是否变成0if(P1_70)//1行1列的按钮1
{Delay(20);while(P1_70){Delay(20);}KeyNumber1;
}if(P1_60)//2行1列的按钮5
{Delay(20);while(P1_60){Delay(20);}KeyNumber5;
}if(P1_50)//3行1列的按钮9
{Delay(20);while(P1_50){Delay(20);}KeyNumber9;
}if(P1_40)//4行1列的按钮13
{Delay(20);while(P1_40){Delay(20);}KeyNumber13;
}P10xFF; //默认都是1高电平P1_20;//检测按键按下就是判断是否变成0if(P1_70)//1行2列的按钮2
{Delay(20);while(P1_70){Delay(20);}KeyNumber2;
}if(P1_60)//2行2列的按钮6
{Delay(20);while(P1_60){Delay(20);}KeyNumber6;
}if(P1_50)//3行2列的按钮10
{Delay(20);while(P1_50){Delay(20);}KeyNumber10;
}if(P1_40)//4行2列的按钮14
{Delay(20);while(P1_40){Delay(20);}KeyNumber14;
}P10xFF; //默认都是1高电平P1_10; //检测按键按下就是判断是否变成0if(P1_70)//1行3列的按钮3
{Delay(20);while(P1_70){Delay(20);}KeyNumber3;
}if(P1_60)//2行3列的按钮7
{Delay(20);while(P1_60){Delay(20);}KeyNumber7;
}if(P1_50)//3行3列的按钮11
{Delay(20);while(P1_50){Delay(20);}KeyNumber11;
}if(P1_40)//4行3列的按钮15
{Delay(20);while(P1_40){Delay(20);}KeyNumber15;
}P10xFF; //默认都是1高电平P1_00;//检测按键按下就是判断是否变成0if(P1_70)//1行4列的按钮4
{Delay(20);while(P1_70){Delay(20);}KeyNumber4;
}if(P1_60)//2行4列的按钮8
{Delay(20);while(P1_60){Delay(20);}KeyNumber8;
}if(P1_50)//3行4列的按钮12
{Delay(20);while(P1_50){Delay(20);}KeyNumber12;
}if(P1_40)//4行4列的按钮16
{Delay(20);while(P1_40){Delay(20);}KeyNumber16;
}return KeyNumber;
} 6.矩阵按键初始化代码.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif 四、设备和原理图
1.LCD1602 2.STC89C52 3.矩阵键盘模块 原理图从转载“普中-2普中-3普中-4开发板原理图,非商业用途。 4.Keil5界面 创作不易主函数在主页下载资源内 【免费】51单片机进阶版密码锁资源-CSDN文库 谢谢大家 小白一枚请多指教 FROM 明月清风mls