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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手設計的簡易單片機密碼鎖 LCD1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:248410 發表于 2017-11-11 16:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
新手設計的簡易密碼鎖
單片機源程序如下:
  1. /**************************************************************************************
  2. *                              LCD1602液晶顯示實驗                                                                                                  *
  3. 實現現象:        具體接線操作請參考視頻教程
  4.                         下載程序后插上LCD1602液晶在開發板上,即可顯示
  5. 注意事項:                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  8. #include "lcd.h"

  9. typedef unsigned int u16;          //對數據類型進行聲明定義
  10. typedef unsigned char u8;



  11. #define GPIO_DIG P0
  12. #define GPIO_KEY P1
  13. sbit beep=P3^5;
  14. sbit motor=P3^6;
  15. u8 KeyValue;        //用來存放讀取到的鍵值
  16. int count=0;    //用來存放按鍵的次數
  17. u8 Disp[]="set initial code";
  18. u8 DispCode[]="input code";

  19. u8 Dispcorrect[]="welcome back";

  20. u8 Disperror[]="catch thief";
  21. char code1[8],inicode[8];

  22. /*******************************************************************************
  23. * 函 數 名         : delay
  24. * 函數功能                   : 延時函數,i=1時,大約延時10us
  25. *******************************************************************************/
  26. void delay(u16 i)
  27. {
  28.         while(i--);       
  29. }



  30. sbit LSA=P2^2;
  31. sbit LSB=P2^3;
  32. sbit LSC=P2^4;

  33. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  34.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //顯示0~F的值
  35. /****************************************************
  36. 函數名:        DigDisplay 數碼管顯示函數
  37. 函數功能:        輸入顯示的數字和點亮的數碼管x,i;在對應的數碼管上顯示對應的數                               
  38. *****************************************************/


  39. void DigDisplay(int x,int i)                      //輸入顯示的數字和點亮的數碼管x,i
  40. {

  41.          
  42.        
  43.        
  44.                 switch(i)         //位選,選擇點亮的數碼管,
  45.                 {
  46.                         case(0):
  47.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  48.                         case(1):
  49.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  50.                         case(2):
  51.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  52.                         case(3):
  53.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  54.                         case(4):
  55.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  56.                         case(5):
  57.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  58.                         case(6):
  59.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  60.                         case(7):
  61.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  62.   }
  63.         P0=smgduan[x];//發送段碼
  64.         P0=0x00;//消隱       
  65.                 delay(100); //間隔一段時間掃描       
  66.          
  67.        
  68. }
  69. /***************************************************
  70. 函數名:KeyDown
  71. 矩陣鍵盤
  72. 1   2    3   A
  73. 4   5    6   B
  74. 7   8    9   C
  75. *   0    #   D
  76. 函數功能:
  77. 注意重點:成功按下一次后count記一次數,count初值為0
  78. ***************************************************/
  79. void KeyDown()
  80. {
  81.         int        a=0;
  82.         int i=0;
  83.        
  84.         GPIO_KEY=0x0f;
  85.         if(GPIO_KEY!=0x0f)        //讀取按鍵是否按下
  86.         {
  87.                 delay(1000);                    //延時10ms進行消抖
  88.                 if(GPIO_KEY!=0x0f)      //再次檢測鍵盤是否按下
  89.                 {       
  90.                         count++;              //按鍵按下一次記一次數
  91.                                               //測試列
  92.                         GPIO_KEY=0X0F;
  93.                         switch(GPIO_KEY)
  94.                         {
  95.                                 case(0X07):        KeyValue=1;break;
  96.                                 case(0X0b):        KeyValue=2;break;
  97.                                 case(0X0d): KeyValue=3;break;
  98.                                 case(0X0e):        KeyValue=10;break;
  99.                         }
  100.                 }
  101.         }
  102.                         //測試行
  103.                         /* 找出第四列單獨處理*/
  104.                         if(GPIO_KEY==0X0e)
  105.                 {
  106.                         GPIO_KEY=0XF0;
  107.                         switch(GPIO_KEY)
  108.                         {
  109.                                 case(0X70):        KeyValue=KeyValue;break;
  110.                                 case(0Xb0):        KeyValue=KeyValue+1;break;
  111.                                 case(0Xd0): KeyValue=KeyValue+2;break;
  112.                                 case(0Xe0):        KeyValue=KeyValue+3;break;
  113.                         }
  114.                 }
  115.                 //第一二三列的處理
  116.                 else
  117.                 {
  118.                         GPIO_KEY=0XF0;
  119.                         //單獨處理第四行
  120.                         if(GPIO_KEY==(0Xe0)&&KeyValue==1)
  121.                                 KeyValue='*';
  122.                         if(GPIO_KEY==(0Xe0)&&KeyValue==2)
  123.                                 KeyValue=0;
  124.                         if(GPIO_KEY==(0Xe0)&&KeyValue==3)
  125.                                 KeyValue='#';
  126.                                
  127.                         switch(GPIO_KEY)
  128.                         {
  129.                                 case(0X70):        KeyValue=KeyValue;break;
  130.                                 case(0Xb0):        KeyValue=KeyValue+3;break;
  131.                                 case(0Xd0): KeyValue=KeyValue+6;break;
  132.                                
  133.                         }
  134.                 }
  135.                 while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  136.                         {
  137.                                 delay(1000);
  138.                                 a++;
  139.                         }
  140.        
  141.        
  142.   
  143.                 
  144. }
  145.                

  146. /*******************************************************************************
  147. * 函 數 名         : main
  148. * 函數功能                   : 主函數
  149. * 輸    入         : 無
  150. * 輸    出         : 無
  151. *******************************************************************************/
  152. void main()
  153. {
  154.        
  155.         u8 i;
  156.         int inicount;
  157.         int j,flag=0,count1=0,j1=0;
  158.         LcdInit();
  159.         for(i=0;i<16;i++)          //顯示set initial code
  160.           {
  161.                 LcdWriteData(Disp[i]);
  162.                         delay(1000000);
  163.           }       
  164.          delay(100000000);
  165.         LcdWriteCom(0x01);           //清屏
  166.         KeyValue=0;                  //給KeyValue一個初值,避免亂碼
  167.         motor=0;                      //給motor一個初值,避免亂轉

  168. while(KeyValue!='#'||count<8)
  169.                 {                                          //按鍵判斷函數  輸入初始密碼 并存入inicode
  170.                                 KeyDown();
  171.                
  172.                         if(inicount!=count)
  173.                         {
  174.                inicode[count1]=KeyValue;
  175.                                 count1++;
  176.                                 beep=0;
  177.                                 delay(200);
  178.                                 beep=1;
  179.                                
  180.                                
  181.                         }
  182.                
  183.                         DigDisplay(count1,4);
  184.                         DigDisplay(KeyValue,0);
  185.                         inicount=count;
  186.        
  187.                 }       
  188.        
  189.                        
  190.         i=0;       
  191.   while(i<200)                  //在數碼管顯示inicode
  192.             {
  193.                           for(j=0;j<8;j++)
  194.                     DigDisplay(inicode[j],j);
  195.                                        
  196.                     i++;       
  197.             }

  198.         while(1)
  199.         {   
  200.                
  201.                 for(i=0;i<10;i++)
  202.                 {
  203.     LcdWriteData(DispCode[i]);
  204.                         delay(10000);
  205.                 }
  206.                
  207.         KeyValue=0;               
  208.         count=0;
  209.         count1=0;
  210.         inicount=0;
  211.   P0=0X00;
  212.                 flag=0;       
  213.                 while(KeyValue!='#'||count<8)
  214.                 {                                          //按鍵判斷函數  輸入密碼并存入code1
  215.                                 KeyDown();
  216.                
  217.                         if(inicount!=count)
  218.                         {
  219.                code1[count1]=KeyValue;
  220.                                 count1++;
  221.                                 beep=0;
  222.                                 delay(200);
  223.                                 beep=1;
  224.                         }
  225.                                 DigDisplay(count1,4);
  226.                         DigDisplay(KeyValue,0);
  227.                         inicount=count;
  228.        
  229.                 }       
  230.        
  231.        
  232.                 i=0;
  233.                
  234.   while(i<200)
  235.             {
  236.                           for(j=0;j<8;j++)
  237.                     DigDisplay(code1[j],j);
  238.                     i++;
  239.             }
  240.                        
  241.         P0=0X00;        LcdWriteCom(0x01);           //清屏
  242.       flag=1;                       
  243.                         for(j=0;j<8;j++)        
  244.                   {
  245.                 if(code1[j]==inicode[j])     //密碼匹配
  246.                                         ++flag;
  247. ……………………

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

所有資料51hei提供下載:
密碼鎖.zip (51.32 KB, 下載次數: 55)


評分

參與人數 1黑幣 +3 收起 理由
萌新哦 + 3 贊一個!

查看全部評分

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

使用道具 舉報

沙發
ID:330406 發表于 2018-5-17 22:37 | 只看該作者
學習一下
回復

使用道具 舉報

板凳
ID:335339 發表于 2018-5-21 23:02 | 只看該作者
新手來學習學習
回復

使用道具 舉報

地板
ID:139308 發表于 2018-5-23 16:44 | 只看該作者
為啥子下不來,505
回復

使用道具 舉報

5#
ID:336931 發表于 2018-5-23 22:35 | 只看該作者
我來看下下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲区中文字幕 | 奇米久久久 | 日韩欧美国产一区二区三区 | 中文日韩字幕 | 日韩精品一区二区三区在线播放 | 国产高清免费视频 | 99精品欧美一区二区三区综合在线 | 亚洲三级在线观看 | 国产蜜臀97一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 视频1区| 午夜精品一区二区三区在线观看 | 日本一区二区三区在线观看 | 国产午夜精品视频 | 国产一级久久久久 | 午夜一级黄色片 | 日韩超碰 | 最新黄色毛片 | 在线亚洲人成电影网站色www | 日韩中文字幕在线 | 成人深夜福利 | 黄色在线免费观看 | 亚洲精品无人区 | 一区二区三区免费 | 久久久成人一区二区免费影院 | 羞羞网站在线免费观看 | 一区二区在线免费播放 | 超碰精品在线观看 | 99久热| 精品中文字幕一区 | 欧美日韩高清 | 欧美日韩亚洲一区 | 国产精品视频久久 | 久久久精品一区二区 | 欧美精品一区二区三区蜜桃视频 | 电影午夜精品一区二区三区 | 福利视频一区二区 | 成人网在线看 | 欧美13videosex性极品 | 操操日 | 免费国产一区二区视频 |