找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6088|回复: 4
打印 上一主题 下一主题
收起左侧

用24c04与1602液晶屏设计的简易加密电子锁 程序+原理图+仿真下载

  [复制链接]
跳转到指定楼层
楼主
ID:93915 发表于 2015-11-1 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用24c04与1602液晶屏设计的简易加密电子锁源程序+仿真文件下载: 用24c04与1602液晶屏设计的简易加密电子锁.rar (96 KB, 下载次数: 228)

主程序预览:
  1. #include"LCD1602.h"
  2. #include"AT24C04.h"

  3. //上次按键和当前按键序号,该矩阵中序号范围为0~15,16表示无按键
  4. INT8U Key_Value = 0xFF, Pre_KeyNo = 0xFF;
  5. INT8U DSY_BUFFER[10]= "";           //显示缓冲区
  6. INT8U UserPassword[7];                            //用户输入密码
  7. INT8U I2C_Password[7];              //从I2C存储器读取的密码

  8. sbit LED_OPEN = P2^7;                            //开锁亮灯
  9. sbit BEEP = P3^7;                                   //蜂鸣器

  10. void Beep();
  11. void Clear_Pwd();
  12. void Read_I2C_Pwd();
  13. void Write_I2C_Pwd();
  14. void Keys_Scan();
  15. //----------主程序------------
  16. void main()
  17. {
  18.         INT8U i = 0;
  19.         INT8U IS_Valid_User = 0;
  20.         P0 = 0xFF; P1 = 0xFF; P2 = 0xFF;
  21.         Delay_ms(10);
  22.         Init_LCD();        //初始化LCD
  23.         Write_LCD_String(0, 0, "Your Password...");
  24.         Read_I2C_Pwd();     //将密码读入I2C         
  25.         while(1)
  26.         {
  27.                 P1 = 0x0F;
  28.                 while(P1 == 0x0F);        Keys_Scan();                  
  29.                 Pre_KeyNo = Key_Value;  //扫描键盘获取键序号
  30.                 switch(Pre_KeyNo)
  31.                 {
  32.                         case 0: case 1: case 2: case 3: case 4:
  33.                         case 5: case 6: case 7: case 8: case 9:
  34.                                         if(i <= 5)
  35.                                         {
  36.                                                 //如果i为0则执行一次清屏
  37.                                                 if(i == 0) Write_LCD_String(1, 0, "              ");
  38.                                                 UserPassword[i] = Pre_KeyNo + '0';
  39.                                                 UserPassword[i+1] = '\0';
  40.                                                 DSY_BUFFER[i] = '*';
  41.                                                 DSY_BUFFER[i+1] = '\0'; i++;
  42.                                                 Write_LCD_String(1, 0,DSY_BUFFER );
  43.                                         }   break;
  44.                         case 10: //按A键开锁
  45.                                          Read_I2C_Pwd();    //从I2C存储器读回密码
  46.                                          if(strcmp(UserPassword,I2C_Password) == 0)
  47.                                          {
  48.                                                  LED_OPEN = 0;  //点亮LED
  49.                                                 Clear_Pwd();
  50.                                                 Write_LCD_String(1, 0, "Unlock OK!        ");
  51.                                                 IS_Valid_User = 1;
  52.                                          }
  53.                                          else
  54.                                          {
  55.                                                  LED_OPEN = 1;  //关闭LED
  56.                                                 Clear_Pwd();
  57.                                                 Write_LCD_String(1, 0, "ERROR !         ");
  58.                                                 IS_Valid_User = 0;                                               
  59.                                          }
  60.                                          i = 0; break;
  61.                         case 11: //按B键上锁
  62.                                         LED_OPEN = 1;
  63.                                         Clear_Pwd();
  64.                                         Write_LCD_String(0, 0, "Your Password... ");
  65.                                         Write_LCD_String(1, 0, "              ");
  66.                                         i = 0;        IS_Valid_User = 0; break;
  67.                         case 12: //按C键设置新密码
  68.                                          //如果是合法用户则提示输入新密码
  69.                                          if(!IS_Valid_User)
  70.                                                  Write_LCD_String(1, 0, "No right ! ");
  71.                                          else
  72.                                          {
  73.                                                  i = 0;  //密码输入缓冲索引归零
  74.                                                 Write_LCD_String(0, 0, "New Password:... ");
  75.                                                 Write_LCD_String(1, 0, "                 ");
  76.                                          } break;
  77.                         case 13: //按D键保存新密码
  78.                                         if(!IS_Valid_User)
  79.                                                 Write_LCD_String(1, 0, "No right ! ");
  80.                                         else
  81.                                         {
  82.                                                 //写入新设置的密码,并重新读回
  83.                                                 Write_I2C_Pwd(); Delay_ms(5); Read_I2C_Pwd();
  84.                                                 i = 0; //密码输入缓冲索引归零
  85.                                                 Write_LCD_String(0, 0, "Your Password ... ");
  86.                                             Write_LCD_String(1, 0, "Password Saved !  ");
  87.                                         } break;
  88.                         case 14: //按E键消除所有输入
  89.                                         i = 0; Clear_Pwd();
  90.                                         Write_LCD_String(0, 0, "Your Password... ");
  91.                                         Write_LCD_String(1, 0, "                  ");       

  92.                 }
  93.                 Beep(); Delay_ms(100);
  94.                 while(P1 != 0xF0);                //如果有键未释放则等待
  95.         }
  96.        
  97. }

  98. //-----------蜂鸣器子程序------------
  99. void Beep()
  100. {
  101.         INT8U i;
  102.         for(i = 0; i < 100; i++)
  103.         {
  104.                 Delay_ms(1);
  105.                 BEEP = ~BEEP;
  106.         }
  107.         BEEP = 0;
  108. }
  109. //------------清除密码--------------
  110. void Clear_Pwd()
  111. {
  112.         UserPassword[0] = '\0';
  113.         DSY_BUFFER[0]='\0';
  114. }
  115. //----------读取密码字符串(以'\0'为结束标志)----------
  116. void Read_I2C_Pwd()
  117. {
  118.         INT8U i = -1; //只限于读取存储器前半部分
  119.         do {        i++;        I2C_Password[i] = Random_Read(0xA0,(INT16U)i); }
  120.         while(I2C_Password[i] != '\0' && i < 6);
  121.         //如果循环结束后未遇到结束标志,则直接在字符串末尾补上结束标志
  122.         if(I2C_Password[i] != '\0')  I2C_Password[i] = '\0';
  123. }

  124. //----------写密码字符串(结束标志'\0'注意一并写入)---------
  125. void Write_I2C_Pwd()
  126. {
  127.         INT8U i = 0;
  128.         //循环写入密码字符,字符串末尾的'\0'也要写入,最多7个字符
  129.         while(i <= 6)
  130.         {
  131.                 Random_Write(0xA0, i,UserPassword[i]); Delay_ms(5);
  132.                 if(UserPassword[i] == '\0') break;
  133.                 i++;
  134.         }
  135.         //如果循环结束时密码字符串末尾未遇到'\0'则直接向I2C补充写入'\0'
  136.         if(UserPassword[i] != '\0')  Random_Write(0xA0, i,'\0');
  137. }
  138. //-----------------键扫描------------------------------------
  139. void Keys_Scan()
  140. {
  141.         /*列判断*/
  142.         P1 = 0x0F; Delay_ms(1);                       
  143.         if(P1 == 0x0F)        
  144.         {
  145.                 Key_Value = 0xFF; return;       
  146.         }
  147.         switch(P1)
  148.         {
  149.                 case 0x0E: Key_Value = 0; break;
  150.                 case 0x0D: Key_Value = 1; break;
  151.                 case 0x0B: Key_Value = 2; break;
  152.                 case 0x07: Key_Value = 3; break;
  153.                 default : Key_Value = 0xFF; return;
  154.         }
  155.         /*行判断*/
  156.         P1 = 0xF0; Delay_ms(1);
  157.         switch(P1)
  158.         {
  159.                 case 0xE0: Key_Value += 0; break;
  160.                 case 0xD0: Key_Value += 4; break;
  161.                 case 0xB0: Key_Value += 8; break;
  162.                 case 0x70: Key_Value += 12; break;
  163.                 default : Key_Value = 0xFF;   
  164.         }       

  165. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:183554 发表于 2017-3-26 16:24 | 只看该作者
66666厉害额大神6666
回复

使用道具 举报

板凳
ID:448152 发表于 2018-12-18 09:55 | 只看该作者
y有没有点h文件
回复

使用道具 举报

地板
ID:204748 发表于 2018-12-18 11:03 来自手机 | 只看该作者
可以,玩玩。
回复

使用道具 举报

5#
ID:1015923 发表于 2022-4-5 19:15 | 只看该作者
666简直是宝地
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表