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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

廢棄電子產品拆的LCD12864液晶顯示的密碼鎖制作 附單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
顯示和按鍵都是廢物利用, 鍵盤是電話機外殼改的,做得不太好,別見笑.廢話少說,直接上圖片.


密碼鎖的單片機源程序分享到51黑電子:
  1. /********************************************************************************
  2. * 描  述: 密碼鎖示例
  3. * 備  注:
  4. * 1、用0~9的數字鍵輸入密碼,允許的密碼最大位數由PSW_MAX_LEN宏定義給出
  5. * 2、用戶設定的密碼由EEPROM保存,并且用“累加和”校驗來保證數據的有效性
  6. * 3、程序首次運行時EEPROM中的數據無效,此時會提示“設置密碼”
  7. * 4、設置密碼時需要用戶輸入兩次相同的密碼,以保證設置成功,設置后密碼自動保存
  8. * 5、兩次輸入密碼不相同時,將導致密碼設置失敗,按回車鍵重新設置
  9. * 6、密碼設置成功后,每次開機都會要求用戶輸入密碼,用戶鍵入密碼后,按回車鍵,
  10.      系統將鍵入的密碼與EEPROM中保存的密碼做對比,相同則系統解鎖,否則繼續鎖定
  11. * 7、密碼輸入錯誤系統鎖定時,按回車鍵可以重新開始輸入密碼
  12. * 8、密碼輸入正確系統解鎖時,按回車鍵可以進入修改密碼的操作
  13. * 9、當忘記密碼時,可通過修改PSW_MAX_LEN或PSW_SAVE_ADDR宏定義的值來重置密碼
  14. ********************************************************************************/
  15. #include <reg52.h>

  16. #define PSW_MAX_LEN    13    //用宏定義出密碼最大長度(最大不超過16)
  17. #define PSW_SAVE_ADDR  0x30  //用宏定義出密碼在EEPROM中的保存地址
  18. sbit LED = P1^0;
  19. sbit OPEN = P2^7;
  20. unsigned char status = 0;  //系統狀態字:0-輸入密碼,1-設置密碼,2-設置密碼確認,
  21.                            //3-密碼設置失敗,4-輸入的密碼正確,5-輸入的密碼錯誤
  22. unsigned char PswCnt;      //當前輸入密碼位數的計數器
  23. unsigned char  PswSet[PSW_MAX_LEN];   //已設定的密碼數據
  24. unsigned char  PswBuf1[PSW_MAX_LEN];  //密碼輸入緩沖區1
  25. unsigned char  PswBuf2[PSW_MAX_LEN];  //密碼輸入緩沖區2

  26. unsigned char T0RH = 0;  //T0重載值的高字節
  27. unsigned char T0RL = 0;  //T0重載值的低字節

  28. unsigned char code s0[][32]= {                                                        
  29.         /*--  文字:  請  --*/
  30.         /*--  宋體12;  此字體下對應的點陣為:寬x高=16x16   --*/
  31.         0x40,0x42,0xCC,0x00,0x00,0x44,0x54,0x54,0x54,0x7F,0x54,0x54,0x54,0x44,0x40,0x00,
  32.         0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x15,0x15,0x15,0x55,0x95,0x7F,0x00,0x00,0x00,
  33.         
  34.         /*--  文字:  輸  --*/
  35.         /*--  宋體12;  此字體下對應的點陣為:寬x高=16x16   --*/
  36.         0x88,0x68,0x1F,0xC8,0x08,0x10,0xC8,0x54,0x52,0xD1,0x12,0x94,0x08,0xD0,0x10,0x00,
  37.         0x09,0x19,0x09,0xFF,0x05,0x00,0xFF,0x12,0x92,0xFF,0x00,0x5F,0x80,0x7F,0x00,0x00,
  38.         
  39.         
  40. …………限于本文篇幅 余下代碼請從51黑下載附件…………


  41.         /*--  文字:  開  --*/
  42.         /*--  宋體12;  此字體下對應的點陣為:寬x高=16x16   --*/
  43.         0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
  44.         0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
  45. };
  46. unsigned char code s1[][16] = {
  47.         0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,          //*
  48. };
  49. bit flagOPEN = 0;
  50. extern bit flagLED;
  51. extern void KeyScan();
  52. extern void KeyDriver();
  53. extern void LCD_ST7567_INIT();
  54. extern void Lcd12864_ON();
  55. extern void        Lcd12864_OFF();
  56. extern void Lcd12864_ClearScreen();
  57. extern void displayPhoto (unsigned char *pic);
  58. extern void z1616(unsigned char plat, unsigned char column, unsigned char p);
  59. extern void WRITE_STRING816(unsigned char plat, unsigned char column, unsigned char p, unsigned char x0[][16], unsigned char c);
  60. extern void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);
  61. extern void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);

  62. void InputCode();
  63. void SetCode();
  64. void DelayM(int ms);
  65. bit  ReadPassword();
  66. void ConfigTimer0(unsigned int ms);
  67. void FillMemory(unsigned char *dest, unsigned char byt, unsigned char len);

  68. void main()
  69. {
  70.         EA = 1;           //開總中斷
  71.     ConfigTimer0(1);  //配置T0定時1ms
  72.     LCD_ST7567_INIT();    //初始化液晶
  73.    
  74.         if (ReadPassword())  //讀取密碼并判斷是否有效
  75.     {
  76.         InputCode(); //有效時提示”請輸入密碼“
  77.         status = 4;
  78.     }
  79.     else
  80.     {
  81.                 SetCode();          //提示”請設置密碼“
  82.     }
  83.     FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  84.     FillMemory(PswBuf2, '\0', PSW_MAX_LEN);
  85.     PswCnt = 0;

  86.     while(1)
  87.            {
  88.                  KeyDriver();

  89.                 if(flagLED)
  90.                 {
  91.                         LED = 0;
  92.                         Lcd12864_ON();
  93.                 }
  94.                 else if(flagOPEN)
  95.                 {
  96.                         flagOPEN = 0;
  97.                         Lcd12864_OFF();
  98.                         LED = 1;
  99.                 }
  100.                 else if(status ==5)
  101.                 {
  102.                         Lcd12864_ClearScreen();
  103.             InputCode();
  104.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  105.             PswCnt = 0;
  106.             status = 0;
  107.                 }
  108.         }
  109. }

  110. void SetCode()
  111. {
  112.         z1616(1, 16, 0);
  113.         z1616(1, 32, 5);        
  114.         z1616(1, 48, 6);
  115.         z1616(1, 64, 3);
  116.         z1616(1, 80, 4);  
  117. }

  118. void InputCode()
  119. {
  120.         z1616(1,16,0);        
  121.         z1616(1,32,1);
  122.         z1616(1,48,2);
  123.         z1616(1,64,3);
  124.         z1616(1,80,4);
  125. }

  126. void DelayM(int ms)
  127. {//延時函數 1MS/次        
  128.         unsigned char i;

  129.         while( --ms != 0)
  130.                 {               
  131.                         for(i = 0; i < 125; i++);  //一個 ; 表示空語句,CPU空轉。
  132.                 }                                      //i 從0加到125,CPU大概就耗時1毫秒
  133. }
  134. /* 將一段內存數據拷貝到另一處,dest-目的地址,src-源地址,len-數據長度 */
  135. void CopyMemory(unsigned char *dest, unsigned char *src, unsigned char len)
  136. {
  137.     while (len--)
  138.     {
  139.         *dest++ = *src++;
  140.     }
  141. }
  142. /* 用一個指定字節填充一段內存,dest-目的地址,byt-填充用字節,len-數據長度 */
  143. void FillMemory(unsigned char *dest, unsigned char byt, unsigned char len)
  144. {
  145.     while (len--)
  146.     {
  147.         *dest++ = byt;
  148.     }
  149. }
  150. /* 內存比較函數,比較兩個指針所指向的內存數據是否相同,
  151.    ptr1-待比較指針1,ptr2-待比較指針2,len-待比較長度
  152.    返回值-兩段內存數據完全相同時返回1,不同返回0 */
  153. bit CmpMemory(unsigned char *ptr1, unsigned char *ptr2, unsigned char len)
  154. {
  155.     while (len--)
  156.     {
  157.         if (*ptr1++ != *ptr2++)  //遇到不相等數據時即刻返回0
  158.         {
  159.             return 0;
  160.         }
  161.     }
  162.     return 1;  //比較完全部長度數據都相等則返回1
  163. }
  164. /* 將一段數據按字節累加,返回獲得的累加和,dat-數據指針,len-數據長度 */
  165. unsigned char GetChkSum(unsigned char *dat, unsigned char len)
  166. {
  167.     unsigned char sum = 0;
  168.    
  169.     while (len--)
  170.     {
  171.         sum += *dat++;
  172.     }
  173.     return sum;
  174. }
  175. /* 從EEPROM中讀取保存的密碼數據,并對密碼進行“累加和”校驗,
  176.    返回值-校驗通過返回 1,否則返回 0 */
  177. bit ReadPassword()
  178. {
  179.     unsigned char sum;
  180.     unsigned char buf[PSW_MAX_LEN+1];
  181.    
  182.     E2Read(buf, PSW_SAVE_ADDR, PSW_MAX_LEN+1);  //讀取密碼數據和校驗字節
  183.     sum = GetChkSum(buf, PSW_MAX_LEN); //計算密碼數據的累加和
  184.     if (buf[PSW_MAX_LEN] == ~sum)      //校驗通過,即密碼有效時,拷貝密碼
  185.     {
  186.         CopyMemory(PswSet, buf, PSW_MAX_LEN);
  187.         return 1;
  188.     }
  189.     else  //密碼數據無效時,緩沖區默認成全0
  190.     {
  191.         FillMemory(PswSet, '\0', PSW_MAX_LEN);
  192.         return 0;
  193.     }
  194. }
  195. /* 將當前的密碼數據保存到EEPROM中,同時添加校驗字節 */
  196. void SavePassword()
  197. {
  198.     unsigned char buf[PSW_MAX_LEN+1];
  199.    
  200.     CopyMemory(buf, PswSet, PSW_MAX_LEN);  //復制密碼數據到緩沖區中
  201.     buf[PSW_MAX_LEN] = ~GetChkSum(buf, PSW_MAX_LEN);  //填充最后的累加和校驗字節
  202.     E2Write(buf, PSW_SAVE_ADDR, PSW_MAX_LEN+1);  //將密碼數據保存到EEPROM中
  203. }
  204. /* 在液晶上顯示與當前輸入密碼位數相同的*,以指示當前輸入的密碼位數 */
  205. void ShowPswCnt()
  206. {
  207. /*    unsigned char buf[PSW_MAX_LEN+1];
  208.    
  209.     FillMemory(buf, '*', PswCnt);
  210.     FillMemory(buf+PswCnt, '\0', sizeof(buf)-PswCnt);
  211.     LcdShowStr(0, 1, buf);          */
  212.         WRITE_STRING816(2, PswCnt, 0, s1, 0);
  213. }

  214. /* 數字鍵動作函數,keycode-數字按鍵的ASCII值 */
  215. void KeyNumAction(unsigned char keycode)
  216. {
  217.     switch (status)
  218.     {
  219.         case 0: //輸入密碼狀態時,將輸入字符填充到PswBuf1
  220.             if (PswCnt < PSW_MAX_LEN)
  221.             {
  222.                 PswBuf1[PswCnt] = keycode;
  223.                 PswCnt++;
  224.                 ShowPswCnt();
  225.             }
  226.             break;
  227.         case 1: //設置密碼狀態時,將輸入字符填充到PswBuf1
  228.             if (PswCnt < PSW_MAX_LEN)
  229.             {
  230.                 PswBuf1[PswCnt] = keycode;
  231.                 PswCnt++;
  232.                 ShowPswCnt();
  233.             }
  234.             break;
  235.         case 2: //設置密碼確認狀態時,將輸入字符填充到PswBuf2
  236.             if (PswCnt < PSW_MAX_LEN)
  237.             {
  238.                 PswBuf2[PswCnt] = keycode;
  239.                 PswCnt++;
  240.                 ShowPswCnt();
  241.             }
  242.             break;
  243.         default: //其它狀態不予響應
  244.             break;
  245.     }
  246. }
  247. /* 回車鍵動作函數 */
  248. void KeyEnterAction()
  249. {
  250.         switch (status)
  251.     {
  252.         case 0: //檢查輸入的密碼是否正確
  253.                 Lcd12864_ClearScreen();
  254.             if (CmpMemory(PswSet, PswBuf1, PSW_MAX_LEN))
  255.             {                                     //正確時顯示解鎖的提示
  256.   //              LcdShowStr(0, 0, "Password Correct");
  257.                                                 
  258.                                 z1616(1,16,3);               
  259.                                 z1616(1,32,4);               
  260.                                 z1616(1,48,7);                //提示 ”密碼正確“
  261.                                 z1616(1,64,8);

  262.                                 z1616(2, 64, 14);
  263.                                 z1616(2, 80, 13);        
  264.                                 z1616(2, 96, 17);
  265.                                 z1616(2, 112, 18);        //提示 ”鎖已打開“
  266.                                 
  267.                                 OPEN = 0;
  268.                                 DelayM(2000);
  269.                                 OPEN = 1;
  270.                                 status = 5;  //準備下次密碼輸入狀態
  271.             }
  272.                         else
  273.             {   //錯誤時顯示已鎖定的提示
  274.    //             LcdShowStr(0, 0, "Password Wrong");
  275.     //            LcdShowStr(0, 1, "system locked");
  276.                                 
  277.                                 z1616(1, 16, 3);        
  278.                                 z1616(1, 32, 4);
  279.                                 z1616(1, 48, 9);        //提示”密碼錯誤“
  280.                                 z1616(1, 64, 10);

  281. /*                                z1616(2, 0, 11);
  282.                                 z1616(2, 16, 12);        
  283.                                 z1616(2, 32, 13);
  284.                                 z1616(2, 48, 14);         //提示”系統已鎖“                */
  285.                 status = 5;  //進入鎖定狀態
  286.                                 DelayM(2000);
  287.             }
  288.             break;
  289.         case 1: //進入密碼設置的確認步驟,即再輸入一次密碼
  290.                 Lcd12864_ClearScreen();
  291.      //       LcdShowStr(0, 0, "Confirm Password");
  292.                         
  293.                         z1616(1, 16, 0);        
  294.                         z1616(1, 32, 15);
  295.                         z1616(1, 48, 16);
  296.                         z1616(1, 64, 1);
  297.                         z1616(1, 80, 2);        
  298.                         z1616(1, 96, 3);        //提示”請再次輸入密碼“
  299.                         z1616(1, 112, 4);
  300.             
  301.                         PswCnt = 0;
  302.             status = 2;
  303.             break;
  304.         case 2: //檢查兩次輸入的密碼是否一致
  305.             Lcd12864_ClearScreen();
  306.             if (CmpMemory(PswBuf1, PswBuf2, PSW_MAX_LEN))
  307.             {   //一致時保存設置的密碼
  308. //                LcdShowStr(0, 0, "Enter Password");
  309.                                 InputCode();                //提示”請輸入密碼“

  310.                 CopyMemory(PswSet, PswBuf1, PSW_MAX_LEN);
  311.                 SavePassword();
  312.                 FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  313.                 PswCnt = 0;
  314.                 status = 0;  //進入密碼輸入狀態
  315.             }
  316.             else
  317.             {   //不一致時提示密碼設置錯誤
  318.    /*            LcdShowStr(0, 0, "Confirm Password");
  319.                                 z1616(1, 0, 0);
  320.                                 z1616(1, 16, 15);        
  321.                                 z1616(1, 32, 16);
  322.                                 z1616(1, 48, 1);
  323.                                 z1616(1, 64, 2);
  324.                                 z1616(1, 80, 3);        
  325.                                 z1616(1, 90, 4);   //提示”請再次輸入密碼“
  326.    //             LcdShowStr(0, 1, "Failed");                        */
  327.                                 
  328.                                 z1616(1, 16, 3);        
  329.                                 z1616(1, 32, 4);
  330.                                 z1616(1, 48, 5);        
  331.                                 z1616(1, 64, 6);
  332.                                 z1616(1, 80, 9);        //提示”密碼設置錯誤“
  333.                                 z1616(1, 96, 10);

  334.                 status = 3;  //進入密碼設置錯誤狀態
  335.             }
  336.             break;
  337.         case 3: //重新提示設置密碼,進入密碼設置狀態
  338.             Lcd12864_ClearScreen();
  339. //           LcdShowStr(0, 0, "Set Password");
  340.                         SetCode();          //提示”請設置密碼“

  341.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  342.             FillMemory(PswBuf2, '\0', PSW_MAX_LEN);
  343.             PswCnt = 0;
  344.             status = 1;
  345.             break;
  346.         case 4: //重新設置即修改密碼
  347.             Lcd12864_ClearScreen();
  348.   //          LcdShowStr(0, 0, "Set Password");
  349.                         SetCode();         //提示”請設置密碼“

  350.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  351.             FillMemory(PswBuf2, '\0', PSW_MAX_LEN);
  352.             PswCnt = 0;
  353.             status = 1;
  354.             break;
  355.         case 5: //重新輸入密碼
  356.             Lcd12864_ClearScreen();
  357.   //          LcdShowStr(0, 0, "Enter Password");
  358.                         InputCode();         //提示”請輸入密碼“

  359.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  360.             PswCnt = 0;
  361.             status = 0;
  362.             break;
  363.         default: //不予響應
  364.             break;
  365.     }
  366. }
  367. /* Esc鍵動作函數 */
  368. void KeyEscAction()
  369. {
  370. //    P2 = 0xFF;
  371.         switch (status)
  372.     {
  373.         case 0: //輸入密碼狀態時,清空當前輸入以重新開始
  374.             Lcd12864_ClearScreen();
  375. //            LcdShowStr(0, 0, "Enter Password");
  376.                         InputCode();         //提示”請輸入密碼“

  377.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  378.             PswCnt = 0;
  379.             break;
  380.         case 1: //設置密碼狀態時,清空當前輸入以重新開始
  381.             Lcd12864_ClearScreen();
  382. //           LcdShowStr(0, 0, "Set Password");
  383.                         SetCode();   //提示”請設置密碼“

  384.             FillMemory(PswBuf1, '\0', PSW_MAX_LEN);
  385.             PswCnt = 0;
  386.             break;
  387.         case 2: //設置密碼確認狀態時,清空輸入并返回密碼設置狀態
  388.             Lcd12864_ClearScreen();
  389.    //         LcdShowStr(0, 0, "Set Password");
  390.                         SetCode();   //提示”請設置密碼“


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



下載:
密碼鎖.rar (89.53 KB, 下載次數: 29)

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

使用道具 舉報

沙發
ID:160658 發表于 2017-3-30 22:08 | 只看該作者
上傳了附件和程序,怎么沒看見了?
回復

使用道具 舉報

板凳
ID:1 發表于 2017-3-31 05:27 | 只看該作者
lern01 發表于 2017-3-30 22:08
上傳了附件和程序,怎么沒看見了?

已經處理好了,51黑電子論壇的廢棄屏幕diy制作又多了一個力作啊.樓主強人.懂得利用各方面的資源,連電話機都用上了.
回復

使用道具 舉報

地板
ID:160658 發表于 2017-3-31 11:31 | 只看該作者
admin 發表于 2017-3-31 05:27
已經處理好了.樓主強人.懂得利用各方面的資源,連電話機都用 ...

謝謝版主夸獎,手藝還不精
回復

使用道具 舉報

5#
ID:960224 發表于 2021-8-12 17:50 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲啪啪 | 91在线资源 | 狠狠干av| 久久新视频 | 国产精品久久久久久久久久久久久 | 久久亚洲一区 | 四虎影视免费观看 | 久久成人人人人精品欧 | 久久久亚洲成人 | 日本精品999| 自拍偷拍第一页 | 国产精品入口久久 | 国产欧美在线 | av在线免费观看网站 | 日韩一级精品视频在线观看 | 欧美一区| 亚av在线 | 视频在线一区二区 | 伊人二区| 国产成人免费在线 | 免费人成激情视频在线观看冫 | 久久久久久国产精品久久 | av网站免费在线观看 | 操久久| 国产粉嫩尤物极品99综合精品 | 亚洲一区二区三区在线 | 欧美日韩久久久 | a毛片 | 日韩区 | 日韩欧美不卡 | 色婷婷亚洲一区二区三区 | 久久久久久久久久久久久久久久久久久久 | 丁香久久 | 水蜜桃久久夜色精品一区 | 久久精品国产免费看久久精品 | 国产乱码精品一区二区三区忘忧草 | 精品欧美一区二区久久久伦 | 成人a视频在线观看 | 国产精品一区在线观看你懂的 | 黄频免费| 在线a视频 |