找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6296|回复: 3
收起左侧

用STM32F103C6芯片编写密码锁程序

[复制链接]
ID:604979 发表于 2019-8-29 08:51 | 显示全部楼层 |阅读模式
设计制作一个具备开锁、密码设置、密码清除等功能的密码锁实现:
(1) 使用适当的显示装置LCMOLED、数码管等)实现系统的操作显示;
(2) 系统初始化密码123456”,在输入密码时可以实现开锁功能输入非法的密码是可以通过显示屏、蜂鸣器等发出报警;
(3) 可通过密码设置功能实现修改密码和设置密码,至多可设置6密码
(4) 开锁密码具备不同的操作权限,分别为永久有效、约定次数有效约定时长有效其中约定次数有效需要设定操作次数,例如设定10,那么在操作时,本密码有效使用10以后失效,约定时长有效需要设置使用时间,例如设定202011那么本密码202011前可以开门,在此日期之后,密码失效

单片机源程序如下:
  1. /****************************************
  2. * 文件名  :key4x4.c
  3. * 描述    :按键应用函数库        
  4. * 硬件连接:-------------------------
  5. *          | PB8  - H4          |
  6. *          | PB9  - H3                         |
  7. *          | PB10 - H2          |
  8. *          | PB11 - H1                     |
  9. *          | PB12 - L4          |
  10. *          | PB13 - L3                     |
  11. *          | PB14 - L2          |
  12. *          | PB15 - L1                         |
  13. *           -------------------------
  14. * 库版本  :ST3.5.0
  15. **********************************************************************************/

  16. #include "key4x4.h"
  17. #include "delay.h"

  18. /*
  19. * 函数名:Key_GPIO_Config
  20. * 描述  :配置按键用到的I/O口
  21. * 输入  :无
  22. * 输出  :无
  23. */
  24. void Key4x4_GPIO_Config(void)
  25. {
  26.           GPIO_InitTypeDef GPIO_InitStructure;
  27.          
  28.           /*开启按键端口的时钟*/
  29.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  33.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  34.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;       
  35.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
  36.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  38. }

  39. u8 Key_Scan(void)
  40. {
  41.         u16 temp;
  42.         u8 ucBackValue=0;
  43.         //====扫描第一列==========
  44.         GPIO_Write(GPIOB,0xfe00);
  45.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  46.         temp=temp&0xf000;    //屏蔽低4位
  47.         if (temp!=0xf000)      //假如高4位不全是1
  48.         {
  49.                 delay_ms(20);      // 延时消抖再读
  50.                 temp=GPIO_ReadInputData(GPIOB);
  51.                 temp=temp&0xf000;
  52.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  53.                 {
  54.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  55.                         switch(temp)
  56.                         {
  57.                                 case 0xee00:
  58.                                 ucBackValue = 1;break;
  59.                                 case 0xde00:
  60.                                 ucBackValue = 5;break;
  61.                                 case 0xbe00:
  62.                                 ucBackValue = 9;break;
  63.                                 case 0x7e00:
  64.                                 ucBackValue = 13;break;
  65.                                 default:break;
  66.                         }
  67.                         while(temp!=0xf000)   //等待按键放开,初始必然被执行
  68.                         {
  69.                                 temp=GPIO_ReadInputData(GPIOB);
  70.                                 temp=temp&0xf000;
  71.                         }

  72.                 }
  73.         }

  74.         //====第二列送0==========
  75.         GPIO_Write(GPIOB,0xfd00);
  76.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  77.         temp=temp&0xf000;    //屏蔽低4位
  78.         if (temp!=0xf000)      //假如高4位不全是1
  79.         {
  80.                 delay_ms(20);      // 延时消抖再读
  81.                 temp=GPIO_ReadInputData(GPIOB);
  82.                 temp=temp&0xf000;
  83.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  84.                 {
  85.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  86.                         switch(temp)
  87.                         {
  88.                                 case 0xed00:
  89.                                         ucBackValue = 2; break;
  90.                                 case 0xdd00:
  91.                                         ucBackValue = 6; break;
  92.                                 case 0xbd00:
  93.                                         ucBackValue = 10; break;
  94.                                 case 0x7d00:
  95.                                         ucBackValue = 14; break;
  96.                                 default:break;
  97.                 }
  98.                         while(temp!=0xf000)   //等待按键放开
  99.                         {
  100.                                 temp=GPIO_ReadInputData(GPIOB);
  101.                                 temp=temp&0xf000;
  102.                         }
  103.                 }
  104.         }
  105.         //====第3列送0==========
  106.         GPIO_Write(GPIOB,0xfb00);
  107.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  108.         temp=temp&0xf000;    //屏蔽低4位
  109.         if (temp!=0xf000)      //假如高4位不全是1
  110.         {
  111.                 delay_ms(20);      // 延时消抖再读
  112.                 temp=GPIO_ReadInputData(GPIOB);
  113.                 temp=temp&0xf000;
  114.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  115.                 {
  116.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  117.                         switch(temp)
  118.                         {
  119.                                 case 0xeb00:
  120.                                 ucBackValue = 3; break;
  121.                                 case 0xdb00:
  122.                                 ucBackValue = 7; break;
  123.                                 case 0xbb00:
  124.                                 ucBackValue = 11; break;
  125.                                 case 0x7b00:
  126.                                 ucBackValue = 15; break;
  127.                                 default:break;
  128.                 }
  129.                 while(temp!=0xf000)   //等待按键放开
  130.                 {
  131.                         temp=GPIO_ReadInputData(GPIOB);
  132.                         temp=temp&0xf000;
  133.                 }
  134.                 }
  135.         }
  136.         //====第4列送0==========
  137.         GPIO_Write(GPIOB,0xf700);
  138.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  139.         temp=temp&0xf000;    //屏蔽低4位
  140.         if (temp!=0xf000)      //假如高4位不全是1
  141.         {
  142.                 delay_ms(20);       // 延时消抖再读
  143.                 temp=GPIO_ReadInputData(GPIOB);
  144.                 temp=temp&0xf000;
  145.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  146.                 {
  147.                         temp=GPIO_ReadInputData(GPIOB)&0xff00;
  148.                         switch(temp)
  149.                         {
  150.                                 case 0xe700:
  151.                                 ucBackValue = 4; break;
  152.                                 case 0xd700:
  153.                                 ucBackValue = 8; break;
  154.                                 case 0xb700:
  155.                                 ucBackValue = 12; break;
  156.                                 case 0x7700:
  157.                                 ucBackValue = 16; break;
  158.                                 default:break;
  159.                         }
  160.                         while(temp!=0xf000)   //等待按键放开
  161.                         {
  162.                                 temp=GPIO_ReadInputData(GPIOB);
  163.                                 temp=temp&0xf000;
  164.                         }
  165.                 }
  166.         }
  167.         return ucBackValue;
  168. }
复制代码

所有资料51hei提供下载:
矩阵键盘.7z (139.52 KB, 下载次数: 110)
回复

使用道具 举报

ID:91165 发表于 2020-3-7 11:51 | 显示全部楼层
下载了学习学习
回复

使用道具 举报

ID:772838 发表于 2020-6-8 14:45 来自手机 | 显示全部楼层
有仿真么?
回复

使用道具 举报

ID:774190 发表于 2020-6-9 17:07 来自手机 | 显示全部楼层
有仿真吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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