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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

電子密碼鎖設(shè)計(jì)(原理圖+程序)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主



  1. #include<reg52.h>

  2. #define uint unsigned int

  3. #define uchar unsigned char

  4. void key_scan();

  5. ucharcount0,count1,count3,num,n=0,temp,a,j,count4;

  6. uchar mima[8];                                                       //初始密碼存儲(chǔ)區(qū)

  7. uchar tab_key[50];                                                //輸入密碼存儲(chǔ)區(qū)

  8. uchar code table[]={

  9. 0x3f,0x06,0x5b,0x4f,

  10. 0x66,0x6d,0x7d,0x07,

  11. 0x7f,0x6f,0x77,0x7c,

  12. 0x39,0x5e,0x79,0x71};

  13. bit enterflag;                                                       //確認(rèn)鍵按下與否的標(biāo)志

  14. bit mimaflag;                                                        //密碼正確與否的標(biāo)志

  15. bit xiugaiflag;                                                       //修改密碼標(biāo)志        

  16. bit enter1flag;                                               //修改密碼確認(rèn)鍵標(biāo)志        

  17. sbit red=P3^7;

  18. sbit bell=P3^6;

  19. sbit rs=P2^0;

  20. sbitrw=P2^1;

  21. sbit lcden=P2^2;

  22. sbit scl=P3^4;

  23. sbit sda=P3^5;

  24. uchar code table1[]="input thepassco";

  25. uchar code table2[]="de:     --------";

  26. uchar code table3[]="*";

  27. uchar code table4[]="right   (^_^)  ";

  28. uchar code table5[]="first  error!!!!";

  29. uchar code table6[]="seconderror!!!!";

  30. uchar code table7[]="third error see";

  31. uchar code table8[]="u tomorrow(^_^)";

  32. uchar code table9[]="define thepassc";

  33. uchar code table10[]="ode:    --------";

  34. uchar code table11[]="code   is   new";

  35. //******************************鍵盤(pán)消抖函數(shù)*******************************

  36. void delay1()

  37. { ;; }

  38. void delay2(uchar x)

  39. {

  40.        uchar a,b;

  41.        for(a=x;a>0;a--)

  42.         for(b=100;b>0;b--);

  43. }

  44.       

  45. void delay(uint z)

  46. {

  47.        uint x,y;

  48.        for(x=z;x>0;x--)

  49.                 for(y=110;y>0;y--);

  50. }


  51. //****************************e^2room的初始化*******************************

  52. void start()  //開(kāi)始信號(hào)

  53. {      

  54.        sda=1;

  55.        delay1();

  56.        scl=1;

  57.        delay1();

  58.        sda=0;

  59.        delay1();

  60. }


  61. void stop()   //停止

  62. {

  63.        sda=0;

  64.        delay1();

  65.        scl=1;

  66.        delay1();

  67.        sda=1;

  68.        delay1();

  69. }

  70. //****************************應(yīng)答信號(hào)*************************************

  71. void respond()  

  72. {

  73.        uchar i;

  74.        scl=1;

  75.        delay1();

  76.        while((sda==1)&&(i<250))i++;

  77.        scl=0;

  78.        delay1();

  79. }

  80. //*****************************寫(xiě)字節(jié)操作函數(shù)**********************************

  81. void write_byte(uchar date)

  82. {

  83.        uchar i,temp;

  84.        temp=date;

  85.        for(i=0;i<8;i++)

  86.        {

  87.                 temp=temp<<1;                        //保持最高位,左移到進(jìn)位CY

  88.                 scl=0;

  89.            delay1();

  90.                 sda=CY;

  91.                 delay1();

  92.                 scl=1;

  93.                 delay1();

  94.        }

  95.        scl=0;

  96.        delay1();

  97.        sda=1;//總線釋放

  98.        delay1();

  99. }

  100. //*******************************讀字節(jié)操作函數(shù)*****************************

  101. uchar read_byte()

  102. {

  103.        uchar i,k;

  104.        scl=0;

  105.        delay1();

  106.        sda=1;

  107.        delay1();

  108.        for(i=0;i<8;i++)

  109.        {

  110.                 scl=1;

  111.                 delay1();        

  112.                 k=(k<<1)|sda;    //或運(yùn)算,放到最低位

  113.                 scl=0;

  114.                 delay1();        

  115.        }

  116.        return k;

  117. }

  118. //**********************************寫(xiě)地址函數(shù)******************************

  119. void write_add(uchar address,uchar date)

  120. {

  121.        start();

  122.        write_byte(0xa0);

  123.        respond();

  124.        write_byte(address);

  125.        respond();

  126.        write_byte(date);

  127.        respond();

  128.        stop();

  129. }

  130. //*******************************讀地址函數(shù)*************************************

  131. uchar read_add(uchar address)

  132. {

  133.        uchar date;

  134.        start();

  135.        write_byte(0xa0);

  136.        respond();

  137.        write_byte(address);

  138.        respond();

  139.        start();

  140.        write_byte(0xa1);

  141.        respond();

  142.        date=read_byte();

  143.        stop();

  144.        return date;

  145. }

  146. //****************************LCD1602的初始化*******************************

  147. void write_com(uchar com)

  148. {

  149.        rs=0;

  150.        lcden=0;

  151.        P0=com;

  152.        delay(5);

  153.        lcden=1;

  154.        delay(5);

  155.        lcden=0;        

  156. }


  157. void write_date(uchar date)

  158. {

  159.        rs=1;

  160.        lcden=0;

  161.        P0=date;

  162.        delay(5);

  163.        lcden=1;

  164.        delay(5);

  165.        lcden=0;        

  166. }


  167. //***************************************密碼比較函數(shù)********************************

  168. bit mimacmp()                                       

  169. {

  170.        bit flag;

  171.        uchar i;

  172.        for(i=0;i<8;i++)

  173.                 {

  174.                         if(mima[ i]==tab_key[ i])
  175. [ i][ i]
  176.                                 flag=1;

  177.                         else

  178.                                 {

  179.                                 flag=0;

  180.                                 i=8;

  181.                                 }

  182.                 }

  183.        return(flag);                                                        //返回flag

  184. }


  185. ////**********************************LCD顯示函數(shù)開(kāi)始**************************************

  186. void lcd_display()

  187. {

  188. uchar i=0;

  189. write_com(0x80+0x40+8);

  190. for(i=0;i<n;i++)

  191. {

  192. write_date(table3[0]);

  193. }

  194. }


  195. //****************************************鍵盤(pán)功能分配函數(shù)群開(kāi)始****************************

  196. //** 0 ** 1 **2 ** 3**                     

  197. //** 4** 5** 6 **7 **

  198. //**8** 9** 確認(rèn)(A)  **無(wú)效(B)

  199. //**取消(C)**修改密碼鍵(D)**確認(rèn)修改鍵(E)**無(wú)效(F)


  200. void key_manage1()

  201. {

  202. tab_key[n]=0;

  203. n++;

  204. if(xiugaiflag==1)

  205. {

  206. mima[count4]=0;

  207. count4++;

  208. }

  209. }


  210. void key_manage2()

  211. {


  212. tab_key[n]=1;

  213. n++;

  214. if(xiugaiflag==1)

  215. {

  216. mima[count4]=1;

  217. count4++;

  218. }

  219. }


  220. void key_manage3()

  221. {


  222. tab_key[n]=2;

  223. n++;

  224. if(xiugaiflag==1)

  225. {

  226. mima[count4]=2;

  227. count4++;

  228. }

  229. }


  230. void key_manage4()

  231. {

  232. tab_key[n]=3;

  233. n++;

  234. if(xiugaiflag==1)

  235. {

  236. mima[count4]=3;

  237. count4++;

  238. }

  239. }


  240. void key_manage5()

  241. {

  242. tab_key[n]=4;

  243. n++;

  244. if(xiugaiflag==1)

  245. {

  246. mima[count4]=4;

  247. count4++;

  248. }

  249. }


  250. void key_manage6()

  251. {

  252. tab_key[n]=5;

  253. n++;

  254. if(xiugaiflag==1)

  255. {

  256. mima[count4]=5;

  257. count4++;

  258. }

  259. }

  260. void key_manage7()

  261. {

  262. tab_key[n]=6;

  263. n++;

  264. if(xiugaiflag==1)

  265. {

  266. mima[count4]=6;

  267. count4++;

  268. }

  269. }

  270. void key_manage8()

  271. {

  272. tab_key[n]=7;

  273. n++;

  274. if(xiugaiflag==1)

  275. {

  276. mima[count4]=7;

  277. count4++;

  278. }

  279. }


  280. void key_manage9()

  281. {

  282. tab_key[n]=8;

  283. n++;

  284. if(xiugaiflag==1)

  285. {

  286. mima[count4]=8;

  287. count4++;

  288. }

  289. }

  290. void key_manage10()

  291. {

  292. tab_key[n]=9;

  293. n++;

  294. if(xiugaiflag==1)

  295. {

  296. mima[count4]=9;

  297. count4++;

  298. }

  299. }

  300. //**********************************確認(rèn)鍵**************************************************************  

  301. void key_manage11()

  302. {

  303.        enterflag=1;                                        //確認(rèn)鍵按下

  304.        if(n==8)                                           //只有輸入8個(gè)密碼后按確認(rèn)才做比較

  305.                 mimaflag=mimacmp();

  306.        else

  307.                 mimaflag=0;

  308.         if(enterflag==1)

  309.                 {

  310.                         enterflag=0;

  311.                         n=0;

  312.                         //用FFFFFFFF清除已經(jīng)輸入的密碼

  313.                        for(count3=0;count3<8;count3++)

  314.                         {        

  315.                                 delay(5);

  316.                                tab_key[count3]=0x0f;               

  317.                         }               

  318.                                        

  319.                         TR1=1;                                                                       //打開(kāi)計(jì)數(shù)器1

  320.                         count1=0;                                                                //定時(shí)器1由50MS累計(jì)到1S所用的計(jì)數(shù)器

  321.                         if(mimaflag==1)

  322.                         {        

  323.                                 a=0;

  324.                         

  325.                                 write_com(0x01);

  326.                                write_com(0x80);

  327.                                for(count3=0;count3<16;count3++)

  328.                                 {

  329.                                        write_date(table4[count3]);       //密碼正確,顯示RIGHT,綠燈亮

  330.                                        delay(5);

  331.                                 }

  332.                         }

  333.                                 

  334.                     else

  335.                         {   

  336.                                  n=0;

  337.                                  red=0;

  338.                             bell=0;

  339.                                 a++;

  340.                                 if(a==1)

  341.                                 {

  342.                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼

  343.                                         {        

  344.                                                delay(5);

  345.                                                tab_key[count3]=0x0f;               

  346.                                         }

  347.                                        write_com(0x01);                                                                              

  348.                                        write_com(0x80);

  349.                                        for(count3=0;count3<16;count3++)

  350.                                         {

  351.                                                write_date(table5[count3]);       //密碼錯(cuò)誤,顯示 first error,紅燈亮

  352.                                                delay(5);

  353.                                         }

  354.                                                TR1=1;

  355.                                 }

  356.                                 if(a==2)

  357.                                 {        

  358.                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼

  359.                                         {        

  360.                                                delay(5);

  361.                                                tab_key[count3]=0x0f;               

  362.                                         }

  363.                                                write_com(0x01);

  364.                                                write_com(0x80);

  365.                                                for(count3=0;count3<16;count3++)

  366.                                                {

  367.                                                        write_date(table6[count3]);       //密碼錯(cuò)誤,顯示SECOND ERROR,紅燈亮

  368.                                                        delay(5);

  369.                                                }

  370.                                                         TR1=1;

  371.                                 }

  372.                                        

  373.                                   if(a==3)

  374.                                         {        

  375.                                                for(count3=0;count3<8;count3++) //ffffffff清除密碼

  376.                                                {        

  377.                                                        delay(5);

  378.                                                        tab_key[count3]=0x0f;               

  379.                                                }

  380.                                                write_com(0x01);

  381.                                                write_com(0x80);

  382.                                                for(count3=0;count3<16;count3++)

  383.                                                {

  384.                                                        write_date(table7[count3]);       //密碼錯(cuò)誤,顯示third error see,紅燈亮

  385.                                                        delay(5);

  386.                                                }

  387.                                                write_com(0x80+0x40);

  388.                                                for(count3=0;count3<16;count3++)

  389.                                                {

  390.                                                        write_date(table8[count3]);//密碼錯(cuò)誤,顯示 UTOMORROW ,紅燈亮

  391.                                                        delay(5);

  392.                                                }

  393.                                                        TR1=0;

  394.                                                                

  395.                                         }

  396.                                                       

  397.                 }

  398.        }


  399. }

  400. void key_manage12()

  401. {

  402. tab_key[n]=11;

  403. n++;                                                 //密碼計(jì)數(shù)清零


  404. }

  405. //****************************************************取消鍵********************************************  

  406. void key_manage13()

  407. {


  408. n=0;                                                  //密碼計(jì)數(shù)清零

  409. write_com(0x80);                                               //指針?biāo)肝恢?br />

  410. for(count3=0;count3<16;count3++)

  411. {

  412.        write_date(table1[count3]);                //第一行顯示INPUTTHE PASSPORD:

  413.        delay(5);

  414. }

  415. write_com(0x80+0x40);

  416. for(count3=0;count3<16;count3++)

  417. {

  418.        write_date(table2[count3]);       //開(kāi)機(jī)顯示--------

  419.        delay(5);

  420.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  421. }


  422. }

  423. //*******************************************修改密碼鍵**********************************

  424. void key_manage14()

  425. {

  426.        uchar aa=0;

  427.        n=0;

  428.        xiugaiflag=1;

  429.        write_com(0x01);

  430.        write_com(0x80);

  431. for(count3=0;count3<16;count3++)

  432. {

  433.        write_date(table9[count3]);       //顯示define the password

  434.        delay(5);

  435.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  436. }

  437.        write_com(0x80+0x40);

  438. for(count3=0;count3<16;count3++)

  439. {

  440.        write_date(table10[count3]);       //顯示--------

  441.        delay(5);

  442. }

  443. TR0=1;


  444. }

  445. //******************************************修改密碼鍵的確認(rèn)鍵********************************

  446. void key_manage15()

  447. {

  448. n=0;

  449. enter1flag=1;

  450. if(enter1flag==1)

  451. {

  452.        enter1flag=0;

  453.        count4=0;

  454.        for(count3=0;count3<16;count3++)

  455.        {

  456.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  457.         }

  458.        write_com(0x01);

  459.        write_com(0x80);

  460.        for(count3=0;count3<16;count3++)

  461.        {

  462.                 write_date(table11[count3]);

  463.                 delay(100);

  464.        }

  465.        TR1=1;

  466.        count1=0;

  467. }

  468. }

  469. void key_manage16()

  470. {

  471. tab_key[n]=15;

  472. n++;

  473. }


  474. //****************************************定時(shí)器1的50MS,共延時(shí)1秒*****************************

  475. void time_1() interrupt 3

  476. {      


  477.        TH1=(65536-50000)/256;

  478.        TL1=(65536-50000)%256;

  479.        if(count1<20)

  480.        {

  481.                 count1++;

  482.        }

  483.        else                                                        //計(jì)時(shí)到1S

  484.        {

  485.                 TR1=0;

  486.                 count1=0;

  487.                 mimaflag=0;


  488.                 red=1;

  489.                 bell=1;

  490.                 //顯示FFFFFFFF

  491.                 write_com(0x01);

  492.                 write_com(0x80);

  493.                for(count3=0;count3<16;count3++)

  494.                         {

  495.                                 write_date(table1[count3]);        //顯示INPUT THE PASSCODE

  496.                                 delay(5);

  497.                         }

  498.                 write_com(0x80+0x40);

  499.                for(count3=0;count3<16;count3++)

  500.                         {

  501.                                write_date(table2[count3]);       //開(kāi)機(jī)顯示FFFFFFFF

  502.                                 delay(5);

  503.                         }

  504.        }


  505. }

  506. //***********************************************定時(shí)0**********************************************

  507. void time_0() interrupt 1

  508. {      


  509.        TH0=(65536-50000)/256;

  510.        TL0=(65536-50000)%256;

  511. if(count4<8)

  512. {

  513.        key_scan();

  514. }

  515. else

  516. {

  517.        TR0=0;

  518.        count4=0;

  519. }

  520. }


  521. //初始化函數(shù)

  522. void init()

  523. {      


  524.        uchar i;

  525.        lcden=0;

  526.        write_com(0x38);                                        //打開(kāi)顯示模式設(shè)置

  527.        write_com(0x0c);                                        //打開(kāi)顯示,光標(biāo)等等設(shè)置未零

  528.        write_com(0x06);                                        //當(dāng)讀或?qū)懸粋(gè)字符后地址指針加一,且光標(biāo)加一,當(dāng)寫(xiě)一個(gè)字符后整頻顯示左移,

  529.        write_com(0x01);                                        //清零指令

  530.        write_com(0x80);                                        //指針?biāo)肝恢?br />


  531.        //定時(shí)器初始化

  532.        TMOD=0x11;                                                       //T0,T1工作方式1

  533.         TH0=(65536-2000)/256;

  534.        TL0=(65536-2000)%256;                                //T0初始化2MS


  535.        TH1=(65536-50000)/256;

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


  537.        TR1=0;

  538.        ET1=1;

  539.        EA=1;

  540.        TR0=0;

  541.        ET0=1;


  542.        count0=0;                                                       //初始沒(méi)有密碼輸入,故為零

  543.        enterflag=0;                                               //沒(méi)有確認(rèn)鍵按下

  544.        mimaflag=0;                                                       //密碼正確與否鍵先置零

  545.                                        

  546.        red=1;                                                               //紅燈不亮

  547. //************密碼存入EPROM中**********************************

  548.        sda=1;

  549.        delay(5);

  550.        scl=1;

  551.        delay(5);

  552.        for(i=0;i<8;i++)

  553.        {

  554.                 write_add(i,8);

  555.                 delay2(100);

  556.        }

  557.        for(i=0;i<8;i++)

  558.        {

  559.                 mima[ i]=read_add(i);
  560. [ i]
  561.                 delay(5);

  562.        }


  563. }

  564. void main()

  565. {       rw=0;               

  566.        init();

  567.        write_com(0x80);                                               //指針?biāo)肝恢?br />

  568.        for(count3=0;count3<16;count3++)

  569.        {

  570.                write_date(table1[count3]);                //第一行顯示INPUTTHE PASSPORD:

  571.                 delay(5);

  572.        }

  573.        write_com(0x80+0x40);

  574.        for(count3=0;count3<16;count3++)

  575.        {

  576.                write_date(table2[count3]);                //開(kāi)機(jī)顯示FFFFFFFF

  577.                 delay(5);

  578.        }

  579.        while(1)

  580.        {

  581.                 key_scan();                                                     //調(diào)用鍵盤(pán)掃描函數(shù)

  582.                 lcd_display();

  583.        }

  584.                  

  585. }

  586. //**************************************************鍵盤(pán)掃描函數(shù)開(kāi)始********************************

  587. void key_scan()

  588. {

  589. //**********掃描第一行*********

  590. P1=0xfe;

  591. temp=P1;

  592. temp=temp&0xf0;

  593. if(temp!=0xf0)

  594. {

  595. delay(100);

  596. if(temp!=0xf0)

  597. {

  598. temp=P1;

  599. switch(temp)

  600. {

  601. case 0xee:

  602. key_manage1();

  603. break;


  604. case 0xde:

  605. key_manage2();

  606. break;


  607. case 0xbe:

  608. key_manage3();

  609. break;


  610. case 0x7e:

  611. key_manage4();

  612. break;

  613. }

  614. while(temp!=0xf0)

  615. {

  616. temp=P1;

  617. temp=temp&0xf0;

  618. }

  619. }

  620. }

  621. //**************************************************掃描第二行***********************************

  622. P1=0xfd;

  623. temp=P1;

  624. temp=temp&0xf0;

  625. if(temp!=0xf0)

  626. {

  627. delay(100);

  628. if(temp!=0xf0)

  629. {

  630. temp=P1;

  631. switch(temp)

  632. {

  633. case 0xed:

  634. key_manage5();

  635. break;


  636. case 0xdd:

  637. key_manage6();

  638. break;


  639. case 0xbd:

  640. key_manage7();

  641. break;


  642. case 0x7d:

  643. key_manage8();

  644. break;

  645. }

  646. while(temp!=0xf0)

  647. {

  648. temp=P1;

  649. temp=temp&0xf0;

  650. }

  651. }

  652. }

  653. //*********************************************掃描第三行***********************************

  654. P1=0xfb;

  655. temp=P1;

  656. temp=temp&0xf0;

  657. if(temp!=0xf0)

  658. {

  659. delay(100);

  660. if(temp!=0xf0)

  661. {

  662. temp=P1;

  663. switch(temp)

  664. {

  665. case 0xeb:

  666. key_manage9();

  667. break;


  668. case 0xdb:

  669. key_manage10();

  670. break;


  671. case 0xbb:

  672. key_manage11();

  673. break;


  674. case 0x7b:

  675. key_manage12();

  676. break;

  677. }

  678. while(temp!=0xf0)

  679. {

  680. temp=P1;

  681. temp=temp&0xf0;

  682. }

  683. }

  684. }


  685. //***************************************************掃描第四行****************************************

  686. P1=0xf7;

  687. temp=P1;

  688. temp=temp&0xf0;

  689. if(temp!=0xf0)

  690. {

  691. delay(100);

  692. if(temp!=0xf0)

  693. {

  694. temp=P1;

  695. switch(temp)

  696. {

  697. case 0xe7:

  698. key_manage13();

  699. break;


  700. case 0xd7:

  701. key_manage14();

  702. break;


  703. case 0xb7:

  704. key_manage15();

  705. break;


  706. case 0x77:

  707. key_manage16();

  708. break;

  709. }

  710. while(temp!=0xf0)

  711. {

  712. temp=P1;

  713. temp=temp&0xf0;

  714. }

  715. }

  716. }

  717. }
  718. #include<reg52.h>

  719. #define uint unsigned int

  720. #define uchar unsigned char

  721. void key_scan();

  722. ucharcount0,count1,count3,num,n=0,temp,a,j,count4;

  723. uchar mima[8];                                                       //初始密碼存儲(chǔ)區(qū)

  724. uchar tab_key[50];                                                //輸入密碼存儲(chǔ)區(qū)

  725. uchar code table[]={

  726. 0x3f,0x06,0x5b,0x4f,

  727. 0x66,0x6d,0x7d,0x07,

  728. 0x7f,0x6f,0x77,0x7c,

  729. 0x39,0x5e,0x79,0x71};

  730. bit enterflag;                                                       //確認(rèn)鍵按下與否的標(biāo)志

  731. bit mimaflag;                                                        //密碼正確與否的標(biāo)志

  732. bit xiugaiflag;                                                       //修改密碼標(biāo)志        

  733. bit enter1flag;                                               //修改密碼確認(rèn)鍵標(biāo)志        

  734. sbit red=P3^7;

  735. sbit bell=P3^6;

  736. sbit rs=P2^0;

  737. sbitrw=P2^1;

  738. sbit lcden=P2^2;

  739. sbit scl=P3^4;

  740. sbit sda=P3^5;

  741. uchar code table1[]="input thepassco";

  742. uchar code table2[]="de:     --------";

  743. uchar code table3[]="*";

  744. uchar code table4[]="right   (^_^)  ";

  745. uchar code table5[]="first  error!!!!";

  746. uchar code table6[]="seconderror!!!!";

  747. uchar code table7[]="third error see";

  748. uchar code table8[]="u tomorrow(^_^)";

  749. uchar code table9[]="define thepassc";

  750. uchar code table10[]="ode:    --------";

  751. uchar code table11[]="code   is   new";

  752. //******************************鍵盤(pán)消抖函數(shù)*******************************

  753. void delay1()

  754. { ;; }

  755. void delay2(uchar x)

  756. {

  757.        uchar a,b;

  758.        for(a=x;a>0;a--)

  759.         for(b=100;b>0;b--);

  760. }



  761. void delay(uint z)

  762. {

  763.        uint x,y;

  764.        for(x=z;x>0;x--)

  765.                 for(y=110;y>0;y--);

  766. }



  767. //****************************e^2room的初始化*******************************

  768. void start()  //開(kāi)始信號(hào)

  769. {      

  770.        sda=1;

  771.        delay1();

  772.        scl=1;

  773.        delay1();

  774.        sda=0;

  775.        delay1();

  776. }



  777. void stop()   //停止

  778. {

  779.        sda=0;

  780.        delay1();

  781.        scl=1;

  782.        delay1();

  783.        sda=1;

  784.        delay1();

  785. }

  786. //****************************應(yīng)答信號(hào)*************************************

  787. void respond()  

  788. {

  789.        uchar i;

  790.        scl=1;

  791.        delay1();

  792.        while((sda==1)&&(i<250))i++;

  793.        scl=0;

  794.        delay1();

  795. }

  796. //*****************************寫(xiě)字節(jié)操作函數(shù)**********************************

  797. void write_byte(uchar date)

  798. {

  799.        uchar i,temp;

  800.        temp=date;

  801.        for(i=0;i<8;i++)

  802.        {

  803.                 temp=temp<<1;                        //保持最高位,左移到進(jìn)位CY

  804.                 scl=0;

  805.            delay1();

  806.                 sda=CY;

  807.                 delay1();

  808.                 scl=1;

  809.                 delay1();

  810.        }

  811.        scl=0;

  812.        delay1();

  813.        sda=1;//總線釋放

  814.        delay1();

  815. }

  816. //*******************************讀字節(jié)操作函數(shù)*****************************

  817. uchar read_byte()

  818. {

  819.        uchar i,k;

  820.        scl=0;

  821.        delay1();

  822.        sda=1;

  823.        delay1();

  824.        for(i=0;i<8;i++)

  825.        {

  826.                 scl=1;

  827.                 delay1();        

  828.                 k=(k<<1)|sda;    //或運(yùn)算,放到最低位

  829.                 scl=0;

  830.                 delay1();        

  831.        }

  832.        return k;

  833. }

  834. //**********************************寫(xiě)地址函數(shù)******************************

  835. void write_add(uchar address,uchar date)

  836. {

  837.        start();

  838.        write_byte(0xa0);

  839.        respond();

  840.        write_byte(address);

  841.        respond();

  842.        write_byte(date);

  843.        respond();

  844.        stop();

  845. }

  846. //*******************************讀地址函數(shù)*************************************

  847. uchar read_add(uchar address)

  848. {

  849.        uchar date;

  850.        start();

  851.        write_byte(0xa0);

  852.        respond();

  853.        write_byte(address);

  854.        respond();

  855.        start();

  856.        write_byte(0xa1);

  857.        respond();

  858.        date=read_byte();

  859.        stop();

  860.        return date;

  861. }

  862. //****************************LCD1602的初始化*******************************

  863. void write_com(uchar com)

  864. {

  865.        rs=0;

  866.        lcden=0;

  867.        P0=com;

  868.        delay(5);

  869.        lcden=1;

  870.        delay(5);

  871.        lcden=0;        

  872. }



  873. void write_date(uchar date)

  874. {

  875.        rs=1;

  876.        lcden=0;

  877.        P0=date;

  878.        delay(5);

  879.        lcden=1;

  880.        delay(5);

  881.        lcden=0;        

  882. }



  883. //***************************************密碼比較函數(shù)********************************

  884. bit mimacmp()                                       

  885. {

  886.        bit flag;

  887.        uchar i;

  888.        for(i=0;i<8;i++)

  889.                 {

  890.                         if(mima[ i]==tab_key[ i])
  891. [ i][ i]
  892.                                 flag=1;

  893.                         else

  894.                                 {

  895.                                 flag=0;

  896.                                 i=8;

  897.                                 }

  898.                 }

  899.        return(flag);                                                        //返回flag

  900. }



  901. ////**********************************LCD顯示函數(shù)開(kāi)始**************************************

  902. void lcd_display()

  903. {

  904. uchar i=0;

  905. write_com(0x80+0x40+8);

  906. for(i=0;i<n;i++)

  907. {

  908. write_date(table3[0]);

  909. }

  910. }



  911. //****************************************鍵盤(pán)功能分配函數(shù)群開(kāi)始****************************

  912. //** 0 ** 1 **2 ** 3**                     

  913. //** 4** 5** 6 **7 **

  914. //**8** 9** 確認(rèn)(A)  **無(wú)效(B)

  915. //**取消(C)**修改密碼鍵(D)**確認(rèn)修改鍵(E)**無(wú)效(F)



  916. void key_manage1()

  917. {

  918. tab_key[n]=0;

  919. n++;

  920. if(xiugaiflag==1)

  921. {

  922. mima[count4]=0;

  923. count4++;

  924. }

  925. }



  926. void key_manage2()

  927. {



  928. tab_key[n]=1;

  929. n++;

  930. if(xiugaiflag==1)

  931. {

  932. mima[count4]=1;

  933. count4++;

  934. }

  935. }



  936. void key_manage3()

  937. {



  938. tab_key[n]=2;

  939. n++;

  940. if(xiugaiflag==1)

  941. {

  942. mima[count4]=2;

  943. count4++;

  944. }

  945. }



  946. void key_manage4()

  947. {

  948. tab_key[n]=3;

  949. n++;

  950. if(xiugaiflag==1)

  951. {

  952. mima[count4]=3;

  953. count4++;

  954. }

  955. }



  956. void key_manage5()

  957. {

  958. tab_key[n]=4;

  959. n++;

  960. if(xiugaiflag==1)

  961. {

  962. mima[count4]=4;

  963. count4++;

  964. }

  965. }



  966. void key_manage6()

  967. {

  968. tab_key[n]=5;

  969. n++;

  970. if(xiugaiflag==1)

  971. {

  972. mima[count4]=5;

  973. count4++;

  974. }

  975. }

  976. void key_manage7()

  977. {

  978. tab_key[n]=6;

  979. n++;

  980. if(xiugaiflag==1)

  981. {

  982. mima[count4]=6;

  983. count4++;

  984. }

  985. }

  986. void key_manage8()

  987. {

  988. tab_key[n]=7;

  989. n++;

  990. if(xiugaiflag==1)

  991. {

  992. mima[count4]=7;

  993. count4++;

  994. }

  995. }



  996. void key_manage9()

  997. {

  998. tab_key[n]=8;

  999. n++;

  1000. if(xiugaiflag==1)

  1001. {

  1002. mima[count4]=8;

  1003. count4++;

  1004. }

  1005. }

  1006. void key_manage10()

  1007. {

  1008. tab_key[n]=9;

  1009. n++;

  1010. if(xiugaiflag==1)

  1011. {

  1012. mima[count4]=9;

  1013. count4++;

  1014. }

  1015. }

  1016. //**********************************確認(rèn)鍵**************************************************************  

  1017. void key_manage11()

  1018. {

  1019.        enterflag=1;                                        //確認(rèn)鍵按下

  1020.        if(n==8)                                           //只有輸入8個(gè)密碼后按確認(rèn)才做比較

  1021.                 mimaflag=mimacmp();

  1022.        else

  1023.                 mimaflag=0;

  1024.         if(enterflag==1)

  1025.                 {

  1026.                         enterflag=0;

  1027.                         n=0;

  1028.                         //用FFFFFFFF清除已經(jīng)輸入的密碼

  1029.                        for(count3=0;count3<8;count3++)

  1030.                         {        

  1031.                                 delay(5);

  1032.                                tab_key[count3]=0x0f;               

  1033.                         }               



  1034.                         TR1=1;                                                                       //打開(kāi)計(jì)數(shù)器1

  1035.                         count1=0;                                                                //定時(shí)器1由50MS累計(jì)到1S所用的計(jì)數(shù)器

  1036.                         if(mimaflag==1)

  1037.                         {        

  1038.                                 a=0;



  1039.                                 write_com(0x01);

  1040.                                write_com(0x80);

  1041.                                for(count3=0;count3<16;count3++)

  1042.                                 {

  1043.                                        write_date(table4[count3]);       //密碼正確,顯示RIGHT,綠燈亮

  1044.                                        delay(5);

  1045.                                 }

  1046.                         }



  1047.                     else

  1048.                         {   

  1049.                                  n=0;

  1050.                                  red=0;

  1051.                             bell=0;

  1052.                                 a++;

  1053.                                 if(a==1)

  1054.                                 {

  1055.                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼

  1056.                                         {        

  1057.                                                delay(5);

  1058.                                                tab_key[count3]=0x0f;               

  1059.                                         }

  1060.                                        write_com(0x01);                                                                              

  1061.                                        write_com(0x80);

  1062.                                        for(count3=0;count3<16;count3++)

  1063.                                         {

  1064.                                                write_date(table5[count3]);       //密碼錯(cuò)誤,顯示 first error,紅燈亮

  1065.                                                delay(5);

  1066.                                         }

  1067.                                                TR1=1;

  1068.                                 }

  1069.                                 if(a==2)

  1070.                                 {        

  1071.                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼

  1072.                                         {        

  1073.                                                delay(5);

  1074.                                                tab_key[count3]=0x0f;               

  1075.                                         }

  1076.                                                write_com(0x01);

  1077.                                                write_com(0x80);

  1078.                                                for(count3=0;count3<16;count3++)

  1079.                                                {

  1080.                                                        write_date(table6[count3]);       //密碼錯(cuò)誤,顯示SECOND ERROR,紅燈亮

  1081.                                                        delay(5);

  1082.                                                }

  1083.                                                         TR1=1;

  1084.                                 }



  1085.                                   if(a==3)

  1086.                                         {        

  1087.                                                for(count3=0;count3<8;count3++) //ffffffff清除密碼

  1088.                                                {        

  1089.                                                        delay(5);

  1090.                                                        tab_key[count3]=0x0f;               

  1091.                                                }

  1092.                                                write_com(0x01);

  1093.                                                write_com(0x80);

  1094.                                                for(count3=0;count3<16;count3++)

  1095.                                                {

  1096.                                                        write_date(table7[count3]);       //密碼錯(cuò)誤,顯示third error see,紅燈亮

  1097.                                                        delay(5);

  1098.                                                }

  1099.                                                write_com(0x80+0x40);

  1100.                                                for(count3=0;count3<16;count3++)

  1101.                                                {

  1102.                                                        write_date(table8[count3]);//密碼錯(cuò)誤,顯示 UTOMORROW ,紅燈亮

  1103.                                                        delay(5);

  1104.                                                }

  1105.                                                        TR1=0;



  1106.                                         }



  1107.                 }

  1108.        }



  1109. }

  1110. void key_manage12()

  1111. {

  1112. tab_key[n]=11;

  1113. n++;                                                 //密碼計(jì)數(shù)清零



  1114. }

  1115. //****************************************************取消鍵********************************************  

  1116. void key_manage13()

  1117. {



  1118. n=0;                                                  //密碼計(jì)數(shù)清零

  1119. write_com(0x80);                                               //指針?biāo)肝恢?br />

  1120. for(count3=0;count3<16;count3++)

  1121. {

  1122.        write_date(table1[count3]);                //第一行顯示INPUTTHE PASSPORD:

  1123.        delay(5);

  1124. }

  1125. write_com(0x80+0x40);

  1126. for(count3=0;count3<16;count3++)

  1127. {

  1128.        write_date(table2[count3]);       //開(kāi)機(jī)顯示--------

  1129.        delay(5);

  1130.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  1131. }



  1132. }

  1133. //*******************************************修改密碼鍵**********************************

  1134. void key_manage14()

  1135. {

  1136.        uchar aa=0;

  1137.        n=0;

  1138.        xiugaiflag=1;

  1139.        write_com(0x01);

  1140.        write_com(0x80);

  1141. for(count3=0;count3<16;count3++)

  1142. {

  1143.        write_date(table9[count3]);       //顯示define the password

  1144.        delay(5);

  1145.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  1146. }

  1147.        write_com(0x80+0x40);

  1148. for(count3=0;count3<16;count3++)

  1149. {

  1150.        write_date(table10[count3]);       //顯示--------

  1151.        delay(5);

  1152. }

  1153. TR0=1;



  1154. }

  1155. //******************************************修改密碼鍵的確認(rèn)鍵********************************

  1156. void key_manage15()

  1157. {

  1158. n=0;

  1159. enter1flag=1;

  1160. if(enter1flag==1)

  1161. {

  1162.        enter1flag=0;

  1163.        count4=0;

  1164.        for(count3=0;count3<16;count3++)

  1165.        {

  1166.        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經(jīng)輸入的密碼

  1167.         }

  1168.        write_com(0x01);

  1169.        write_com(0x80);

  1170.        for(count3=0;count3<16;count3++)

  1171.        {

  1172.                 write_date(table11[count3]);

  1173.                 delay(100);

  1174.        }

  1175.        TR1=1;

  1176.        count1=0;

  1177. }

  1178. }

  1179. void key_manage16()

  1180. {

  1181. tab_key[n]=15;

  1182. n++;

  1183. }



  1184. //****************************************定時(shí)器1的50MS,共延時(shí)1秒*****************************

  1185. void time_1() interrupt 3

  1186. {      



  1187.        TH1=(65536-50000)/256;

  1188.        TL1=(65536-50000)%256;

  1189.        if(count1<20)

  1190.        {

  1191.                 count1++;

  1192.        }

  1193.        else                                                        //計(jì)時(shí)到1S

  1194.        {

  1195.                 TR1=0;

  1196.                 count1=0;

  1197.                 mimaflag=0;



  1198.                 red=1;

  1199.                 bell=1;

  1200.                 //顯示FFFFFFFF

  1201.                 write_com(0x01);

  1202.                 write_com(0x80);

  1203.                for(count3=0;count3<16;count3++)

  1204.                         {

  1205.                                 write_date(table1[count3]);        //顯示INPUT THE PASSCODE

  1206.                                 delay(5);

  1207.                         }

  1208.                 write_com(0x80+0x40);

  1209.                for(count3=0;count3<16;count3++)

  1210.                         {

  1211.                                write_date(table2[count3]);       //開(kāi)機(jī)顯示FFFFFFFF

  1212.                                 delay(5);

  1213.                         }

  1214.        }



  1215. }

  1216. //***********************************************定時(shí)0**********************************************

  1217. void time_0() interrupt 1

  1218. {      



  1219.        TH0=(65536-50000)/256;

  1220.        TL0=(65536-50000)%256;

  1221. if(count4<8)

  1222. {

  1223.        key_scan();

  1224. }

  1225. else

  1226. {

  1227.        TR0=0;

  1228.        count4=0;

  1229. }

  1230. }



  1231. //初始化函數(shù)

  1232. void init()

  1233. {      



  1234.        uchar i;

  1235.        lcden=0;

  1236.        write_com(0x38);                                        //打開(kāi)顯示模式設(shè)置

  1237.        write_com(0x0c);                                        //打開(kāi)顯示,光標(biāo)等等設(shè)置未零

  1238.        write_com(0x06);                                        //當(dāng)讀或?qū)懸粋(gè)字符后地址指針加一,且光標(biāo)加一,當(dāng)寫(xiě)一個(gè)字符后整頻顯示左移,

  1239.        write_com(0x01);                                        //清零指令

  1240.        write_com(0x80);                                        //指針?biāo)肝恢?br />



  1241.        //定時(shí)器初始化

  1242.        TMOD=0x11;                                                       //T0,T1工作方式1

  1243.         TH0=(65536-2000)/256;

  1244.        TL0=(65536-2000)%256;                                //T0初始化2MS



  1245.        TH1=(65536-50000)/256;

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



  1247.        TR1=0;

  1248.        ET1=1;

  1249.        EA=1;

  1250.        TR0=0;

  1251.        ET0=1;



  1252.        count0=0;                                                       //初始沒(méi)有密碼輸入,故為零

  1253.        enterflag=0;                                               //沒(méi)有確認(rèn)鍵按下

  1254.        mimaflag=0;                                                       //密碼正確與否鍵先置零



  1255.        red=1;                                                               //紅燈不亮

  1256. //************密碼存入EPROM中**********************************

  1257.        sda=1;

  1258.        delay(5);

  1259.        scl=1;

  1260.        delay(5);

  1261.        for(i=0;i<8;i++)

  1262.        {

  1263.                 write_add(i,8);

  1264.                 delay2(100);

  1265.        }

  1266.        for(i=0;i<8;i++)

  1267.        {

  1268.                 mima[ i]=read_add(i);
  1269. [ i]
  1270.                 delay(5);

  1271.        }



  1272. }

  1273. void main()

  1274. {       rw=0;               

  1275.        init();

  1276.        write_com(0x80);                                               //指針?biāo)肝恢?br />

  1277.        for(count3=0;count3<16;count3++)

  1278.        {

  1279.                write_date(table1[count3]);                //第一行顯示INPUTTHE PASSPORD:

  1280.                 delay(5);

  1281.        }

  1282.        write_com(0x80+0x40);

  1283.        for(count3=0;count3<16;count3++)

  1284.        {

  1285.                write_date(table2[count3]);                //開(kāi)機(jī)顯示FFFFFFFF

  1286.                 delay(5);

  1287.        }

  1288.        while(1)

  1289.        {

  1290.                 key_scan();                                                     //調(diào)用鍵盤(pán)掃描函數(shù)

  1291.                 lcd_display();

  1292.        }



  1293. }

  1294. //**************************************************鍵盤(pán)掃描函數(shù)開(kāi)始********************************

  1295. void key_scan()

  1296. {

  1297. //**********掃描第一行*********

  1298. P1=0xfe;

  1299. temp=P1;

  1300. temp=temp&0xf0;

  1301. if(temp!=0xf0)

  1302. {

  1303. delay(100);

  1304. if(temp!=0xf0)

  1305. {

  1306. temp=P1;

  1307. switch(temp)

  1308. {

  1309. case 0xee:

  1310. key_manage1();

  1311. break;



  1312. case 0xde:

  1313. key_manage2();

  1314. break;



  1315. case 0xbe:

  1316. key_manage3();

  1317. break;



  1318. case 0x7e:

  1319. key_manage4();

  1320. break;

  1321. }

  1322. while(temp!=0xf0)

  1323. {

  1324. temp=P1;

  1325. temp=temp&0xf0;

  1326. }

  1327. }

  1328. }

  1329. //**************************************************掃描第二行***********************************

  1330. P1=0xfd;

  1331. temp=P1;

  1332. temp=temp&0xf0;

  1333. if(temp!=0xf0)

  1334. {

  1335. delay(100);

  1336. if(temp!=0xf0)

  1337. {

  1338. temp=P1;

  1339. switch(temp)

  1340. {

  1341. case 0xed:

  1342. key_manage5();

  1343. break;



  1344. case 0xdd:

  1345. key_manage6();

  1346. break;



  1347. case 0xbd:

  1348. key_manage7();

  1349. break;



  1350. case 0x7d:

  1351. key_manage8();

  1352. break;

  1353. }

  1354. while(temp!=0xf0)

  1355. {

  1356. temp=P1;

  1357. temp=temp&0xf0;

  1358. }

  1359. }

  1360. }

  1361. //*********************************************掃描第三行***********************************

  1362. P1=0xfb;

  1363. temp=P1;

  1364. temp=temp&0xf0;

  1365. if(temp!=0xf0)

  1366. {

  1367. delay(100);

  1368. if(temp!=0xf0)

  1369. {

  1370. temp=P1;

  1371. switch(temp)

  1372. {

  1373. case 0xeb:

  1374. key_manage9();

  1375. break;



  1376. case 0xdb:

  1377. key_manage10();

  1378. break;



  1379. case 0xbb:

  1380. key_manage11();

  1381. break;



  1382. case 0x7b:

  1383. key_manage12();

  1384. break;

  1385. }

  1386. while(temp!=0xf0)

  1387. {

  1388. temp=P1;

  1389. temp=temp&0xf0;

  1390. }

  1391. }

  1392. }



  1393. //***************************************************掃描第四行****************************************

  1394. P1=0xf7;

  1395. temp=P1;

  1396. temp=temp&0xf0;

  1397. if(temp!=0xf0)

  1398. {

  1399. delay(100);

  1400. if(temp!=0xf0)

  1401. {

  1402. temp=P1;

  1403. switch(temp)

  1404. {

  1405. case 0xe7:

  1406. key_manage13();

  1407. break;



  1408. case 0xd7:

  1409. key_manage14();

  1410. break;



  1411. case 0xb7:

  1412. key_manage15();

  1413. break;



  1414. case 0x77:

  1415. key_manage16();

  1416. break;

  1417. }

  1418. while(temp!=0xf0)

  1419. {

  1420. temp=P1;

  1421. temp=temp&0xf0;

  1422. }

  1423. }

  1424. }

  1425. }

復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:421848 發(fā)表于 2018-11-6 16:50 | 只看該作者
你厲害+++

回復(fù)

使用道具 舉報(bào)

板凳
ID:254123 發(fā)表于 2018-11-7 12:57 | 只看該作者
大佬大佬
回復(fù)

使用道具 舉報(bào)

地板
ID:287482 發(fā)表于 2018-11-25 10:57 | 只看該作者
大佬可以發(fā)一張高清點(diǎn)的原理圖嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:467935 發(fā)表于 2019-1-14 14:53 | 只看該作者
能發(fā)清晰一點(diǎn)的原理圖嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区视频 | 男人电影天堂 | 日韩一区二区三区在线视频 | 中文字幕在线视频网站 | 国产成人免费视频网站视频社区 | 99久久中文字幕三级久久日本 | 在线视频日韩精品 | 精品久久香蕉国产线看观看亚洲 | 国产日韩一区二区三免费 | 日韩综合 | 欧美激情久久久 | 亚洲一二视频 | 91视频大全 | www.99热| 午夜视频网站 | 久艹av | 亚洲高清视频一区二区 | 亚洲第一视频网站 | 中文字幕 在线观看 | 99一区二区| 久久精品国产久精国产 | 瑟瑟免费视频 | 精品久久久久久亚洲综合网 | 九九热在线观看视频 | 成人免费在线视频 | 国产欧美精品一区二区色综合朱莉 | 少妇久久久 | 一本一道久久a久久精品蜜桃 | 欧洲免费毛片 | 久久综合久久久 | 日韩免费毛片视频 | 国产午夜高清 | 久久夜夜 | 成人影院一区二区三区 | 四虎影院免费在线 | 国产成人精品一区二区三区 | 一区二区视频在线观看 | 日韩午夜电影在线观看 | 天堂久久天堂综合色 | 精品一区二区三区在线观看 | 国产精品久久国产精品 |