久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3769|回復: 2
打印 上一主題 下一主題
收起左側

8051單片機電子密碼鎖防盜系統的仿真設計(12864顯示)

[復制鏈接]
跳轉到指定樓層
樓主
字模方式:
{0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00},
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},/*"王",0*/
//取模方式為
//(1)點陣格式:陰碼
//(2)取模走向:逆向
//(3)取模方式:列行式
//(4)c51格式
//(5)點陣:16*16
//取模軟件為PCtolCD2002完美版

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /*
  2. 題目:基于8051單片機的電子密碼鎖防盜系統的設計
  3. 作者:yarcl(原名:肖志)
  4. 注意:本文件包含LCDINIT.H和OWNMATH.C文件,LCDINIT.H主要是包含位定義,全局變量,函數聲明等
  5.           而OWNMATH.C文件主要是包含12864液晶顯示屏的寫數據、寫指令函數。
  6.           本程序當中最核心的程序部分應該是鍵盤掃描函數,讀者可以細細品味其中的優點,在此不作敘述!
  7.           對了,修改密碼的函數是采用中斷方式1的模式進行的,大家也可以細細品味。
  8. */
  9. #include < reg52.h > //包含頭文件
  10. #include "LcdInit.h" //包含本地文件LcdInit.h
  11. #include "ownmath.c" //包含本地文件ownmath.c

  12. static uchar mima[6] = {1,2,3,7,8,9}; //存入的密碼
  13. uchar shuru[6];                                        //將輸入的密碼存入到shuru這個數組當中去

  14. //函數聲明
  15. uchar key_scan();

  16. //字模數據(依次順序為“居民小區:請輸入密碼:位數重新”)
  17. uchar code data_shuju[15][32] = {
  18. 0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,0x00,
  19. 0x40,0x30,0x0F,0x00,0xFC,0x44,0x44,0x44,0x47,0x44,0x44,0x44,0xFC,0x00,0x00,0x00,/*"居",0*/

  20. …………
  21. …………限于本文篇幅 余下代碼請從51黑下載附件…………

  22. 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",10*/
  23. };

  24. //消去液晶顯示屏的某些數字或者字母的顯示
  25. uchar code disappear_char[1][16] = {
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  27. };
  28. //消去液晶顯示屏的某些漢字的顯示
  29. uchar code disappear_hanzi[1][32] = {
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  32. };

  33. /***************************************************************
  34. 名稱:進入主函數時的初始化函數
  35. 功能:進行12864液晶顯示屏的初始化
  36.           并且顯示居民小區和請輸入密碼的提示字符
  37.           對門鎖的初始化作用,P32口的低電平
  38. ***************************************************************/
  39. void init_main() {
  40.         Lcd_Initial();                            //對12864液晶顯示屏的初始化作用
  41.         number = 0;                                   //密碼存儲,顯示位置,各方面清零
  42.         P32 = 0;                                   //進行電磁鐵的初始關閉作用
  43.         //顯示居民小區:
  44.         Lcd_Character_16X16( 1, 0, 0,data_shuju[0]);
  45.         Lcd_Character_16X16( 1, 0, 16,data_shuju[1]);
  46.         Lcd_Character_16X16( 1, 0, 32,data_shuju[2]);
  47.         Lcd_Character_16X16( 1, 0, 48,data_shuju[3]);
  48.         Lcd_Character_16X16( 1, 0, 64,data_shuju[4]);
  49.         //顯示請輸入密碼:
  50.         Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  51.         Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
  52.         Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
  53.         Lcd_Character_16X16( 1, 4, 48,data_shuju[8]);
  54.         Lcd_Character_16X16( 1, 4, 64,data_shuju[9]);
  55.         Lcd_Character_16X16( 1, 4, 80,data_shuju[10]);

  56.         EA = 1;                                           //總中斷打開
  57.         EX1 = 1;                                   //外部中斷1打開
  58.         IT1 = 0;                                   //外部中斷1工作方式,為低電平觸發,IT1 = 1為下降沿觸發
  59. }

  60. /***************************************************************
  61. 函數:主函數
  62. 功能:綜合各個函數的作用
  63. 注意:進入主函數的時候,首先開啟初始化函數功能
  64. ***************************************************************/
  65. void main() {
  66.         init_main();                           //初始化主函數之前的所有操作
  67.         while(1) {                                   //進入無限循環當中
  68.                 key_scan();                           //進行鍵盤掃描函數
  69.         }
  70.         //clear_screen();
  71. }

  72. /*********************************************************************
  73. 函數:鍵盤掃描函數
  74. 功能:集成了輸入密碼,顯示密碼個數,清除密碼,
  75.           顯示密碼正確與錯誤各種功能的集成函數
  76.           可稱為本函數的核心函數之一
  77. 鍵盤掃描方式:采用的翻轉法的鍵盤掃描,可以減少掃描代碼的數量
  78. 注意:本函數采用的是帶有返回值,不帶參數的函數,所以在函數的
  79.           末尾一定要加入return keyscan;這個語句
  80. **********************************************************************/
  81. uchar key_scan()
  82. {                                                                                  //函數開始
  83.    unsigned char k=0,p1_h=0,p1_l=0;                  //翻轉法的定義k為選擇分支作用,
  84.    uchar Mark;                                                                                  //p1_h是選擇分支的高四位,p1_l是選擇分支的低四位
  85.    char keyscan = 0, i = 0, j = 0;                  //記錄輸入的數據是數值,然后將其送入到shuru所代表的數組當中去
  86.                                                                                      //i的作用記錄輸入的數據是否是6位數據,防止超出所存儲的數組的空間
  87.                                                                                   //j的作用是用來加強功能鍵“確認”的作用
  88. /*************************/
  89.         P1 = 0xf0;                                  //翻轉法先給P1口送數據
  90.         k = P1;                                          //然后賦值給k
  91.         if(k != 0xf0)                                  //判斷k是否是0xf0,如果不是,進入內部執行相應的程序
  92.         {
  93.                 delayms(50);                          //延時,防抖動
  94.                 k = P1;                                  //重新賦值
  95.                 if(k != 0xf0)                          //確定是否k不等于0xf0
  96.                 {
  97.                         number++;                  //number用于確定后面的在12864中的輸出位置和密碼存儲的位置
  98.                         p1_h = P1;                  //將P1的高四位賦值給p1_h
  99.                         P1 = 0x0f;                  //然后將0x0f賦值給P1口,翻轉,確定低四位,賦值給p1_l
  100.                         p1_l = P1;                  //將P1口的值賦給p1_l(是小寫的字母l,不是數字1)

  101.                         k = p1_h|p1_l;                  //將高四位和低四位相或,然后賦值給k
  102.                         if (k == 0XE7) {          //此判斷是為了確定是否是確認按鍵,如果是,直接進入確定程序
  103.                                 j = 1;        
  104.                         }

  105.                         if(number == 7)                  //此判斷是為了確定輸入的是否是6個數字,防止多輸入或者少輸入
  106.                         {
  107.                                 if (k != 0XB7) {  //這個是判斷是否是清除按鍵,
  108.                                         number = 0;
  109.                                 }
  110.                         }

  111.                         while (p1_l == P1);          //這個是松手檢測,防止長時間按在按鍵上,使輸入的數據重復
  112.                         if (number > 0||j == 1){  
  113.                                 switch(k)          //條件分支語句
  114.                                 {
  115.                                         case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  116.                                         case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  117.                                         case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  118.                                         case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  119.                                         case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  120.                                         case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  121.                                         case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  122.                                         case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  123.                                         case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  124.                                         case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  125.                                         case 0XE7: number = 0;
  126.                                                            for(i = 0; i < 6; i++)
  127.                                                                         if (mima[i] != shuru[i])//對比原始密碼和輸入密碼
  128.                                                                         {
  129.                                                                                 Mark++;
  130.                                                                                 //該if語句是用來判斷密碼Mark的錯誤次數,一旦達到3次,
  131.                                                                                 //就進入到while循環當中,并且P30口 = 0;蜂鳴器響,直至單片機復位才可消失
  132.                                                                                 if (3 == Mark) {
  133.                                                                                         P30 = 0;
  134.                                                                                         Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  135.                                                                                         Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  136.                                                                                         Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  137.                                                                                         Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  138.                                                                                         Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  139.                                                                                         Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  140.                                                                                         while(1);
  141.                                                                                 }
  142.                                                                                 //密碼錯誤
  143.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  144.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  145.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[2]);
  146.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[3]);
  147.                                                                                 //消除密碼顯示
  148.                                                                                 delayms(1000);
  149.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  150.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  151.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  152.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  153.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  154.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  155.                                                                                 //消除密碼錯誤漢字顯示
  156.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  157.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  158.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  159.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  160.                                                                                 break;                                                                                                
  161.                                                                         }
  162.                                                                         if(i == 6)        //確認密碼是否是正確的,通過i值
  163.                                                                         {
  164.                                                                                 //輸入密碼正確
  165.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  166.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  167.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[4]);
  168.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[5]);
  169.                                                                                 delayms(1000);                //延時
  170.                                                                                 //消除密碼顯示位
  171.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  172.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  173.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  174.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  175.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  176.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  177.                                                                                 //消除密碼正確顯示位
  178.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  179.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  180.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  181.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  182.                                                                                 P32 = 1;
  183.                                                                                 delayms(2000);
  184.                                                                                 P32 = 0;
  185.                                                                         }
  186.                                                                 break;         
  187.                                         case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
  188.                                         //這個是用來清除輸錯的密碼,然后重新輸入新的位數的密碼
  189.                                         default: break;
  190.                                 /*        case 0XE7: return(4);break;
  191.                                         case 0XDE: return(5);break;
  192.                                         case 0XDD: return(6);break;
  193.                                         case 0XDB: return(7);break;
  194.                                         case 0XD7: return(8);break;
  195.                                         case 0XBE: return(9);break;
  196.                                         case 0XBD: return(10);break;
  197.                                         case 0XBB: return(11);break;
  198.                                         case 0XB7: return(12);break;
  199.                                         case 0X7E: return(13);break;
  200.                                         case 0X7D: return(14);break;
  201.                                         case 0X7B: return(15);break;
  202.                                         case 0X77: return(16);break;
  203.                                         default:  return(0);break;        */
  204.                                 }
  205.                         }
  206.                         
  207.                 }
  208.         }
  209.         return keyscan;                                //函數返回的參數
  210. }

  211. //修改密碼函數
  212. /*
  213. 名稱:修改密碼函數
  214. 功能:如果需要進行密碼的修改,可以調用此函數
  215. 注意:本函數可以采用中斷,或者外部按鍵的方式,密碼存儲在ROM中
  216. */
  217. void external_mima() interrupt 2{
  218.         unsigned char k=0,p1_h=0,p1_l=0;                         //翻轉法的定義k為選擇分支作用,
  219.            unsigned char Mark = 0;                                                                                            //p1_h是選擇分支的高四位,p1_l是選擇分支的低四位
  220.            char keyscan = 0, i = 0, j = 0, h = 0;                //記錄輸入的數據是數值,然后將其送入到shuru所代表的數組當中去
  221.                                                                                                      //i的作用記錄輸入的數據是否是6位數據,防止超出所存儲的數組的空間
  222.                                                                                                   //j的作用是用來加強功能鍵“確認”的作用
  223. nihao:        number = 0;                                                            //采用了goto語句,實現了錯誤輸入密碼后的重新輸入
  224.         //清除“居民小區:”顯示
  225.         Lcd_Character_16X16( 1, 0, 0,disappear_hanzi[0]);
  226.         Lcd_Character_16X16( 1, 0, 16,disappear_hanzi[0]);
  227.         Lcd_Character_16X16( 1, 0, 32,disappear_hanzi[0]);
  228.         Lcd_Character_16X16( 1, 0, 48,disappear_hanzi[0]);
  229.         Lcd_Character_16X16( 1, 0, 64,disappear_hanzi[0]);
  230.         //清除“請輸入密碼:”顯示
  231.         Lcd_Character_16X16( 1, 4, 0,disappear_hanzi[0]);
  232.         Lcd_Character_16X16( 1, 4, 16,disappear_hanzi[0]);
  233.         Lcd_Character_16X16( 1, 4, 32,disappear_hanzi[0]);
  234.         Lcd_Character_16X16( 1, 4, 48,disappear_hanzi[0]);
  235.         Lcd_Character_16X16( 1, 4, 64,disappear_hanzi[0]);
  236.         Lcd_Character_16X16( 1, 4, 80,disappear_hanzi[0]);
  237.         //顯示“請輸入6位數密碼”顯示
  238.         Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  239.         Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
  240.         Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
  241.         Lcd_Character_16X8( 1,  4, 48,shuzi[6]);
  242.         Lcd_Character_16X16( 1, 4, 56,data_shuju[11]);
  243.         Lcd_Character_16X16( 1, 4, 72,data_shuju[8]);
  244.         Lcd_Character_16X16( 1, 4, 88,data_shuju[9]);
  245.         Lcd_Character_16X16( 1, 4, 104,data_shuju[10]);
  246.                 while(1) {
  247.                 P1 = 0xf0;                                  //翻轉法先給P1口送數據
  248.                 k = P1;                                          //然后賦值給k
  249.                 if(k != 0xf0)                                  //判斷k是否是0xf0,如果不是,進入內部執行相應的程序
  250.                 {
  251.                         delayms(5);                          //延時,防抖動
  252.                         k = P1;                                  //重新賦值
  253.                         if(k != 0xf0)                          //確定是否k不等于0xf0
  254.                         {
  255.                                 number++;                  //number用于確定后面的在12864中的輸出位置和密碼存儲的位置
  256.                                 p1_h = P1;                  //將P1的高四位賦值給p1_h
  257.                                 P1 = 0x0f;                  //然后將0x0f賦值給P1口,翻轉,確定低四位,賦值給p1_l
  258.                                 p1_l = P1;                  //將P1口的值賦給p1_l(是小寫的字母l,不是數字1)
  259.         
  260.                                 k = p1_h|p1_l;                  //將高四位和低四位相或,然后賦值給k
  261.                                 if (k == 0XE7) {          //此判斷是為了確定是否是確認按鍵,如果是,直接進入確定程序
  262.                                         j = 1;        
  263.                                 }
  264.         
  265.                                 if(number == 7)                  //此判斷是為了確定輸入的是否是6個數字,防止多輸入或者少輸入
  266.                                 {
  267.                                         if (k != 0XB7) {  //這個是判斷是否是清除按鍵,
  268.                                                 number = 0;
  269.                                         }
  270.                                 }
  271.         
  272.                                 while (p1_l == P1);          //這個是松手檢測,防止長時間按在按鍵上,使輸入的數據重復
  273.                                 if (number > 0||j == 1){  
  274.                                         switch(k)          //條件分支語句
  275.                                         {        
  276.                                                 case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  277.                                                 case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  278.                                                 case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  279.                                                 case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  280.                                                 case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  281.                                                 case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  282.                                                 case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  283.                                                 case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  284.                                                 case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  285.                                                 case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  286.                                                 case 0XE7: number = 0;break;
  287.                                                 case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
  288.                                                 //這個是用來清除輸錯的密碼,然后重新輸入新的位數的密碼
  289.                                         }
  290.                                 }
  291.                                 
  292.                         }
  293.                         }
  294.                         if (k == 0XE7) break;
  295.                 }
  296.                 //消除“請輸入6位數密碼”顯示
  297.                 Lcd_Character_16X16( 1, 4, 0,disappear_hanzi[0]);
  298.                 Lcd_Character_16X16( 1, 4, 16,disappear_hanzi[0]);
  299.                 Lcd_Character_16X16( 1, 4, 32,disappear_hanzi[0]);
  300.                 Lcd_Character_16X8( 1,  4, 48,disappear_char[0]);
  301.                 Lcd_Character_16X16( 1, 4, 56,disappear_hanzi[0]);
  302.                 Lcd_Character_16X16( 1, 4, 72,disappear_hanzi[0]);
  303.                 Lcd_Character_16X16( 1, 4, 88,disappear_hanzi[0]);
  304.                 Lcd_Character_16X16( 1, 4, 104,disappear_hanzi[0]);
  305.                 Lcd_Character_16X16( 1, 4, 120,disappear_hanzi[0]);
  306.                 //消除密碼顯示
  307.                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  308.                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  309.                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  310.                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  311.                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  312.                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  313.                 //重新裝初值
  314.                 number = 0;
  315.                    //顯示“請重新輸入密碼:”
  316.                 Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  317.                 Lcd_Character_16X16( 1, 4, 16,data_shuju[13]);
  318.                 Lcd_Character_16X16( 1, 4, 32,data_shuju[14]);
  319.                 Lcd_Character_16X16( 1, 4, 48,data_shuju[6]);
  320.                 Lcd_Character_16X16( 1, 4, 64,data_shuju[7]);
  321.                 Lcd_Character_16X16( 1, 4, 80,data_shuju[8]);
  322.                 Lcd_Character_16X16( 1, 4, 96,data_shuju[9]);
  323.                 Lcd_Character_16X16( 1, 4, 112,data_shuju[10]);
  324.                 while(1) {
  325.                 P1 = 0xf0;                                  //翻轉法先給P1口送數據
  326.                 k = P1;                                          //然后賦值給k
  327.                 if(k != 0xf0)                                  //判斷k是否是0xf0,如果不是,進入內部執行相應的程序
  328.                 {
  329.                         delayms(5);                          //延時,防抖動
  330.                         k = P1;                                  //重新賦值
  331.                         if(k != 0xf0)                          //確定是否k不等于0xf0
  332.                         {
  333.                                 number++;                  //number用于確定后面的在12864中的輸出位置和密碼存儲的位置
  334.                                 p1_h = P1;                  //將P1的高四位賦值給p1_h
  335.                                 P1 = 0x0f;                  //然后將0x0f賦值給P1口,翻轉,確定低四位,賦值給p1_l
  336.                                 p1_l = P1;                  //將P1口的值賦給p1_l(是小寫的字母l,不是數字1)
  337.         
  338.                                 k = p1_h|p1_l;                  //將高四位和低四位相或,然后賦值給k
  339.                                 if (k == 0XE7) {          //此判斷是為了確定是否是確認按鍵,如果是,直接進入確定程序
  340.                                         j = 1;        
  341.                                 }
  342.         
  343.                                 if(number == 7)                  //此判斷是為了確定輸入的是否是6個數字,防止多輸入或者少輸入
  344.                                 {
  345.                                         if (k != 0XB7) {  //這個是判斷是否是清除按鍵,
  346.                                                 number = 0;
  347.                                         }
  348.                                 }
  349.         
  350.                                 while (p1_l == P1);          //這個是松手檢測,防止長時間按在按鍵上,使輸入的數據重復
  351.                                 if (number > 0||j == 1){  
  352.                                         switch(k)          //條件分支語句
  353.                                         {
  354.                                                 case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  355.                                                 case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  356.                                                 case 0XDE: keyscan = 2;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  357.                                                 case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  358.                                                 case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  359.                                                 case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  360.                                                 case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  361.                                                 case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  362.                                                 case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  363.                                                 case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
  364.                                                 case 0XE7: number = 0;
  365.                                                                    for(i = 0; i < 6; i++)
  366.                                                                                 if (mima[i] != shuru[i])//對比原始密碼和輸入密碼
  367.                                                                                 {
  368.                                                                                         //密碼錯誤
  369.                                                                                         Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  370.                                                                                         Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  371.                                                                                         Lcd_Character_16X16( 1, 6, 96,mistake[2]);
  372.                                                                                         Lcd_Character_16X16( 1, 6, 112,mistake[3]);
  373.                                                                                         //消除密碼顯示位
  374.                                                                                         Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  375.                                                                                         Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  376.                                                                                         Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  377.                                                                                         Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  378.                                                                                         Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  379.                                                                                         Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  380.                                                                                         //消除密碼錯誤顯示位
  381.                                                                                         Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  382.                                                                                         Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  383.                                                                                         Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  384.                                                                                         Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  385. ……………………

  386. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
電子密碼鎖.rar (100.15 KB, 下載次數: 64)




評分

參與人數 2黑幣 +55 收起 理由
569ipo + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:191910 發表于 2018-5-17 09:24 | 只看該作者
不錯,收藏了,共享萬歲
回復

使用道具 舉報

板凳
ID:389243 發表于 2018-8-28 13:29 | 只看該作者
謝謝大佬,已收藏
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月天婷婷激情 | 一级女毛片 | 欧美成人免费在线 | 成人性视频在线播放 | 黄色欧美大片 | 天堂色 | 视频在线一区二区 | 亚洲一区二区在线视频 | 色免费视频 | 国产激情在线观看视频 | 成人不卡 | 九九精品在线 | 婷婷综合 | 亚洲最新在线 | 天天射美女 | 国产99热在线 | 国产91网站在线观看 | 亚洲国产成人精品一区二区 | 视频羞羞| 日韩一级电影免费观看 | 欧美日韩亚洲一区二区 | 中文字幕日韩一区 | 国产日韩欧美在线观看 | 精国产品一区二区三区四季综 | 偷拍自拍第一页 | 亚洲成人一区二区 | 亚洲一区二区精品 | 日韩区| 久久久久久毛片免费观看 | 亚洲天堂二区 | 麻豆va| 欧美亚洲国产日韩 | 黄a网站| 日本在线观看视频 | 久久久久99| 激情欧美日韩一区二区 | 中文亚洲字幕 | 久久人 | 亚洲美女网站 | 国产一区在线免费观看 | 国产伊人久久久 |