📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: 用内置EEPROM与1602液晶设计的加密电子密码锁
//-----------------------------------------------------------------
// 说明: 初始密码为123456,EEPROM中同时保存了密码明文与密文.
// 数字键0-9中用于输入密码,密码不超过10位,输入完成后按下
// "开锁键"开锁,密码正确时LED点亮,液晶屏显示开锁成功.
// 另外,本例还具备:上锁,重新输入密码,保存新密码,清除等功能.
// 重设密码时要求先输入正确的密码并成功开锁.
//
//-----------------------------------------------------------------
#include <pic.h>
#include <stdio.h>
#include <string.h>
#include "LCD1602_4BIT.h"
//蜂鸣器引脚定义
#define BEEP RE0
//继电器控制引脚
#define RELAY RE1
//电子锁指示灯开关定义
#define LED_ON() RE2 = 0
#define LED_OFF() RE2 = 1
//液晶相关函数
extern void LCD_Initialize();
extern void LCD_ShowString(INT8U x, INT8U y,char *str);
//键盘扫描相关函数及按键键值
extern void Keys_Scan();
extern INT8U KeyMatrix_Down();
extern INT8U KeyNo;
//LCD提示字符串
const char *Title_Text = "Your Password...";
//显示缓冲
char DSY_BUFFER[10] = "";
//保存在EEPROM中的密码明文与密文(明文仅用于调试)
char EEPROM_Password[11],Custom_Encrypt_Pass[11];
//用户输入的密码(密码不超过10位)
volatile char UserInputPassword[11];
//-----------------------------------------------------------------
// 蜂鸣器子程序
//-----------------------------------------------------------------
void Sounder()
{
INT8U i;
for (i = 0; i < 100; i++) { __delay_ms(1); BEEP = ~BEEP; }
BEEP = 0;
}
//-----------------------------------------------------------------
// 自定义简易密码加密算法
//-----------------------------------------------------------------
void Encrypt_Password(char *s)
{
//对各字符ASCII码平方并加1,遇到0x00或0xFF时再+2;
INT8U i, t, len = strlen(s);
for (i = 0; i < len; i++)
{
}
//反向(对称交换)
}
//-----------------------------------------------------------------
// 清除密码
//-----------------------------------------------------------------
void Clear_Password()
{
}
//-----------------------------------------------------------------
// 读取EEPROM中的密码密文(以'\0'或0xFF为结果标志)
//-----------------------------------------------------------------
void Read_EEPROM_Password()
{
}
//-----------------------------------------------------------------
// 将新密码保存到EEPROM,为便于读者调试观察,
// 本函数同时保存了新密码的密文和明文,保存位置分别为:0x00,0x10)
//-----------------------------------------------------------------
void Save_Password_TO_EEPROM()
{
INT8U i, addr = 0x00;
//对新输入的密码用自定义简易加密算法加密
//保存所输入新密码的密文,注意循环终止条件中的"<=",
//这是为了保证将字符串末尾的'\0'也写入EEPROM
//同时在0x10地址保存明文,以便于调试观察,实际应用时应该删除
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
INT8U i = 0;
INT8U IS_Valid_User = 0;
ADCON1 = 0x06; //关闭AD端口
TRISE = 0x00; //LED与蜂鸣器输出端口
LED_OFF(); RELAY = 1; //初始时开锁指示灯灭,继电器断开
LCD_Initialize(); //LCD初始化
LCD_ShowString(0,0,(char*)Title_Text); //在第0行显示提示信息
//PIC EEPROM的密码已由初始化Password.BIN文件导入
//下面将EEPROM中预设的密码读入EEPROM_Password
Read_EEPROM_Password();
while(1)
{
//如果键盘矩阵有键按下则扫描键值,否则继续
if (KeyMatrix_Down()) Keys_Scan(); else continue;
//如果键值有效则发出按键声音,否则继续
if (KeyNo != 0xFF) Sounder(); else continue;
switch ( KeyNo )
{
//处理数字密码按键0-9-----------------------------------
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9:
if ( i <= 9 ) //密码限制在10位以内
{
//如果i为0则执行一次清屏
if (i == 0 ) LCD_ShowString(1,0,(char*)" ");
}
break;
case 10: //按A键开锁------------------------------------
//将读取的密码串与用户输入的密码自定义加密后的字符串比较
Encrypt_Password(UserInputPassword);
if (strcmp(Custom_Encrypt_Pass,EEPROM_Password) == 0)
{ Clear_Password();
LCD_ShowString(1,0,(char*)"Unlock OK! ");
}
else
{ Clear_Password();
LCD_ShowString(1,0,(char*)"ERROR ! ");
}
i = 0;
break;
case 11: //按B键上锁------------------------------------
LED_OFF(); RELAY = 1; //开锁指示灯灭,继电器断开
Clear_Password();
LCD_ShowString(0,0,(char*)Title_Text);
LCD_ShowString(1,0,(char*)" ");
case 12: //按C键设置新密码------------------------------
//如果是合法用户则提示输入新密码
if ( !IS_Valid_User ) LCD_ShowString(1,0,(char*)"No rights ! ");
else
{ i = 0;
LCD_ShowString(0,0,(char*)"New Password: ");
LCD_ShowString(1,0,(char*)" ");
}
break;
case 13: //按D键保存新密码------------------------------
if ( !IS_Valid_User ) LCD_ShowString(1,0,(char*)"No rights ! ");
else
{ //如果密码有效则保存新输入的密码
if (strlen(UserInputPassword) != 0)
{
//为便于查看EEPROM内的密码数据,本例同时保存了两套密码
//即:加密密码与未加密密码
Save_Password_TO_EEPROM();
LCD_ShowString(1,0,(char*)"Password Saved! ");
__delay_ms(700); //700ms后重新提示输入密码开锁
LCD_ShowString(0,0,(char*)Title_Text);
LCD_ShowString(1,0,(char*)" ");
//重新读取EEPROM中的新密码,保存到EEPROM_Password字符串中
//或者用strcpy将UserInputPassword直接拷贝到EEPROM_Password
//以便后续开锁时与新密码比对.
Read_EEPROM_Password();
}
else LCD_ShowString(1,0,(char*)"Password Empty! ");
i = 0;
}
break;
case 14: //按E键消除所有输入----------------------------
i = 0; Clear_Password();
LCD_ShowString(1,0,(char*)" ");
}
while (KeyMatrix_Down()); //如果按键未释放则等待
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -