⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 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 + -