標題: 51單片機的電子密碼鎖(功能和手機的解鎖一樣 12864顯示 沒有用AT24c02 電路很簡單) [打印本頁]

作者: NB沒B    時間: 2014-8-31 16:05
標題: 51單片機的電子密碼鎖(功能和手機的解鎖一樣 12864顯示 沒有用AT24c02 電路很簡單)
  1. #include<stc12.h>                //頭文件我用的(stc12c5a60s2)
  2. #define uint unsigned int                                                                  //
  3. #define uchar unsigned char                                                                  //
  4. uint k,num,a,b,c,s;        //num數(shù)據(jù)顯示的位置 abc用于跳出while()循環(huán) s數(shù)據(jù)輸錯的次數(shù)
  5. uchar code table1[12]={"0123456789*"};                                          //
  6. uchar code table2[]={"請輸入密碼:"};                                          //
  7. uchar code table3[]={"密碼證確!"};        //因為我的12864顯示“正”亂碼于是就用“證”
  8. uchar code table4[]={"密碼錯誤!"};                                                 //
  9. uchar code table5[]={"還有"};                                                         //
  10. uchar code table6[]={"請輸入當前密碼:"};                                         //
  11. uchar code table7[]={"修改后的密碼:"};
  12. uchar code table8[]={"次機會"};
  13. uchar code table9[]={"系統(tǒng)已經(jīng)鎖死"};                                                        //
  14. uint Cipher1[5];                        //儲存你所輸入的數(shù)據(jù)                                                        
  15. uint Cipher2[5]={0,1,2,3,4,};//儲存密碼(初始密碼123)                                                   
  16.                                                                                                            
  17. sbit LCD_RS=P1^0;        // 數(shù)據(jù)/命令選擇端                     
  18. sbit LCD_RW=P1^1;        // 讀寫選擇端                           
  19. sbit LCD_EN=P1^2;        // 使能信號                                    
  20. sbit LCD_PSB=P1^6;           // 并/串選擇                                   
  21. sbit beep=P3^1;                                                                                 
  22.                                                                                                          
  23. void shaomiao();                                                                         //矩陣鍵盤掃描
  24. void delay(uint);                                                                        // 延時函數(shù)
  25. void lcd_init();                                                                        // 12864初始化
  26. void write_cmd(uchar);                                                                //
  27. void write_dat(uchar);                                                                //
  28. void lcd_pos(uchar,char);                                                         //
  29. void show();                                                                                // 在12864上顯示
  30.                                                                                                    //
  31. void main()                                                                                   //
  32. {        
  33.         s=5;                                                                                //輸錯密碼次數(shù)
  34.         lcd_init();                                                                          //
  35.         while(1)                                                                         //
  36.         {                                                                                         //
  37.          show();                                                                         //
  38.          shaomiao();                                                                 //
  39.         }                                                                                         //
  40. }                                                                                                 //
  41.                                                                                                 //
  42. void show()                                                                                //
  43. {        uint i,m;                                                                        //
  44.         m=0;                                                                                //
  45.         lcd_pos(0,0);                                                                //
  46.         i=0;                                                                                //
  47.         while(table2[i]!='\0')                                                //
  48.          {write_dat(table2[i]);i++;}                                //
  49.         shaomiao();                                                                        //
  50.         if(num>0)                                                                        // 輸入密碼
  51.          {                                                                                        //
  52.                 lcd_pos(1,num-1);                                                //
  53.                 write_dat(table1[k]);                                        //
  54.                 Cipher1[num]=k;
  55.          }                                                                                   //刪除上一個數(shù)據(jù)
  56.          if(b==1)
  57.          {
  58.                  lcd_pos(1,num-1);
  59.                 write_dat('\0');
  60.                 num--;
  61.                 k=Cipher1[num];
  62.                 b=0;
  63.                 while(num<1) {shaomiao();b=0;}
  64.         }
  65. //        while(num>2) {num=3;shaomiao();if(c==1) m=4;if(m==4){c=0;break;}}

  66.         while(c==1)                                 //判斷密碼是否正確
  67.         {
  68.                 for(i=0;i<8;i++)
  69.                  {lcd_pos(0,i);write_dat(table1[11]);lcd_pos(1,i);write_dat(table1[11]);}
  70.                    while((Cipher1[1]==Cipher2[1])&(Cipher1[2]==Cipher2[2])&(Cipher1[3]==Cipher2[3]))
  71.                 {        
  72.                         c=0;s=5;
  73.                         shaomiao();
  74.                         lcd_pos(0,0);
  75.                         i=0;
  76.                         while(table3[i]!='\0')
  77.                          {write_dat(table3[i]);i++;}
  78.                         if(c==1) {m=3;Cipher1[1]=Cipher1[2]=Cipher1[3]='\0';break;}
  79.                 }
  80.                 if(m!=3)
  81.                 {
  82.                         s--;
  83.                         while(!((Cipher1[1]==Cipher2[1])&(Cipher1[2]==Cipher2[2])&(Cipher1[3]==Cipher2[3])))
  84.                          {
  85.                                  c=0;beep=0;delay(500);
  86.                                 shaomiao();
  87.                                 lcd_pos(0,0);
  88.                                 i=0;
  89.                                 while(table5[i]!='\0')
  90.                                   {write_dat(table5[i]);i++;}
  91.                                 lcd_pos(0,2);
  92.                                 write_dat(table1[s]);
  93.                                 write_dat('\0');
  94.                                 lcd_pos(0,3);
  95.                                 i=0;
  96.                                 while(table8[i]!='\0')
  97.                                   {write_dat(table8[i]);i++;}
  98.                                 while(s<1)
  99.                                 {        lcd_pos(0,0);i=0;
  100.                                         while(table9[i]!='\0')
  101.                                           {write_dat(table9[i]);i++;}
  102.                                 }
  103.                                 if(c==1) {m=4;break;}
  104.                          }
  105.                 }
  106.                 if(m==3|m==4) {a=0;b=0;c=0;num=0;}
  107.         }
  108.         
  109.          while(a==1)                                //修改密碼
  110.          {        num=0;
  111.                  for(i=0;i<8;i++)
  112.                  {lcd_pos(1,i);write_dat(table1[11]);}
  113.                 lcd_pos(0,0);
  114.                 i=0;
  115.                 while(table6[i]!='\0')
  116.                   {write_dat(table6[i]);i++;}
  117.                 shaomiao();
  118.                 while(num>0)                                        //輸入當前密碼正確后才可以修改
  119.                  {        shaomiao();
  120.                         lcd_pos(1,num-1);
  121.                         write_dat(table1[k]);
  122.                         Cipher1[num]=k;
  123.                         if(b==1)
  124.                          {
  125.                                  lcd_pos(1,num-1);
  126.                                 write_dat(table1[11]);
  127.                                 num--;
  128.                                 k=Cipher1[num];
  129.                                 b=0;
  130.                          }         
  131.                         while(c==1)
  132.                         {        
  133.                                 num=0;
  134.                                 shaomiao();
  135.                                 for(i=0;i<8;i++)
  136.                                  {lcd_pos(0,i);write_dat(table1[11]);lcd_pos(1,i);write_dat(table1[11]);}
  137.                                 while((Cipher1[1]==Cipher2[1])&(Cipher1[2]==Cipher2[2])&(Cipher1[3]==Cipher2[3]))
  138.                                 {         
  139.                                         c=0;s=5;
  140.                                         lcd_pos(0,0);
  141.                                         i=0;
  142.                                         while(table7[i]!='\0')
  143.                                           {write_dat(table7[i]);i++;}
  144.                                         shaomiao();
  145.                                         while(num>0)
  146.                                          {
  147.                                                 shaomiao();
  148.                                                 lcd_pos(1,num-1);
  149.                                                 write_dat(table1[10]);
  150.                                                 Cipher2[num]=k;
  151.                                                  if(b==1)
  152.                                                  {
  153.                                                  lcd_pos(1,num-1);
  154.                                                 write_dat(table1[11]);
  155.                                                 num--;
  156.                                                 b=0;
  157.                                                 }
  158.                                                 while(num<1) {shaomiao();b=0;}
  159.                                                 m=1;
  160.                                                 if(c==1) break;
  161.                                         }
  162.                                         if(m==1)
  163.                                         {        a=0;b=0;c=0;num=0;
  164.                                                 for(i=0;i<8;i++)
  165.                                                  {lcd_pos(0,i);write_dat(table1[11]);lcd_pos(1,i);write_dat(table1[11]);}
  166.                                         }
  167.                                 }
  168.                                 if(m!=1)
  169.                                 {        s--;
  170.                                         while(!((Cipher1[1]==Cipher2[1])&(Cipher1[2]==Cipher2[2])&(Cipher1[3]==Cipher2[3])))
  171.                                         {
  172.                                                 c=0;
  173.                                                 beep=0;delay(500);
  174.                                                 shaomiao();
  175.                                                 lcd_pos(0,0);
  176.                                                 i=0;
  177.                                                 while(table5[i]!='\0')
  178.                                                   {write_dat(table5[i]);i++;}
  179.                                                 lcd_pos(0,2);
  180.                                                 write_dat(table1[s]);
  181.                                                 write_dat('\0');
  182.                                                 lcd_pos(0,3);
  183.                                                 i=0;
  184.                                                 while(table8[i]!='\0')
  185.                                                   {write_dat(table8[i]);i++;}
  186.                                                 while(s<1)                                            //輸錯5次鎖死系統(tǒng)
  187.                                                 {        
  188.                                                         lcd_pos(0,0);i=0;
  189.                                                         while(table9[i]!='\0')
  190.                                                           {write_dat(table9[i]);i++;}
  191.                                                 }
  192.                                                 m=2;
  193.                                                 if(c==1) break;
  194.                                         }
  195.                                 }
  196.                         if(m==1|m==2) c=0;
  197.                         }
  198.                 }
  199.          }
  200. }
  201. //寫指令數(shù)據(jù)到LCD
  202. void write_cmd(char cmd)
  203. {
  204.         LCD_RS=0;
  205.         LCD_RW=0;
  206.         LCD_EN=0;
  207.         P0=cmd;         
  208.         delay(5);
  209.         LCD_EN=1;
  210.         delay(5);
  211.         LCD_EN=0;
  212. }
  213. //寫顯示數(shù)據(jù)到LCD
  214. void write_dat(char dat)
  215. {
  216.         LCD_RS=1;
  217.         LCD_RW=0;
  218.         LCD_EN=0;
  219.         P0=dat;
  220.         delay(5);
  221.         LCD_EN=1;
  222.         delay(5);
  223.         LCD_EN=0;        
  224. }
  225. //設(shè)定顯示位置
  226. void lcd_pos(char x,char y)
  227. {
  228.         uchar pos;
  229.         if(x==0)
  230.         {x=0x80;}
  231.         else if(x==1)
  232.         {x=0x90;}
  233.         else if(x==2)
  234.         {x=0x88;}
  235.         else if(x==3)
  236.         {x=0x98;}
  237.         pos=x+y;
  238.         write_cmd(pos);    //顯示的地址
  239. }
  240. //12864初始化
  241. void lcd_init()//12864初始化
  242. {
  243.         LCD_PSB=1;                                //并口模式
  244.         write_cmd(0x30);                //基本指令操作
  245.         delay(5);
  246.         write_cmd(0x0c);                //顯示開,光標關(guān)
  247.         delay(5);
  248.         write_cmd(0x01);                //消除所有顯示
  249.         delay(5);
  250. }

  251. void shaomiao()
  252. {
  253.         uchar t;
  254.         P3=0xdf;
  255.         t=P3;
  256.         t=t&0x1c;
  257.         if(t!=0x1c)
  258.         {
  259.                 delay(10);
  260.                 t=P3;
  261.                 t=t&0x1c;
  262.                 if(t!=0x1c)
  263.                  {
  264.                          t=P3;
  265.                         switch(t)
  266.                         {
  267.                                 case 0xdb:k=1;num++;break;
  268.                                 case 0xd7:k=2;num++;break;
  269.                                 case 0xcf:k=3;num++;break;
  270.                                 default:  break;
  271.                         }
  272.                         while(t!=0x1c)
  273.                         {
  274.                                 t=P3;
  275.                                 t=t&0x1c;
  276.                         }
  277.                  }
  278.         }
  279.         P3=0xbf;
  280.         t=P3;
  281.         t=t&0x1c;
  282.         if(t!=0x1c)
  283.         {
  284.                 delay(10);
  285.                 t=P3;
  286.                 t=t&0x1c;
  287.                 if(t!=0x1c)
  288.                  {
  289.                          t=P3;
  290.                         switch(t)
  291.                         {
  292.                                 case 0xbb:a=1;break;
  293.                                 case 0xb7:b=1;break;
  294.                                 case 0xaf:c=1;break;
  295.                                 default:  break;
  296.                         }
  297.                         while(t!=0x1c)
  298.                         {
  299.                                 t=P3;
  300.                                 t=t&0x1c;
  301.                         }
  302.                  }
  303.         }        
  304. }
  305. void delay(uint z)
  306. {
  307.         uint x,y;
  308.         for(x=z;x>0;x--)
  309.          for(y=110;y>0;y--);
  310. } [/hide]因為我的單片機的矩陣鍵盤只有六個鍵 于是上面的三個作為數(shù)據(jù)  下面三個一個是修改密碼 ,清除鍵 ,確定鍵 功能和手機的解鎖功能一樣
  311. #include<stc12.h>  //頭文件我用的(stc12c5a60s2)
  312. #define uint unsigned int          //
  313. #define uchar unsigned char          //
  314. uint k,num,a,b,c,s; //num數(shù)據(jù)顯示的位置 abc用于跳出while()循環(huán) s數(shù)據(jù)輸錯的次數(shù)
  315. uchar code table1[12]={"0123456789*"};       //
  316. uchar code table2[]={"請輸入密碼:"};       //
  317. uchar code table3[]={"密碼證確!"}; //因為我的12864顯示“正”亂碼于是就用“證”
  318. uchar code table4[]={"密碼錯誤!"};       //
  319. uchar code table5[]={"還有"};        //
  320. uchar code table6[]={"請輸入當前密碼:"};      //
  321. uchar code table7[]={"修改后的密碼:"};
  322. uchar code table8[]={"次機會"};
  323. uchar code table9[]={"系統(tǒng)已經(jīng)鎖死"};       //
  324. uint Cipher1[5];   //儲存你所輸入的數(shù)據(jù)      
  325. uint Cipher2[5]={0,1,2,3,4,};//儲存密碼(初始密碼123)         
  326.                
  327. sbit LCD_RS=P1^0;        // 數(shù)據(jù)/命令選擇端        
  328. sbit LCD_RW=P1^1;        // 讀寫選擇端      
  329. sbit LCD_EN=P1^2;        // 使能信號        
  330. sbit LCD_PSB=P1^6;    // 并/串選擇      
  331. sbit beep=P3^1;           
  332.               
  333. void shaomiao();          //矩陣鍵盤掃描
  334. void delay(uint);         // 延時函數(shù)
  335. void lcd_init();         // 12864初始化
  336. void write_cmd(uchar);        //
  337. void write_dat(uchar);        //
  338. void lcd_pos(uchar,char);        //
  339. void show();          // 在12864上顯示
  340.                //
  341. void main()             //
  342. {
  343. s=5;          //輸錯密碼次數(shù)
  344. lcd_init();           //
  345. while(1)          //
  346. {            //
  347.   show();          //
  348.   shaomiao();         //
  349. }            //
  350. }
  351. //部分代碼
復(fù)制代碼

電子密碼鎖.zip

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

大家如果感覺好就給點分


作者: hujia    時間: 2014-8-31 16:42
根據(jù)io接好就行吧,,問下 12864 是帶字庫的嗎? 什么驅(qū)動芯片的12864液晶?
作者: liuz    時間: 2014-8-31 16:45
果然很給力啊   要是有圖就好了
作者: daliu    時間: 2014-8-31 16:48
同求 12864液晶的型號???
作者: NB沒B    時間: 2014-8-31 19:56
hujia 發(fā)表于 2014-8-31 16:42
根據(jù)io接好就行吧,,問下 12864 是帶字庫的嗎? 什么驅(qū)動芯片的12864液晶?

帶字庫的
作者: NB沒B    時間: 2014-8-31 19:56
daliu 發(fā)表于 2014-8-31 16:48
同求 12864液晶的型號???

QC pass
作者: NB沒B    時間: 2014-8-31 19:57
liuz 發(fā)表于 2014-8-31 16:45
果然很給力啊   要是有圖就好了

根據(jù)I/O就知道大概原理圖了  就用到矩陣鍵盤和12864
作者: 愛德華    時間: 2014-9-1 13:03
贊一個
作者: 937166474    時間: 2014-9-1 21:16
看起來很牛的樣子,新人學習

作者: wangyin    時間: 2014-9-2 01:26
牛人大作啊 值得仔細研讀.
作者: 瑞雪    時間: 2014-9-14 21:34
學習學習
作者: hmc999    時間: 2014-9-21 20:18
學習了
作者: 愛睡覺的壞蛋    時間: 2014-9-29 18:07
有沒有成品?
作者: NB沒B    時間: 2014-9-30 14:28
愛睡覺的壞蛋 發(fā)表于 2014-9-29 18:07
有沒有成品?

拆了!
作者: keepit    時間: 2014-10-6 10:02
謝謝分享
作者: snailgg    時間: 2014-10-8 15:40
點個贊。
作者: j爺33    時間: 2014-10-8 21:37
看哈有成果沒有
作者: yxz1140    時間: 2014-10-11 14:17
不錯不錯~~~~~good!
作者: jst    時間: 2014-10-11 22:42
新人學習
作者: 永康電器    時間: 2014-10-11 22:58
來看看,學習了。
作者: T29    時間: 2014-10-16 01:52
很好  學習  謝謝
作者: 哎呀愛啊    時間: 2014-10-19 09:25
要是有圖就好了
作者: sumissqin    時間: 2014-10-19 13:38
學習下
作者: youshen800    時間: 2014-10-20 10:13
很好很強大
作者: mazujian    時間: 2014-10-21 11:47
好好 好 好  好 好 好 好 好
作者: dxtqwe    時間: 2014-11-3 09:30
贊一個
作者: ZCY    時間: 2014-11-6 12:45
我是新加入的,想下點東西但是M幣不夠,想問下怎樣可以獲得M幣啊?求指教
作者: bolangqianjiang    時間: 2014-11-10 16:22
非常感謝樓主!
作者: jsyywf    時間: 2014-11-12 23:03
好東西,謝謝分享
作者: 蒼狼嘯月    時間: 2014-11-20 19:59
看看               
作者: 漣漪    時間: 2014-11-29 09:01
看看                             
作者: cyoung    時間: 2014-12-1 12:10
PCBPCBPCBPCB
作者: zhushiyao    時間: 2014-12-1 19:32
謝謝分享       收下了
作者: singless    時間: 2014-12-1 22:29
樓主掉啊
作者: 風緣    時間: 2014-12-8 14:09
進來逛逛。。。。。。。。。
作者: 中奧ol    時間: 2014-12-18 17:30
學習一下
作者: 13991747576    時間: 2014-12-19 16:19
不錯開始學習

作者: tianyin    時間: 2015-1-8 23:59
贊一個
作者: Glsstone824    時間: 2015-1-9 01:00
不用at24c02,修改密碼后怎么掉電存儲
作者: Kirby    時間: 2015-1-9 21:57

很好  學習  謝謝
作者: WADZB    時間: 2015-1-13 16:42
非常好
作者: liusuifeng    時間: 2015-1-13 18:35
謝謝樓主的分享!
作者: fzg63031525    時間: 2015-1-14 10:59
看看呢,學習一下!               
作者: 會飛的魚32    時間: 2015-1-15 19:13
不錯!。。。。。。。。。!
作者: hnjzyqf    時間: 2015-1-22 23:29
學習一下,謝謝!
作者: delay    時間: 2015-1-23 14:53
好東西,研究研究
作者: xyz1015231411    時間: 2015-1-28 13:01
不錯,值得學習。
作者: xyz1015231411    時間: 2015-1-28 13:03
不錯,值得學習。
作者: xiejiaxiao    時間: 2015-1-29 11:19
謝謝分享
作者: woaidpj    時間: 2015-1-29 12:24
好,我來也
作者: 小青春    時間: 2015-1-29 14:23
看一看                           
作者: xudaxi    時間: 2015-3-20 10:10
,,,,,,學學
作者: zjjhy053341    時間: 2015-3-21 16:40

作者: a15274555994    時間: 2015-3-21 17:23
謝謝樓主共享!~
作者: a15274555994    時間: 2015-3-21 17:24
不錯的資料~!
作者: smhacker    時間: 2015-4-8 00:23
多謝樓主分享!
作者: x327028539    時間: 2015-4-21 18:04
太棒了
作者: 電子密碼鎖設(shè)計    時間: 2015-4-22 15:24
學習學習
作者: program    時間: 2015-4-23 23:50

作者: 佼佼の者    時間: 2015-4-25 16:15
贊。。。。。。。。。。
作者: ruiian    時間: 2015-4-28 16:09
謝謝分享
作者: ruiian    時間: 2015-4-28 16:10
謝謝分享
作者: 727802492    時間: 2015-5-4 23:01
牛人大作啊 值得仔細研讀.
作者: SDAH    時間: 2015-5-14 10:10
讚讚


作者: leichyi    時間: 2015-5-16 16:09
學習學習
作者: tajasn    時間: 2015-5-19 13:48
樓主東西幫助挺大的
作者: 飛雪    時間: 2015-5-20 15:26
學習了
作者: 牽只羊    時間: 2015-5-28 14:25
也想做一個
作者: youhengchao    時間: 2015-11-28 20:33
看看啊
作者: ludaijin    時間: 2015-12-7 14:25
樓主頂一個
作者: 丿神殤丶    時間: 2016-6-17 22:49
好東西,謝謝樓主分享、
作者: qiyezao    時間: 2016-7-1 13:45

好東西,謝謝分享
作者: lxsamazing    時間: 2016-7-4 10:05
zhichiyixa
作者: youchuang    時間: 2016-9-8 00:04
有圖就更好了
作者: youchuang    時間: 2016-9-8 00:09
編譯報錯:電子密碼鎖.C(281): error C202: 'P3': undefined identifier

作者: 愛喝可樂    時間: 2016-9-17 10:27
學習了
作者: 唐開栩    時間: 2016-11-15 22:57
想看看這個和我想找的一樣不
作者: dj3365191    時間: 2016-11-16 13:10
密碼解鎖吧
作者: 烈火2016    時間: 2016-11-28 16:12
學習了,謝謝分享。。。。
作者: 烈火2016    時間: 2016-11-28 16:15
Glsstone824 發(fā)表于 2015-1-9 01:00
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

在主程序里改密碼,然后重新燒程序就可以了
作者: 炳文    時間: 2016-12-3 09:31
看起來很牛的樣子
作者: lern01    時間: 2017-3-18 20:40
學習學習,不錯!

作者: chenwg    時間: 2017-3-19 20:27
非常感謝樓主分享
作者: 茶園居士    時間: 2017-3-19 23:00
謝謝分享,學習學習!
作者: 13118302007    時間: 2017-4-13 21:41
看看這個怎么樣
作者: 黑黑—坤    時間: 2017-4-15 23:27
謝謝分享
作者: HAIMING    時間: 2017-4-21 14:35
等待看一下
作者: hjyanbin    時間: 2017-5-3 10:17
看起來不錯的樣子
作者: LWSZ    時間: 2017-5-20 09:47
贊一個
作者: 楓葉連天    時間: 2017-6-20 23:45
學習一下好做作業(yè)
作者: 李小熊    時間: 2017-7-6 14:23
值得學習
作者: JuYan    時間: 2017-7-6 16:26
學習學習~謝謝樓主分享
作者: sekaku    時間: 2017-7-7 08:20
樓主應(yīng)該根據(jù)大家的建議大致畫個電路圖啊,我們小白看不懂啊,這樣給了黑幣下來也沒有用啊,
作者: king_zxt    時間: 2017-7-8 14:57
很給力,學習一下。
作者: 張紀元    時間: 2017-7-15 15:22
怎么要回復(fù)才可以看?
作者: easee    時間: 2017-7-22 10:35
厲害了word 哥
作者: meilidianzhi    時間: 2017-8-7 19:37
謝謝你的共享

作者: coldfire    時間: 2018-5-10 20:43
謝謝樓主分享
作者: dragon19790000    時間: 2018-5-13 10:54
學習一下!。。。。。。。。。。
作者: chen0108    時間: 2018-5-14 15:30
用什么顯示屏?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1