#include "reg52.h"
#include "uart.h"
#include "LCD1602.h"
#include "Delay.h"
/*指令格式说明:
*'/'为分隔符,不是必须的,可以为其他符号
*"//"为结束符,是必须的,必须以//结束指令
*/
char *Password = "123456//";
int cnt = 0, time = 0;
void main(void)
{
char xbuff[20];
UART_Configure(9600);
LCD_Init();//配置9600波特率(默认无奇偶校验,1位停止位,8位数据位)
//UART_SendStr("输入密码\r\n");
while (1) {
TI = 0;
//UART_SendStr("输入密码\r\n");
//while(Uart.RX_OKFlag==0);
if (Uart.RX_OKFlag == 1) { //判断串口是否接收完成
strncpy(xbuff, Uart.RX_BUFF + 0, Uart.RX_OK_LEN); //+0表示从接收缓存的第0个字符开始截取RX_OK_LEN个字符到xbuff判断指令
if (strncmp(xbuff, Password, Uart.RX_OK_LEN) == 0) {
time = 0;
//LED_ON(1);
P2 = 0x00;
UART_SendStr("Unlocked\r\n");
LCD_ShowString(1, 1, "Unlocked");
cnt = 0;
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
while (Uart.RX_OKFlag == 0) {
time++;
Delay(1000);
if (time >= 20) {
UART_SendStr("Locked\r\n");
LCD_ShowString(1, 1, "Locked ");
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
time = 0;
break;
}
}
if (Uart.RX_OKFlag == 1) {
strncpy(xbuff, Uart.RX_BUFF + 0, Uart.RX_OK_LEN);
if (strncmp(xbuff, "Lock//", Uart.RX_OK_LEN) == 0) {
UART_SendStr("Locked\r\n");
LCD_ShowString(1, 1, "Locked ");
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
continue;
}
if (strncmp(xbuff, "Change//", Uart.RX_OK_LEN) == 0) {
UART_SendStr("Password\r\n");
LCD_ShowString(1, 1, "Password ");
//UART_SendStr(xbuff);
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
//UART_SendStr(xbuff);
while (Uart.RX_OKFlag == 0);
//if(Uart.RX_OKFlag==1){
strncpy(xbuff, Uart.RX_BUFF + 0, Uart.RX_OK_LEN);
UART_SendStr(xbuff);
strcpy(Password,xbuff);
UART_SendStr("New Password\r\n");
UART_SendStr(Password);
//UART_SendStr("\r\n");
LCD_ShowString(1, 1, "New Passwords");
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
continue;
//}
}
}
}
if (strncmp(xbuff, Password, Uart.RX_OK_LEN) != 0) {
//LED_OFF(1);
P2 = 0xFF;
UART_SendStr("Error\r\n");
LCD_ShowString(1, 1, "Error ");
cnt++;
}
/*-----------必须在最下面---------------------*/
Uart.RX_COUNT = 0; //清除缓存接收计数
Uart.RX_OKFlag = 0; //清除接收完成标志
UART_RX_BUFF_Clear();//清除接收缓存
/*--------------------------------------------*/
}
if (cnt > 2) {
UART_SendStr("Locking\r\n");
LCD_ShowString(1, 1, "Locking");
while (1) {
if (Uart.RX_OKFlag == 1) {
strncpy(xbuff, Uart.RX_BUFF + 0, Uart.RX_OK_LEN);
if (strncmp(xbuff, "解锁//", Uart.RX_OK_LEN) == 0) {
UART_SendStr("Unlock\r\n");
LCD_ShowString(1, 1, "Unlock");
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
break;
}
Uart.RX_COUNT = 0;
Uart.RX_OKFlag = 0;
UART_RX_BUFF_Clear();
}
}
cnt = 0;
}
}
}
这段代码是一个密码锁的程序,在串口接收到正确的密码后会将锁打开,并在20秒内等待另一个指令,如果接收到"Lock"指令,则将锁关闭,如果接收到"Change"指令,则会要求输入新的密码,如果输入的新密码符合要求,则修改密码。
需要注意的是,在修改密码时,新密码必须包含数字和字母,并且长度必须在6~12位之间。如果您无法修改密码,可以检查一下输入的新密码是否符合要求,或者检查一下在修改密码时是否正确输入了"Change"指令。