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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+LCD1602+16點鍵盤電子密碼鎖設計

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機


單片機源程序如下:
  1. #include <intrins.h>
  2. #include <reg52.h>
  3. #define ulong unsigned long
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. uchar temp,num,flag,r;
  7. /******************************/
  8. //顯示字符串定義
  9. uchar code table1[]="You are welcome";
  10. uchar code table3[]="******";
  11. uchar code table4[]="code is wrong!";
  12. uchar code table5[]="you are right!";
  13. uchar code table6[]="the second time!";
  14. uchar code table7[]="the last time!";
  15. uchar code table8[]="Input new password:";
  16. uchar code table9[]="Modify right!!!";
  17. uchar code table10[]="password:";
  18. uchar code table12[]="    calling....";
  19. uchar code table13[]="      ";
  20. uchar code table14[]="Input again:";
  21. uchar code table15[]="Modify error!!!";
  22. /******************************/
  23. uchar  init_password[6]={1,2,3,4,5,6};//定義原始密碼存放的數組
  24. uchar  password[6]={0};//定義輸入密碼存放的數組
  25. /******************************/
  26. //1602位定義
  27. sbit lcdrs=P2^0;// 數據/指令
  28. sbit lcdrw=P2^1;// 讀/寫
  29. sbit lcden=P2^2;// 使能端
  30. /******************************/
  31. sbit beep=P3^7;
  32. /******************************/
  33. void delay(uint z);
  34. void init();
  35. void write_com(uchar com);
  36. void write_data(uchar dat1);
  37. void keyscan();
  38. void mima();
  39. void mima1();
  40. void delete();
  41. /******************************/
  42. //1602初始化設置
  43. void init()
  44. {
  45.         lcden=0;//使能
  46.         write_com(0x38);//顯示模式設置
  47.         write_com(0x0e);//顯示開關設置(顯示有效、光標顯示有效、光標閃爍無效)?
  48.         write_com(0x06);//光標移動設置(讀或寫一個字符后地址指針加一,光標加一,寫一個字符串后,整屏顯示不移動)
  49.         write_com(0x01);//顯示清屏
  50.         write_com(0x80);//讀忙       

  51. }
  52. /******************************/
  53. //向1602寫指令
  54. void write_com(uchar com)
  55. {

  56.         lcdrs=0;//指令
  57.         lcdrw=0;//寫
  58.         P0=com;//將指令代碼送到P0口,通過數據線給1602
  59.         delay(5);
  60.         lcden=1;
  61.         delay(5);
  62.         lcden=0;//下降沿使能
  63. }
  64. /******************************/
  65. //向1602寫數據
  66. void write_data(uchar dat1)
  67. {
  68.         lcdrs=1;//數據
  69.         lcdrw=0;//寫
  70.         P0=dat1;
  71.         delay(5);
  72.         lcden=1;
  73.         delay(5);
  74.         lcden=0;//下降沿使能
  75. }
  76. /******************************/
  77. //延時子程序
  78. void delay(uint z)
  79. {
  80.         uint x,y;
  81.         for(x=z;x>0;x--)
  82.                 for(y=110;y>0;y--);
  83. }
  84. /******************************/
  85. //按鍵掃描子程序
  86. void keyscan()                 
  87. {
  88.                         P1=0x7f;
  89.                         temp=P1;
  90.                         temp=temp&0x0f;
  91.                         while(temp!=0x0f)
  92.                                 {
  93.                                         delay(5);
  94.                                         temp=P1;
  95.                                         temp=temp&0x0f;
  96.                                         while(temp!=0x0f)
  97.                                         {
  98.                                                 temp=P1;//按鍵消抖
  99.                                         switch(temp)
  100.                                                 {
  101.                                                         case 0x7e:num=0;flag=1;//按鍵0被按下,且0為有效的按鍵
  102.                                                                 break;
  103.                                                         case 0x7d:num=1;flag=1;//按鍵1被按下,且1為有效的按鍵
  104.                                                                 break;
  105.                                                         case 0x7b:num=2;flag=1;//按鍵2被按下,且2為有效的按鍵
  106.                                                                 break;
  107.                                                         case 0x77:num=3;flag=1;//按鍵3被按下,且3為有效的按鍵
  108.                                                                 break;
  109.                                                 }
  110.                                         while(temp!=0x0f)
  111.                                                 {
  112.                                                         temp=P1;
  113.                                                         temp=temp&0x0f;
  114.                                                 }
  115.                                         }
  116.                                 }

  117.                         P1=0xbf;
  118.                         temp=P1;
  119.                         temp=temp&0x0f;
  120.                         while(temp!=0x0f)
  121.                                 {
  122.                                         delay(5);
  123.                                         temp=P1;
  124.                                         temp=temp&0x0f;
  125.                                         while(temp!=0x0f)
  126.                                         {
  127.                                                 temp=P1;//消抖
  128.                                         switch(temp)
  129.                                                 {
  130.                                                         case 0xbe:num=4;flag=1;//按鍵4被按下,且4為有效的按鍵
  131.                                                                 break;
  132.                                                         case 0xbd:num=5;flag=1;//按鍵5被按下,且5為有效的按鍵
  133.                                                                 break;
  134.                                                         case 0xbb:num=6;flag=1;//按鍵6被按下,且6為有效的按鍵
  135.                                                                 break;
  136.                                                         case 0xb7:num=7;flag=1;//按鍵7被按下,且7為有效的按鍵
  137.                                                                 break;
  138.                                                 }
  139.                                         while(temp!=0x0f)
  140.                                                 {
  141.                                                         temp=P1;
  142.                                                         temp=temp&0x0f;
  143.                                                 }
  144.                                         }
  145.                                 }


  146.                         P1=0xdf;
  147.                         temp=P1;
  148.                         temp=temp&0x0f;
  149.                         while(temp!=0x0f)
  150.                                 {
  151.                                         delay(5);
  152.                                         temp=P1;
  153.                                         temp=temp&0x0f;
  154.                                         while(temp!=0x0f)
  155.                                         {
  156.                                                 temp=P1;
  157.                                         switch(temp)
  158.                                                 {
  159.                                                         case 0xde:num=8;flag=1;//按鍵8被按下,且8為有效的按鍵
  160.                                                                 break;
  161.                                                         case 0xdd:num=9;flag=1;//按鍵9被按下,且9為有效的按鍵
  162.                                                                 break;
  163.                                                         case 0xdb:num=10;//按鍵10被按下,且該鍵無效
  164.                                                                 break;
  165.                                                         case 0xd7:num=11;//按鍵11被按下,且該鍵無效
  166.                                                                 break;
  167.                                                 }
  168.                                         while(temp!=0x0f)
  169.                                                 {
  170.                                                         temp=P1;
  171.                                                         temp=temp&0x0f;
  172.                                                 }
  173.                                         }
  174.                                 }
  175.                         P1=0xef;
  176.                         temp=P1;
  177.                         temp=temp&0x0f;
  178.                         while(temp!=0x0f)
  179.                                 {
  180.                                         delay(5);
  181.                                         temp=P1;
  182.                                         temp=temp&0x0f;
  183.                                         while(temp!=0x0f)
  184.                                         {
  185.                                                 temp=P1;
  186.                                         switch(temp)
  187.                                                 {
  188.                                                         case 0xee:num=12;//按鍵12被按下,且該鍵無效
  189.                                                                 break;
  190.                                                         case 0xed:num=13;flag=1;//按鍵13,即修改密碼鍵被按下,且13為有效的按鍵
  191.                                                                 break;
  192.                                                         case 0xeb:num=14;flag=1;//按鍵14,即退格鍵被按下,且14為有效的按鍵
  193.                                                                 break;
  194.                                                         case 0xe7:num=15;flag=1;//按鍵15,即輸入密碼鍵被按下,且15為有效的按鍵
  195.                                                                 break;
  196.                                                 }
  197.                                         while(temp!=0x0f)
  198.                                                 {
  199.                                                         temp=P1;
  200.                                                         temp=temp&0x0f;
  201.                                                 }
  202.                                         }
  203.                                 }



  204. }
  205. /******************************/
  206. void main()
  207. {
  208.     uchar m=0,w=0;
  209.         init();//1602初始化
  210.         for(r=0;r<15;r++)
  211.         {
  212.           delay(5);
  213.           write_data(table1[r]);       
  214.         }//顯示歡迎界面

  215. write_com(0x0c);//顯示,關光標
  216.         do
  217.         {                       
  218.                 keyscan();
  219.         }
  220.         while(num!=15);//在輸入密碼鍵按下之前一直進行鍵盤掃描
  221. mima();//子程序調用
  222.   while((password[m]==init_password[m])&m<6)
  223. {
  224.         m++;
  225. }
  226. if(m>=6)
  227. {
  228.        
  229.         mima1();//子程序調用       
  230. }
  231. else
  232.         {
  233.                 m=0;
  234.                 write_com(0x80+0x40);//顯示從第二行開始
  235.                 for(r=0;r<14;r++)
  236.                         {
  237.                         delay(20);
  238.                         write_data(table4[r]);       
  239.                         }//顯示密碼錯誤
  240.             delay(2000);//延時
  241.                 init();//1602初始化       
  242.                 for(r=0;r<16;r++)
  243.                         {
  244.                         delay(20);
  245.                         write_data(table6[r]);       
  246.                         }//顯示第二次輸入
  247.                 delay(2000);
  248.              mima();
  249.                 while((password[m]==init_password[m])&m<6 )
  250.                         {
  251.                         m++;
  252.                         }
  253.                 if(m>=6)
  254.                         {
  255.                                 mima1();
  256.                         }
  257.                 else
  258.                        
  259.                         {
  260.                                 m=0;
  261.                                 write_com(0x80+0x40);
  262.                                 for(r=0;r<14;r++)
  263.                                 {
  264.                                 delay(20);
  265.                                 write_data(table4[r]);       
  266.                                 }//顯示密碼錯誤
  267.                                delay(2000);
  268.                                    init();//1602初始化       
  269.                                for(r=0;r<14;r++)
  270.                                 {
  271.                                 delay(20);
  272.                                 write_data(table7[r]);       
  273.                                 }//最后一次機會
  274.                                 delay(2000);
  275.                                 mima();
  276.                                
  277.                                 while((password[m]==init_password[m])&m<6)
  278.                                         {
  279.                                         m++;
  280.                                         }
  281.                                         if(m>=6)
  282.                                                 {
  283.                                
  284.                                                 mima1();
  285.                                                 }
  286.                                         else
  287.                                         {       
  288.                                                 init();
  289.                                                 write_com(0x80+0x40);
  290.                                                 for(r=0;r<14;r++)
  291.                                                 {
  292.                                                 delay(20);
  293.                                                 write_data(table12[r]);
  294.                                                 }//顯示報警
  295.                                         write_com(0x0c);                                     
  296.                                                   while(1)
  297.                                                            {
  298.                                                         delay(1);
  299.                                                         beep=~beep;                                       
  300.                                                          }//喇叭發出警報音
  301.                                         }
  302.                        
  303.                                

  304.                         }



  305.        
  306.                 }
  307.                

  308. }

  309. void mima()
  310. {       
  311.                 uchar w=0;
  312.                 init();
  313.                 for(r=0;r<9;r++)
  314.                         {
  315.                         delay(20);
  316.                         write_data(table10[r]);       
  317.                         }//顯示請輸入密碼
  318.         do
  319.           {       
  320.             flag=0;
  321.             keyscan();
  322.                 write_com(0x80+9+w);//接著password:后第w位處顯示
  323.                 if(flag==1&&num<=9)//輸入的是0—9的情況下
  324.                  {
  325.                           password[w]=num;//將輸入的數存入數組的相應位
  326.                           write_data(table3[w]);//1602顯示*
  327.                           w++;//位數加一
  328.                         if(w==6)
  329.                     write_com(0x0c);//六位都輸入后,顯示從屏幕左方開始       
  330.                  }
  331.                 if(flag==1&&num==14)//如果退格鍵被按下       
  332.                         {
  333.                                 w--;//位數減一
  334.                                 if(w==255)
  335.                                         w=w+1;//如果位數變成-1,即255,則加一,變成0
  336.                                 write_com(0x80+9+w);//從字符串后第w位處開始顯示
  337.                                 write_data(table13[w+1]);//顯示*       
  338.                                 if(flag==1&&num<=9)
  339.                                  {
  340.                                   password[w]=num;
  341.                                   write_data(table3[w]);                               
  342.                                 }       
  343.                          }
  344.     }        while(w<=5);

  345. }

  346. void mima1()
  347. {       

  348.         uchar f=0,n=0,d=0;
  349.                 write_com(0x80+0x40); //從第二行開始顯示
  350.                         for(r=0;r<14;r++)
  351.                         {
  352.                         delay(20);
  353.                         write_data(table5[r]);//顯示密碼正確       
  354.                         }
  355.                         delay(2000);
  356.                                         do
  357.                                         {               
  358.                                                 num=16;
  359.                                                 keyscan();
  360.                                         }while(num!=13);//在改密碼鍵按下前一直掃描鍵盤                       
  361.                                                         if(flag==1&&num==13)
  362.                                                         {
  363.                                                                 init();//顯示初始化
  364.                                                                 for(r=0;r<15;r++)
  365.                                                                 {
  366.                                                                 delay(20);
  367.                                                                 write_data(table8[r]);//顯示輸入新密碼
  368.                                                                 }
  369.                                                                 write_com(0x0c);//顯示,關光標
  370.                                                                 write_com(0x80+0x40+n);//從第二行開始顯示
  371.                                                                 write_com(0x0e);//顯示開關初始化
  372.                                                         }
  373.                                         do{       
  374.                                                 num=16;
  375.                                                 keyscan();       
  376.                                                 write_com(0x80+0x40+n);                                                                       
  377.                                                 if(flag==1&&num<=9)
  378.                                                          {
  379.                                 init_password[n]=num;//將輸入值存入新的密碼數組的相應位
  380.                                                           write_data(table3[n]);//顯示*
  381.                                                           n++;
  382.                                                                 if(n==6)
  383.                                                             write_com(0x0c);       
  384.                                                          }
  385.                                                         if(flag==1&&num==14)       
  386.                                                                         {
  387.                                                                                 n--;//如果退格鍵按下,左移一位
  388.                                                                                 if(n==255)
  389.                                                                                 n=n+1;//如果n減為負值則從0開始
  390.                                                                                 write_com(0x80+0x40+n);//從相應位置開始顯示
  391.                                                                                 write_data(table13[n]);//顯示空字符       
  392.                                                                                 if(flag==1&&num<=9)
  393.                                                                                          {
  394.                                                                                           password[n]=num;
  395.                                                                                           write_data(table3[n]);                               
  396.                                                                                         }       
  397.                                                                          }                                               
  398.                                         }
  399.                                                 while(n<=5);

  400.                                                 init();
  401.                                         for(r=0;r<12;r++)
  402.                                         {
  403.                                         delay(20);
  404.                                         write_data(table14[r]);       
  405.                                         }//顯示重新輸入
  406.                                         do
  407.                                           {       
  408.                                                     flag=0;
  409.                                             keyscan();
  410. ……………………

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

所有資料51hei提供下載:
LCD1602 16點鍵盤.zip (44.44 KB, 下載次數: 31)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 久久91精品 | 国产精品视频999 | 色综合天天天天做夜夜夜夜做 | 国产精品国产馆在线真实露脸 | 中文字幕 视频一区 | 在线视频一区二区三区 | 91人人爽| 精品少妇一区二区三区日产乱码 | 99久久亚洲 | 久久99这里只有精品 | 久草成人网 | 精品国产91 | 亚洲一在线 | 欧美1区2区 | 国产福利在线 | 亚洲一区二区免费视频 | 韩国理论电影在线 | 在线日韩精品视频 | 国产露脸国语对白在线 | 欧美激情黄色 | 国产精品久久久久不卡 | 成人黄色电影在线观看 | 日韩视频在线播放 | 日韩高清www | 亚洲精品一区二区二区 | 黄色大片在线免费观看 | 久久国产精品一区二区三区 | 精品一区视频 | 激情91 | 日韩精品成人免费观看视频 | 久草在线免费资源 | 国产一级在线观看 | 欧美日韩黄色一级片 | 国产日韩精品在线 | 极品久久| 每日在线更新av | 成人国产免费视频 | 欧美日韩一区二区三区四区 | 欧美精品久久一区 | 亚洲一区视频 |