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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1139|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機電子密碼鎖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:715968 發(fā)表于 2020-3-26 20:32 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. void key_scan();
  5. uchar count0,count1,count3,num,n=0,temp,a,j,count4;
  6. uchar mima[8];                                                        //初始密碼存儲區(qū)
  7. uchar tab_key[50];                                                //輸入密碼存儲區(qū)
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  9.                                         0x66,0x6d,0x7d,0x07,
  10.                                         0x7f,0x6f,0x77,0x7c,
  11.                                         0x39,0x5e,0x79,0x71};
  12. bit enterflag;                                                        //確認鍵按下與否的標(biāo)志
  13. bit mimaflag;                                                        //密碼正確與否的標(biāo)志
  14. bit xiugaiflag;                                                        //修改密碼標(biāo)志        
  15. bit enter1flag;                                                //修改密碼確認鍵標(biāo)志        
  16. sbit red=P3^7;
  17. sbit bell=P3^6;
  18. sbit rs=P3^0;
  19. sbit rw=P3^1;
  20. sbit lcden=P3^2;
  21. sbit scl=P2^0;
  22. sbit sda=P2^1;
  23. uchar code table1[]="input the passco";
  24. uchar code table2[]="de:     --------";
  25. uchar code table3[]="*";
  26. uchar code table4[]="right   (^_^)   ";
  27. uchar code table5[]="first  error!!!!";
  28. uchar code table6[]="second error!!!!";
  29. uchar code table7[]="third error see ";
  30. uchar code table8[]="u tomorrow (^_^)";
  31. uchar code table9[]="define the passc";
  32. uchar code table10[]="ode:    --------";
  33. uchar code table11[]="code   is    new";
  34. //******************************鍵盤消抖函數(shù)*******************************
  35. void delay1()
  36. { ;; }
  37. void delay2(uchar x)
  38. {        uchar a,b;
  39.         for(a=x;a>0;a--)
  40.                  for(b=100;b>0;b--);
  41. }
  42. //***************************延時********
  43. void delay(uint z)
  44. {          uint x,y;
  45.         for(x=z;x>0;x--)
  46.                 for(y=110;y>0;y--);
  47. }
  48. //****************************e^2room的初始化*******************************
  49. void start()  //開始信號
  50. {        sda=1;
  51.         delay1();
  52.         scl=1;
  53.         delay1();
  54.         sda=0;
  55.         delay1();
  56. }

  57. void stop()   //停止
  58. {
  59.         sda=0;
  60.         delay1();
  61.         scl=1;
  62.         delay1();
  63.         sda=1;
  64.         delay1();
  65. }
  66. //****************************應(yīng)答信號*************************************
  67. void respond()  
  68. {
  69.         uchar i;
  70.         scl=1;
  71.         delay1();
  72.         while((sda==1)&&(i<250))i++;
  73.         scl=0;
  74.         delay1();
  75. }
  76. //*****************************寫字節(jié)操作函數(shù)**********************************
  77. void write_byte(uchar date)
  78. {        uchar i,temp;
  79.         temp=date;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 temp=temp<<1;                        //保持最高位,左移到進位CY
  83.                 scl=0;
  84.             delay1();
  85.                 sda=CY;
  86.                 delay1();
  87.                 scl=1;
  88.                 delay1();
  89.         }
  90.         scl=0;
  91.         delay1();
  92.         sda=1;//總線釋放
  93.         delay1();
  94. }
  95. //*******************************讀字節(jié)操作函數(shù)*****************************
  96. uchar read_byte()
  97. {
  98.         uchar i,k;
  99.         scl=0;
  100.         delay1();
  101.         sda=1;
  102.         delay1();
  103.         for(i=0;i<8;i++)
  104.         {
  105.                 scl=1;
  106.                 delay1();        
  107.                 k=(k<<1)|sda;    //或運算,放到最低位
  108.                 scl=0;
  109.                 delay1();        
  110.         }
  111.         return k;
  112. }
  113. //**********************************寫地址函數(shù)******************************
  114. void write_add(uchar address,uchar date)
  115. {          start();
  116.         write_byte(0xa0);
  117.         respond();
  118.         write_byte(address);
  119.         respond();
  120.         write_byte(date);
  121.         respond();
  122.         stop();
  123. }
  124. //*******************************讀地址函數(shù)*************************************
  125. uchar read_add(uchar address)
  126. {        uchar date;
  127.         start();
  128.         write_byte(0xa0);
  129.         respond();
  130.         write_byte(address);
  131.         respond();
  132.         start();
  133.         write_byte(0xa1);
  134.         respond();
  135.         date=read_byte();
  136.         stop();
  137.         return date;
  138. }
  139. //****************************LCD1602的初始化*******************************
  140. void write_com(uchar com)
  141. {          rs=0;
  142.         lcden=0;
  143.         P0=com;
  144.         delay(5);
  145.         lcden=1;
  146.         delay(5);
  147.         lcden=0;        
  148. }

  149. void write_date(uchar date)
  150. {        rs=1;
  151.         lcden=0;
  152.         P0=date;
  153.         delay(5);
  154.         lcden=1;
  155.         delay(5);
  156.         lcden=0;        
  157. }
  158. //***************************************密碼比較函數(shù)********************************
  159. bit mimacmp()                                       
  160. {        bit flag;
  161.         uchar i;
  162.         for(i=0;i<8;i++)
  163.                 {          if(mima[i]==tab_key[i])
  164.                                 flag=1;
  165.                         else
  166.                         {          flag=0;
  167.                                 i=8;
  168.                         }
  169.                 }
  170.         return(flag);                                                        //返回flag
  171. }

  172. ////**********************************LCD顯示函數(shù)開始**************************************
  173. void lcd_display()
  174. {        uchar i=0;
  175.         write_com(0x80+0x40+8);
  176.         for(i=0;i<n;i++)
  177.         {         write_date(table3[0]);
  178.         }
  179. }
  180. //****************************************鍵盤功能分配函數(shù)群開始****************************
  181. //** 0 ** 1 **2 ** 3**                     
  182. //** 4** 5** 6 **7 **
  183. //**8** 9** 確認(A)  **無效(B)
  184. //**取消(C)**修改密碼鍵(D)**確認修改鍵(E)**無效(F)
  185. void key_manage1()
  186. {        tab_key[n]=0;
  187.         n++;
  188.         if(xiugaiflag==1)
  189.         {        mima[count4]=0;
  190.                 count4++;
  191.         }
  192. }
  193. /**************/
  194. void key_manage2()
  195. {        tab_key[n]=1;
  196.         n++;
  197.         if(xiugaiflag==1)
  198.         {        mima[count4]=1;
  199.                 count4++;
  200.         }
  201. }

  202. void key_manage3()
  203. {        tab_key[n]=2;
  204.         n++;
  205.         if(xiugaiflag==1)
  206.         {        mima[count4]=2;
  207.                 count4++;
  208.         }
  209. }
  210. void key_manage4()
  211. {        tab_key[n]=3;
  212.         n++;
  213.         if(xiugaiflag==1)
  214.         {        mima[count4]=3;
  215.                 count4++;
  216.         }
  217. }
  218. void key_manage5()
  219. {        tab_key[n]=4;
  220.         n++;
  221.         if(xiugaiflag==1)
  222.         {        mima[count4]=4;
  223.         count4++;
  224.         }
  225. }
  226. void key_manage6()
  227. {        tab_key[n]=5;
  228.         n++;
  229.         if(xiugaiflag==1)
  230.         {        mima[count4]=5;
  231.                 count4++;
  232.         }
  233. }
  234. void key_manage7()
  235. {        tab_key[n]=6;
  236.         n++;
  237.         if(xiugaiflag==1)
  238.         {        mima[count4]=6;
  239.                 count4++;
  240.         }
  241. }
  242. void key_manage8()
  243. {        tab_key[n]=7;
  244.         n++;
  245.         if(xiugaiflag==1)
  246.         {        mima[count4]=7;
  247.                 count4++;
  248.         }
  249. }
  250. void key_manage9()
  251. {        tab_key[n]=8;
  252.         n++;
  253.         if(xiugaiflag==1)
  254.         {        mima[count4]=8;
  255.         count4++;
  256.         }
  257. }
  258. void key_manage10()
  259. {          tab_key[n]=9;
  260.         n++;
  261.         if(xiugaiflag==1)
  262.         {        mima[count4]=9;
  263.                 count4++;
  264.         }
  265. }
  266. //**********************************確認鍵**************************************************************  
  267. void key_manage11()
  268. {          enterflag=1;                                        //確認鍵按下
  269.         if(n==8)                                           //只有輸入8個密碼后按確認才做比較
  270.                 mimaflag=mimacmp();
  271.         else
  272.                 mimaflag=0;
  273.          if(enterflag==1)
  274.                 {
  275.                         enterflag=0;
  276.                         n=0;
  277.                         //用FFFFFFFF清除已經(jīng)輸入的密碼
  278.                         for(count3=0;count3<8;count3++)
  279.                         {        
  280.                                 delay(5);
  281.                                 tab_key[count3]=0x0f;               
  282.                         }               
  283.                         TR1=1;                                                                        //打開計數(shù)器1
  284.                         count1=0;                                                                //定時器1由50MS累計到1S所用的計數(shù)器
  285.                         if(mimaflag==1)
  286.                         {        a=0;
  287.                                    write_com(0x01);
  288.                                 write_com(0x80);
  289.                                 for(count3=0;count3<16;count3++)
  290.                                 {          write_date(table4[count3]);        //密碼正確,顯示RIGHT,綠燈亮
  291.                                         delay(5);
  292.                                 }
  293.                         }
  294.                     else
  295.                         {          n=0;
  296.                                  red=0;
  297.                             bell=0;
  298.                                 a++;
  299.                                 if(a==1)
  300.                                 {
  301.                                         for(count3=0;count3<8;count3++) //ffffffff清除密碼
  302.                                         {        
  303.                                                 delay(5);
  304.                                                 tab_key[count3]=0x0f;               
  305.                                         }
  306.                                         write_com(0x01);                                                                                
  307.                                         write_com(0x80);
  308.                                         for(count3=0;count3<16;count3++)
  309.                                         {
  310.                                                 write_date(table5[count3]);        //密碼錯誤,顯示 first error,紅燈亮
  311.                                                 delay(5);
  312.                                         }
  313.                                                 TR1=1;
  314.                                 }
  315.                                 if(a==2)
  316.                                 {        
  317.                                         for(count3=0;count3<8;count3++) //ffffffff清除密碼
  318.                                         {        
  319.                                                 delay(5);
  320.                                                 tab_key[count3]=0x0f;               
  321.                                         }
  322.                                                 write_com(0x01);
  323.                                                 write_com(0x80);
  324.                                                 for(count3=0;count3<16;count3++)
  325.                                                 {
  326.                                                         write_date(table6[count3]);        //密碼錯誤,顯示SECOND ERROR,紅燈亮
  327.                                                         delay(5);
  328.                                                 }
  329.                                                         TR1=1;
  330.                                 }

  331.                                   if(a==3)
  332.                                         {        
  333.                                                 for(count3=0;count3<8;count3++) //ffffffff清除密碼
  334.                                                 {        
  335.                                                         delay(5);
  336.                                                         tab_key[count3]=0x0f;               
  337.                                                 }
  338.                                                 write_com(0x01);
  339.                                                 write_com(0x80);
  340.                                                 for(count3=0;count3<16;count3++)
  341.                                                 {
  342.                                                         write_date(table7[count3]);        //密碼錯誤,顯示third error see,紅燈亮
  343.                                                         delay(5);
  344.                                                 }
  345.                                                 write_com(0x80+0x40);
  346.                                                 for(count3=0;count3<16;count3++)
  347.                                                 {
  348.                                                         write_date(table8[count3]);//密碼錯誤,顯示 U TOMORROW ,紅燈亮
  349.                                                         delay(5);
  350.                                                 }
  351.                                                         TR1=0;

  352.                                         }

  353.                 }
  354.         }

  355. }
  356. void key_manage12()
  357. {        tab_key[n]=11;
  358.         n++;                                                  //密碼計數(shù)清零
  359. }
  360. //****************************************************取消鍵********************************************  
  361. void key_manage13()
  362. {        n=0;                                                  //密碼計數(shù)清零
  363.         write_com(0x80);                                                //指針?biāo)肝恢?br />
  364.         for(count3=0;count3<16;count3++)
  365.         {        write_date(table1[count3]);                //第一行顯示INPUT THE PASSPORD:
  366.                 delay(5);
  367.         }
  368.         write_com(0x80+0x40);
  369.         for(count3=0;count3<16;count3++)
  370.         {        write_date(table2[count3]);        //開機顯示--------
  371.                 delay(5);
  372.                 tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼
  373.         }
  374. }
  375. //*******************************************修改密碼鍵**********************************
  376. void key_manage14()
  377. {         uchar aa=0;
  378.         n=0;
  379.         xiugaiflag=1;
  380.         write_com(0x01);
  381.         write_com(0x80);
  382.         for(count3=0;count3<16;count3++)
  383.         {        write_date(table9[count3]);        //顯示define the password
  384.                 delay(5);
  385.                 tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼
  386.         }
  387.         write_com(0x80+0x40);
  388.         for(count3=0;count3<16;count3++)
  389.         {        write_date(table10[count3]);        //顯示--------
  390.                 delay(5);
  391.         }
  392.         TR0=1;
  393. }
  394. //******************************************修改密碼鍵的確認鍵********************************
  395. void key_manage15()
  396. {        n=0;
  397.         enter1flag=1;
  398.         if(enter1flag==1)
  399.         {        enter1flag=0;
  400.                 count4=0;
  401.                 for(count3=0;count3<16;count3++)
  402.                 {        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼
  403.                  }
  404.                 write_com(0x01);
  405.                 write_com(0x80);
  406.                 for(count3=0;count3<16;count3++)
  407.                 {        write_date(table11[count3]);
  408.                         delay(100);
  409.                 }
  410.         TR1=1;
  411.         count1=0;
  412.         }
  413. }
  414. void key_manage16()
  415. {        tab_key[n]=15;
  416.         n++;
  417. }
  418. //****************************************定時器1的50MS,共延時1秒*****************************
  419. void time_1() interrupt 3
  420. {        TH1=(65536-50000)/256;
  421.         TL1=(65536-50000)%256;
  422.         if(count1<20)
  423.         {        count1++;
  424.         }
  425.         else                                                         //計時到1S
  426.         {          TR1=0;
  427.                 count1=0;
  428.                 mimaflag=0;

  429.                 red=1;
  430.                 bell=1;
  431.                 //顯示FFFFFFFF
  432.                 write_com(0x01);
  433.                 write_com(0x80);
  434.                 for(count3=0;count3<16;count3++)
  435.                         {
  436.                                 write_date(table1[count3]);        //顯示INPUT THE PASSCODE
  437.                                 delay(5);
  438.                         }
  439.                 write_com(0x80+0x40);
  440.                 for(count3=0;count3<16;count3++)
  441.                         {
  442.                                 write_date(table2[count3]);        //開機顯示FFFFFFFF
  443.                                 delay(5);
  444.                         }
  445.         }
  446. }
  447. //***********************************************定時0**********************************************
  448. void time_0() interrupt 1
  449. {        TH0=(65536-50000)/256;
  450.         TL0=(65536-50000)%256;
  451.         if(count4<8)
  452.         {        key_scan();
  453.         }
  454.         else
  455.         {        TR0=0;
  456.                 count4=0;
  457.         }
  458. }
  459. //初始化函數(shù)
  460. void init()
  461. {        uchar i;
  462.         lcden=0;
  463.         write_com(0x38);                                        //打開顯示模式設(shè)置
  464.         write_com(0x0c);                                        //打開顯示,光標(biāo)等等設(shè)置未零
  465.         write_com(0x06);                                        //當(dāng)讀或?qū)懸粋字符后地址指針加一,且光標(biāo)加一,當(dāng)寫一個字符后整頻顯示左移,
  466.         write_com(0x01);                                        //清零指令
  467.         write_com(0x80);                                        //指針?biāo)肝恢?br />
  468.         //定時器初始化
  469.         TMOD=0x11;                                                        //T0,T1工作方式1
  470.         TH0=(65536-2000)/256;
  471.         TL0=(65536-2000)%256;                                //T0初始化2MS

  472.         TH1=(65536-50000)/256;
  473.         TL1=(65536-50000)%256;                                //T1初始化50MS

  474.         TR1=0;
  475.         ET1=1;
  476.         EA=1;
  477.         TR0=0;
  478.         ET0=1;

  479.         count0=0;                                                        //初始沒有密碼輸入,故為零
  480.         enterflag=0;                                                //沒有確認鍵按下
  481.         mimaflag=0;                                                        //密碼正確與否鍵先置零

  482.         red=1;                                                                //紅燈不亮
  483. //************密碼存入EPROM中**********************************
  484.         sda=1;
  485.         delay(5);
  486.         scl=1;
  487.         delay(5);
  488.         for(i=0;i<8;i++)
  489.         {          write_add(i,8);
  490.                 delay2(100);
  491.         }
  492.         for(i=0;i<8;i++)
  493.         {        mima[i]=read_add(i);
  494.                 delay(5);
  495.         }
  496. }
  497. void main()
  498. {        
  499.                 P1=0x0f;
  500.         rw=0;               
  501.         init();
  502.         write_com(0x80);                                                //指針?biāo)肝恢?br />
  503.         for(count3=0;count3<16;count3++)
  504.         {        write_date(table1[count3]);                //第一行顯示INPUT THE PASSPORD:
  505.                 delay(5);
  506.         }
  507.         write_com(0x80+0x40);
  508.         for(count3=0;count3<16;count3++)
  509.         {          write_date(table2[count3]);                //開機顯示FFFFFFFF
  510.                 delay(5);
  511.         }
  512.         while(1)
  513.         {        key_scan();                                                      //調(diào)用鍵盤掃描函數(shù)
  514.                 lcd_display();
  515.         }
  516. }
  517. //***************鍵盤掃描函數(shù)開始********************************
  518. void key_scan()
  519. {//**********掃描第一行*********
  520.         P1=0xfe;
  521.         temp=P3;
  522.         temp=temp&0xf0;
  523.         if(temp!=0xf0)
  524.         {        delay(100);
  525.                 if(temp!=0xf0)
  526.                 {         temp=P3;
  527.                         switch(temp)
  528.                         {        case 0xee:
  529.                                         key_manage1();        break;
  530.                                 case 0xde:
  531.                                         key_manage2();        break;
  532.                                 case 0xbe:
  533.                                         key_manage3();        break;
  534.                                 case 0x7e:
  535.                                         key_manage4();        break;
  536.                         }
  537.                         while(temp!=0xf0)
  538.                         {         temp=P3;
  539.                                 temp=temp&0xf0;
  540.                         }
  541.                 }
  542.         }
  543. //**************掃描第二行***********************************
  544.         P1=0xfd;
  545.         temp=P3;
  546.         temp=temp&0xf0;
  547.         if(temp!=0xf0)
  548.         {        delay(100);
  549.                 if(temp!=0xf0)
  550.                 {        temp=P3;
  551.                         switch(temp)
  552.                         {        case 0xed:
  553.                                         key_manage5();        break;
  554.                                 case 0xdd:
  555.                                         key_manage6();         break;

  556.                                 case 0xbd:
  557.                                         key_manage7();        break;

  558.                                 case 0x7d:
  559.                                         key_manage8();        break;
  560.                         }
  561.                         while(temp!=0xf0)
  562.                         {        temp=P3;
  563.                                 temp=temp&0xf0;
  564.                         }
  565.                 }
  566.         }
  567. //*********************************************掃描第三行***********************************
  568.         P1=0xfb;
  569.         temp=P3;
  570.         temp=temp&0xf0;
  571.         if(temp!=0xf0)
  572.         {         delay(100);
  573.                 if(temp!=0xf0)
  574.                 {        temp=P3;
  575.                         switch(temp)
  576.                         {        case 0xeb:
  577.                                         key_manage9();        break;
  578.                                 case 0xdb:
  579.                                         key_manage10();        break;
  580.                                    case 0xbb:
  581.                                         key_manage11();        break;
  582.                                 case 0x7b:
  583.                                         key_manage12();        break;
  584.                         }
  585.                         while(temp!=0xf0)
  586.                         {        temp=P3;
  587.                                 temp=temp&0xf0;
  588.                         }
  589.                 }
  590.         }
  591. //***************************************************掃描第四行****************************************
  592.         P1=0xf7;
  593.         temp=P3;
  594.         temp=temp&0xf0;
  595.         if(temp!=0xf0)
  596.         {        delay(100);
  597.                 if(temp!=0xf0)
  598.                 {        temp=P3;
  599.                         switch(temp)
  600.                         {        case 0xe7:
  601.                                         key_manage13();        break;
  602.                                 case 0xd7:
  603.                                         key_manage14();        break;
  604.                                  case 0xb7:
  605.                                         key_manage15();        break;
  606.                                 case 0x77:
  607.                                         key_manage16();        break;
  608.                         }
  609.                         while(temp!=0xf0)
  610.                         {        temp=P3;
  611.                                 temp=temp&0xf0;
  612.                         }
  613.                 }
  614.         }
  615. }
復(fù)制代碼


屏幕截圖(13).png (163.14 KB, 下載次數(shù): 19)

屏幕截圖(13).png

電子密碼鎖.rar

162.4 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产馆在线真实露脸 | 天天天操操操 | 看一级毛片视频 | 二区中文字幕 | 国产色视频网站 | 日韩精品免费播放 | 国产精品久久久久久久久久久久 | 男女视频在线观看网站 | 日本午夜免费福利视频 | 综合色站导航 | 一级黄色夫妻生活 | 91av在线视频观看 | 视频在线一区二区 | 亚洲免费观看视频网站 | 国产精品毛片一区二区在线看 | 日本一二三区高清 | 欧美中文一区 | 天天操天天射天天 | 国产一二三区电影 | www成人啪啪18 | 欧美亚洲综合久久 | 91精品国产乱码久久久 | 日韩成人在线网站 | 国产精品毛片久久久久久久 | 久久精彩视频 | 一区二区三区四区在线 | 97caoporn国产免费人人 | 久久久久国产 | 日韩毛片免费看 | 色爽女 | 国产精品美女久久久 | 国产成人区 | a久久 | 亚洲国产精品日韩av不卡在线 | 一区二区三区四区在线 | 亚洲一区在线日韩在线深爱 | 欧美日韩国产一区二区三区不卡 | 午夜欧美| 国产精品五月天 | av日韩精品 | 天天操人人干 |