找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6938|回復: 3
收起左側(cè)

用STM32F103C6芯片編寫密碼鎖程序

[復制鏈接]
ID:604979 發(fā)表于 2019-8-29 08:51 | 顯示全部樓層 |閱讀模式
設(shè)計制作一個具備開鎖、密碼設(shè)置、密碼清除等功能的密碼鎖,實現(xiàn):
(1) 使用適當?shù)?font face="宋體">顯示裝置LCM、OLED、數(shù)碼管等)實現(xiàn)系統(tǒng)的操作顯示;
(2) 系統(tǒng)初始化密碼123456”,在輸入密碼時可以實現(xiàn)開鎖功能,輸入非法的密碼是可以通過顯示屏、蜂鳴器等發(fā)出報警;
(3) 可通過密碼設(shè)置功能實現(xiàn)修改密碼和設(shè)置密碼,至多可設(shè)置6密碼;
(4) 開鎖密碼具備不同的操作權(quán)限,分別為永久有效、約定次數(shù)有效、約定時長有效。其中約定次數(shù)有效需要設(shè)定操作次數(shù),例如設(shè)定10,那么在操作時,本密碼有效使用10以后失效,約定時長有效需要設(shè)置使用時間,例如設(shè)定202011那么本密碼202011前可以開門,在此日期之后,密碼失效

單片機源程序如下:
  1. /****************************************
  2. * 文件名  :key4x4.c
  3. * 描述    :按鍵應(yīng)用函數(shù)庫        
  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. * 函數(shù)名: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)   //等待按鍵放開,初始必然被執(zhí)行
  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, 下載次數(shù): 110)



回復

使用道具 舉報

ID:91165 發(fā)表于 2020-3-7 11:51 | 顯示全部樓層
下載了學習學習
回復

使用道具 舉報

ID:772838 發(fā)表于 2020-6-8 14:45 來自觸屏版 | 顯示全部樓層
有仿真么?
回復

使用道具 舉報

ID:774190 發(fā)表于 2020-6-9 17:07 來自觸屏版 | 顯示全部樓層
有仿真嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表