找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6945|回复: 14
收起左侧

行列反转发实现具有4位密码设置的实用密码锁单片机程序,数码管显示

  [复制链接]
ID:531603 发表于 2019-5-28 18:28 | 显示全部楼层 |阅读模式
      下面设计具体有16个按键输入,S12~S15此处无用、用4为集成数码管显示4为密码。矩阵键盘电路由P2口低四位控制4行,P2口高四位控制4列,数码管短线段与P0口相连,4调位选控制线与P1口低四位相连,模拟锁状态的发光二极管由P3.0控制。

密码锁功能如下:
(1)系统上电,数码管显示 - - - -,此时可输入4位密码,然后以OK KEY键结束输入,如果密码输入正确数码管显示 P,按下任意键结束;如果密码输入错误数码管显示 E 1秒,重新输入。
(2)PASS KEY作为密码设置按键,再次按下或已重置输入4位密码 则显示 P 表示设置密码成功返回输入状态。

仿真:
3.png


部分程序:
  1. #include <reg51.h>

  2. void delay(unsigned int i)                //延时函数
  3. {
  4.         unsigned int k;
  5.         for(k = 0; k < i; k++);
  6. }

  7. unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};  //键盘扫描码
  8. unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};                //数码管显示码
  9. unsigned char pw[4]={0,0,0,0};                                        //存放原始密码
  10. unsigned char pwnew[4]={10,10,10,10};                //存放输入的密码
  11. sbit P30=P3^0;

  12. void set_pw();                //密码设置函数
  13. void dispset();                //密码设置显示函数
  14. void dispnew();                //当先输入密码显示函数
  15. void dispright();        //输入密码正确显示函数
  16. void disperror();        //输入密码错误显示函数
  17. char keyscan();                //行列反转法实现的矩阵键盘扫描函数



  18. void main()
  19. {
  20.         char i,count;
  21.         bit pw_flag;                //密码标志位,1表示正确0表示错误
  22.         while(1)
  23.         {
  24.                 i=keyscan();
  25.                 dispnew();
  26.                 if(i!=-1)                        //判断是否有按键按下
  27.                 {
  28.                         if(i==11)                //按下11号按键,进入密码设置界面
  29.                         {
  30.                                 P2=0xf0;
  31.                                 while(P2!=0xf0);
  32.                                 set_pw();
  33.                         }
  34.                         
  35.                         if((i>=0) && (i<=9))
  36.                         {
  37.                                 pwnew[count]=i;                //给pwnew数组赋上当前按下按键对应的值
  38.                                 
  39.                                 count++;
  40.                                 P2=0xf0;
  41.                                 while(P2!=0xf0);                //判断按键释放
  42.                         }
  43.                         
  44.                         else if(i==10)                                //输入密码完成后按下确认键
  45.                                 {        pw_flag=1;                                //附上原始状态
  46.                                 if(count!=4)                                //先判断输入字符个数是否正确
  47.                                         pw_flag=0;                                //不正确,则修改密码标志位为0
  48.                                 else
  49.                                 {for(i=0;i<4;i++)                //比较输入字符与原始密码是否相同
  50.                                         {if(pw[i]!=pwnew[i])
  51.                                                 {pw_flag=0; break;}
  52.                                         }
  53.                                 }
  54.                                 
  55.                                 if(pw_flag==1)                        //密码输入正确
  56.                                 {
  57.                                         dispright();                        //显示密码输入正确显示 P
  58.                                         P30 = 0;                                                //开锁指示灯亮
  59.                                         delay(20000);
  60.                                         while(1)
  61.                                         {
  62.                                                 i=keyscan();
  63.                                                 if(i!=-1)                                //有按键按下则退出等待状态
  64.                                                         break;        
  65.                                         }
  66.                                         P2=0xf0;
  67.                                         while(P2!=0xf0);                //判断按键释放
  68.                                 }
  69.                                 else
  70.                                 {
  71.                                         disperror();                        //密码输入错误显示 E
  72.                                         P30 = 1;
  73.                                 }
  74.                                 count=0;
  75.                                 delay(50000);
  76.                                 for(i=0;i<4;i++)                //清楚当前输入值
  77.                                 {
  78.                                         pwnew[i]=10;
  79.                                 }
  80.                                 
  81.                                 
  82.                         }        
  83.                 }
  84.         }
  85. }
复制代码

Keil代码与Proteus仿真下载:
四位密码锁.7z (91.99 KB, 下载次数: 222)

评分

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

查看全部评分

回复

使用道具 举报

ID:222956 发表于 2019-6-5 12:00 | 显示全部楼层
谢谢楼主,仿真成功了,中文注释也很详细  密码是0000哦
51hei.png
51hei.png
回复

使用道具 举报

ID:840421 发表于 2020-11-15 12:22 来自手机 | 显示全部楼层
楼主,解压密码是多少?
回复

使用道具 举报

ID:840216 发表于 2020-11-22 13:02 | 显示全部楼层
下下来之后,注释全是乱码,可以重新发一下吗
回复

使用道具 举报

ID:849172 发表于 2020-11-26 09:44 来自手机 | 显示全部楼层
楼主,仿真打不开啊
回复

使用道具 举报

ID:942018 发表于 2021-6-21 23:53 | 显示全部楼层
嗒嗒嗒2 发表于 2019-6-5 12:00
谢谢楼主,仿真成功了,中文注释也很详细  密码是0000哦

能发一下后续代码吗
回复

使用道具 举报

ID:954263 发表于 2021-7-18 02:14 | 显示全部楼层
心态崩了 ,下载下来没有hex,后面仿真也是搞不成
回复

使用道具 举报

ID:328014 发表于 2021-7-18 04:37 | 显示全部楼层
2657575938 发表于 2021-7-18 02:14
心态崩了 ,下载下来没有hex,后面仿真也是搞不成

学单片机切勿心急,要慢慢弄懂每一个细节,hex文件在 "程序\Objects" 目录里面,仿真用Proteus8.8,你看我这不是成功了吗?
51hei.png
51hei.gif
回复

使用道具 举报

ID:993542 发表于 2021-12-17 12:36 来自手机 | 显示全部楼层
51hei团团 发表于 2021-7-18 04:37
学单片机切勿心急,要慢慢弄懂每一个细节,hex文件在 "程序\Objects" 目录里面,仿真用Proteus8.8,你看我这 ...

有后续的代码吗
回复

使用道具 举报

ID:877543 发表于 2021-12-17 15:45 | 显示全部楼层
谢谢楼主,仿真成功了,中文注释也很详细  密码是0000哦
回复

使用道具 举报

ID:1030330 发表于 2022-6-2 00:39 | 显示全部楼层
你好 我的单片机是用P3口的,行列都是,我试着改了但是不对,请问我对应的话应该改哪里,麻烦了
回复

使用道具 举报

ID:143767 发表于 2022-6-4 15:09 | 显示全部楼层
楼主你好,我在你开锁指示灯 delay(20000);后面加了P30 = 1; ,但是仿真的时候LED只是亮了一下然后迅速熄灭,延时改成100000也是一样,请教各位怎样让LED开锁后延时5秒后熄灭,谢谢!
回复

使用道具 举报

ID:1038334 发表于 2022-7-5 23:14 来自手机 | 显示全部楼层
为什么程序是乱码
回复

使用道具 举报

ID:1038334 发表于 2022-7-5 23:15 来自手机 | 显示全部楼层
wofa 发表于 2021-12-17 15:45
谢谢楼主,仿真成功了,中文注释也很详细  密码是0000哦

请问有注释吗,我打开的不是程序,
回复

使用道具 举报

ID:262 发表于 2022-7-6 05:54 | 显示全部楼层
2807326858 发表于 2022-7-5 23:14
为什么程序是乱码

打开方式有问题吧,是第一次用Keil吗?你从网页上把复制过去 重新建立工程,就可以了,不需要下载.你看我的打开效果
51hei.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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