欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個(gè)一個(gè)單片機(jī)密碼鎖程序請教這里面的密碼是怎樣的設(shè)置的?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:362792 發(fā)表于 2019-11-10 13:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. /***************************************************************
  2. 此程序是在電子密碼鎖的基礎(chǔ)上增加的紅外遙控功能
  3. 采用STC89C52單片機(jī)
  4. 外中斷口P3.2為紅外接收頭接口
  5. 紅外和鍵盤兩種模式轉(zhuǎn)換用P2.3控制,0為鍵盤模式,1為紅外輸入
  6. 遙控器使用常用的HT6122核心的
  7. 液晶用1602         引腳定義在I2C_drive.h中
  8. 存儲(chǔ)器采用的24C04 引腳定義在I2C_drive.h中
  9. P1口接4X4矩陣按鍵
  10. ****************************************************************/
  11. #include<reg52.h>
  12. #include <string.h>
  13. #include "I2C_drive.h"                        //包含I2C總線驅(qū)動(dòng)程序軟件包
  14. #include "LCD_drive.h"                        //包含I2C總線驅(qū)動(dòng)程序軟件包
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17. uchar code_buf[6];                                //存儲(chǔ)器密碼緩沖區(qū)
  18. uchar incode_buf[6];                                //輸入密碼緩沖區(qū)
  19. uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]為用戶碼低位、用戶碼高位接收緩沖區(qū)
  20.                                                 // IR_buf[2]、IR_buf[3]為鍵數(shù)據(jù)碼和鍵數(shù)據(jù)碼反碼接收緩沖區(qū)
  21. uchar  key;                               //鍵順序碼
  22. uchar  temp;                                        //暫存
  23. sbit  BEEP=P1^5;                                //蜂鳴器
  24. sbit  RELAY=P3^6;                                //繼電器
  25. sbit IRIN = P3^2;                         //遙控輸入腳   紅外
  26. sbit panduan=P2^3;         //紅外,鍵盤轉(zhuǎn)換引腳,接地為鍵盤模式,懸空為紅外模式

  27. uchar count_5ms,sec;                                //5ms和1s計(jì)數(shù)器
  28. bit flag_2s=0;                                        //2s標(biāo)志位,2s時(shí)間到,該位置1
  29. bit flag_comp=0;                                //比較對錯(cuò)標(biāo)志位,比較正確,該標(biāo)志位置1
  30. bit biaozhi=0;
  31. bit hongwai=1;
  32. bit jianpan=1;
  33. /******************************************************************************/
  34. void Delay(int num){//延時(shí)函數(shù)
  35.         while(num--) ;
  36. }        



  37. void  beep(){//-揚(yáng)聲器--按鍵音
  38.         unsigned char a;//定義變量用于發(fā)聲的長度設(shè)置
  39.         for(a=100;a>0;a--){//聲音的長度
  40.                 BEEP = ~BEEP;
  41.                 Delay(50);//音調(diào)設(shè)置延時(shí)
  42.         }
  43.         BEEP = 1;//音樂結(jié)束后揚(yáng)聲器拉高關(guān)閉
  44. }               
  45. /********以下是0.14ms的x倍延時(shí)函數(shù)********/
  46. void delayy(uchar x)            //延時(shí)x*0.14ms
  47. {
  48. uchar i;
  49. while(x--)
  50.    for (i = 0; i<13; i++);
  51. }
  52. /********以下是矩陣按鍵掃描函數(shù)********/
  53. void  MatrixKey()
  54. {
  55.         P1=0xff;                                
  56.         P1=0xef;                                //置第1行P1.4為低電平,開始掃描第1行
  57.         temp=P1;                                //讀P1口按鍵
  58.         temp=temp & 0x0f;                        //判斷低4位是否有0,即判斷列線(P1.0~P1.3)是否有0
  59.         if (temp!=0x0f)                        //若temp不等于0x0f,說明有鍵按下
  60.         {
  61.                 Delay_ms(20);                //延時(shí)10ms去抖               
  62.                 temp=P1;                        //再讀取P1口按鍵
  63.                 temp=temp & 0x0f;                //再判斷列線(P1.0~P1.3)是否有0
  64.                 if (temp!=0x0f)                //若temp不等于0x0f,說明確實(shí)有鍵按下
  65.                 {
  66.                         temp=P1;                        //讀取P1口按鍵,開始判斷鍵值
  67.                         biaozhi=1;
  68.                         hongwai=1;
  69.          jianpan=0;
  70.                         switch(temp)
  71.                         {
  72.                                 case 0xee:key=15;break;
  73.                                 case 0xed:key=14;break;
  74.                                 case 0xeb:key=13;break;
  75.                                 case 0xe7:key=12;break;
  76.                         }
  77.                         temp=P1;                        //將讀取的鍵值送temp
  78.                         beep();                        //蜂鳴器響一聲
  79.                         temp=temp & 0x0f;                //取出列線值(P1.0~P1.3)
  80.                         while(temp!=0x0f)                //若temp不等于0x0f,說明按鍵還沒有釋放,繼續(xù)等待
  81.                         {
  82.                   biaozhi=0;
  83.             jianpan=1;
  84.                                 temp=P1;                //若按鍵釋放,再讀取P1口
  85.                                 temp=temp & 0x0f;// 判斷列線(P1.0~P1.3)是否有0
  86.                         }
  87.                 }
  88.         }
  89.         P1=0xff;
  90.         P1=0xdf;                                        //置第2行P1.5為低電平,開始掃描第2行
  91.         temp=P1;
  92.         temp=temp & 0x0f;
  93.         if (temp!=0x0f)
  94.         {
  95.                 Delay_ms(20);        
  96.                 temp=P1;
  97.                 temp=temp & 0x0f;
  98.                 if (temp!=0x0f)
  99.                 {
  100.                         temp=P1;
  101.                         biaozhi=1;
  102.                                hongwai=1;
  103.                                          jianpan=0;
  104.                         switch(temp)
  105.                         {
  106.                                 case 0xde:key=11;break;
  107.                                 case 0xdd:key=10;break;
  108.                                 case 0xdb:key=9;break;
  109.                                 case 0xd7:key=8;break;
  110.                         }
  111.                         temp=P1;
  112.                         beep();
  113.                         temp=temp & 0x0f;
  114.                         while(temp!=0x0f)
  115.                         {
  116.                           biaozhi=0;
  117.                           jianpan=1;
  118.                           temp=P1;
  119.                           temp=temp & 0x0f;
  120.                         }
  121.                 }
  122.         }
  123.         P1=0xff;
  124.         P1=0xbf;                                                //置第3行P1.6為低電平,開始掃描第3行
  125.         temp=P1;
  126.         temp=temp & 0x0f;
  127.         if (temp!=0x0f)
  128.         {
  129.                 Delay_ms(20);        
  130.                 temp=P1;
  131.                 temp=temp & 0x0f;
  132.                 if (temp!=0x0f)
  133.                 {
  134.                         temp=P1;
  135.                         biaozhi=1;
  136.                          hongwai=1;
  137.                          jianpan=0;
  138.                         switch(temp)
  139.                         {
  140.                                 case 0xbe:key=7;break;
  141.                                 case 0xbd:key=6;break;
  142.                                 case 0xbb:key=5;break;
  143.                                 case 0xb7:key=4;break;
  144.                         }
  145.                         temp=P1;
  146.                         beep();
  147.                         temp=temp & 0x0f;
  148.                         while(temp!=0x0f)
  149.                         {
  150.                           biaozhi=0;
  151.                           jianpan=1;
  152.                                 temp=P1;
  153.                                 temp=temp & 0x0f;
  154.                         }
  155.                 }
  156.         }
  157.         P1=0xff;
  158.         P1=0x7f;                                        //置第4行P1.7為低電平,開始掃描第4行
  159.         temp=P1;
  160.         temp=temp & 0x0f;
  161.         if (temp!=0x0f)
  162.         {
  163.                 Delay_ms(20);
  164.                 temp=P1;
  165.                 temp=temp & 0x0f;
  166.                 if (temp!=0x0f)
  167.                 {
  168.                         temp=P1;
  169.                         biaozhi=1;
  170.          hongwai=1;
  171.                         jianpan=0;
  172.                         switch(temp)
  173.                         {
  174.                                 case 0x7e:key=3;break;
  175.                                 case 0x7d:key=2;break;
  176.                                 case 0x7b:key=1;break;
  177.                                 case 0x77:key=0;break;
  178.                         }
  179.                         temp=P1;
  180.                         beep();
  181.                         temp=temp & 0x0f;
  182.                         while(temp!=0x0f)
  183.                         {
  184.                           biaozhi=0;
  185.                           jianpan=1;
  186.                                 temp=P1;
  187.                                 temp=temp & 0x0f;
  188.                         }
  189.                 }
  190.         }
  191. }
  192. /*********************紅外按鍵矩陣函數(shù)*************************************************************************************************/
  193. void hongwaijvzhen ()
  194. {

  195.   if(hongwai==0)
  196.    {
  197.        switch (IR_buf[2]){
  198.                                                  case 0x16: key = 0 ;break;        //POWER        //ON                        
  199.                                                  case 0x0c: key = 1 ;break;        //MUTE //OFF
  200.                                                  case 0x18: key = 2 ;break;        //0-9鍵控制
  201.                                                  case 0x5e: key = 3 ;break;        //

  202.                                                  case 0x08: key = 4 ;break;                                       
  203.                                                  case 0x1c: key = 5 ;break;
  204.                                                  case 0x5a: key = 6 ;break;
  205.                                                  case 0x11: key = 7 ;break;

  206.                                                  case 0x52: key = 8 ;break;        
  207.                                                  case 0x4a: key = 9 ;break;        
  208.                                                  case 0x45: key = 10;break;        //A
  209.                                                  case 0x46: key = 11;break; //B
  210.                                                  case 0x47: key = 12;break;
  211.                                                  case 0x44: key = 13;break; //D
  212.                                                  case 0x40: key = 14;break; //#
  213.                                                  case 0x43: key = 15;break;
  214.                        }
  215.                                          biaozhi=0;
  216.                                          hongwai=1;

  217.      }

  218. }
  219. /********以下是開機(jī)畫面信息********/
  220. uchar code jianpan1_data[] = {"    << KEY >>   "};           //定義第1行顯示的字符                              
  221. uchar code jianpan2_data[] = {"   PATTERN(1)   "};                 //定義第2行顯示的字符  

  222. uchar code hongwai1_data[] = {"  << REMOTE >>  "};           //定義第1行顯示的字符                              
  223. uchar code hongwai2_data[] = {"   PATTERN(2)   "};                 //定義第2行顯示的字符  


  224. /***************************************/
  225. uchar code line1_data[] = {"   KEY  LOCK    "};           //定義第1行顯示的字符                              
  226. uchar code line2_data[] = {" MADE IN  CHINA  "};                 //定義第2行顯示的字符      
  227. /********以下是輸入密碼畫面信息********/
  228. uchar code in_line1[] = {"  PLEASE INPUT  "};           //定義第1行顯示的字符                              
  229. uchar code in_line2[] = {"PASSWORD:------ "};                 //定義第2行顯示的字符      
  230. /********以下是密碼輸入正確信息********/
  231. uchar code inok_line1[] = {"INPUT PASSWORD "};           //定義第1行顯示的字符                              
  232. uchar code inok_line2[] = {"   INOPUT OK    "};         //定義第2行顯示的字符  
  233. /********以下是密碼輸入錯(cuò)誤信息********/
  234. uchar code inerr_line1[] = {"INPUT PASSWORD "};           //定義第1行顯示的字符                              
  235. uchar code inerr_line2[] = {"   INPUT ERR    "};                 //定義第2行顯示的字符      
  236. /********以下是密碼設(shè)置畫面信息********/
  237. uchar code modify_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  238. uchar code modify_line2[] = {"PASSWORD:------ "};                 //定義第2行顯示的字符      
  239. /********以下是密碼設(shè)置正確信息********/
  240. uchar code setok_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  241. uchar code setok_line2[] = {"   MODIFY OK     "};                 //定義第2行顯示的字符      
  242. /********以下是開機(jī)畫面顯示函數(shù)********/
  243. void StartDisp()
  244. {
  245.         uchar i;
  246.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  247.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  248.           i = 0;                                                               
  249.           while(line1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  250.           {                             
  251.                   lcd_wdat(line1_data[i]);               //顯示第1行字符   
  252.                   i++;                               //指向下一字符                                         
  253.           }                                                                     
  254.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  255.           i = 0;                                                               
  256.           while(line2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  257.           {                                                                     
  258.                   lcd_wdat(line2_data[i]);               //顯示第2行字符   
  259.                    i++;                                       //指向下一字符
  260.         }
  261. }
  262. /********以下是密碼輸入畫面顯示函數(shù)********/
  263. void CodeInDisp()
  264. {
  265.         uchar i;
  266.         lcd_clr();                                          //調(diào)清屏函數(shù)
  267.         lcd_wcmd(0x00|0x80);                   //設(shè)置顯示位置為第1行第0列
  268.           i = 0;                                                               
  269.           while(in_line1[i] != '\0')              //若沒有到達(dá)第1行字符串尾部
  270.           {                             
  271.                   lcd_wdat(in_line1[i]);      //顯示第1行字符   
  272.                   i++;                     //指向下一字符                                         
  273.           }                                                                     
  274.           lcd_wcmd(0x40|0x80);          //設(shè)置顯示位置為第2行第0列            
  275.           i = 0;                                                               
  276.           while(in_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  277.           {                                                                     
  278.                   lcd_wdat(in_line2[i]);     //顯示第2行字符   
  279.                    i++;                               //指向下一字符
  280.         }
  281. }
  282. /********以下是密碼輸入錯(cuò)誤顯示函數(shù)********/
  283. void CodeInErr()
  284. {
  285.         uchar i;
  286.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  287.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  288.           i = 0;                                                               
  289.           while(inerr_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  290.           {                             
  291.                   lcd_wdat(inerr_line1[i]);       //顯示第1行字符   
  292.                   i++;                               //指向下一字符                                         
  293.           }                                                                     
  294.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  295.           i = 0;                                                               
  296.           while(inerr_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  297.           {                                                                     
  298.                   lcd_wdat(inerr_line2[i]);               //顯示第2行字符   
  299.                    i++;                                       //指向下一字符
  300.         }
  301. }
  302. /********以下是密碼輸入正確顯示函數(shù)********/
  303. void CodeInOk()
  304. {
  305.         uchar i;
  306.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  307.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  308.           i = 0;                                                               
  309.           while(inok_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  310.           {                             
  311.                   lcd_wdat(inok_line1[i]);       //顯示第1行字符   
  312.                   i++;                               //指向下一字符                                         
  313.           }                                                                     
  314.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  315.           i = 0;                                                               
  316.           while(inok_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  317.           {                                                                     
  318.                   lcd_wdat(inok_line2[i]);       //顯示第2行字符   
  319.                    i++;                                       //指向下一字符
  320.         }
  321. }
  322. /********以下是密碼設(shè)置畫面顯示函數(shù)********/
  323. void CodeSetDisp()
  324. {
  325.         uchar i;
  326.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  327.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  328.           i = 0;                                                               
  329.           while(modify_line1[i] != '\0')              //若沒有到達(dá)第1行字符串尾部
  330.           {                             
  331.                   lcd_wdat(modify_line1[i]);       //顯示第1行字符   
  332.                   i++;                               //指向下一字符                                         
  333.           }                                                                     
  334.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  335.           i = 0;                                                               
  336.           while(modify_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  337.           {                                                                     
  338.                   lcd_wdat(modify_line2[i]);       //顯示第2行字符   
  339.                    i++;                                       //指向下一字符
  340.         }
  341. }
  342. /********以下是密碼設(shè)置正確顯示函數(shù)********/
  343. void CodeSetOk()
  344. {
  345.         uchar i;
  346.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  347.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  348.           i = 0;                                                               
  349.           while(setok_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  350.           {                             
  351.                   lcd_wdat(setok_line1[i]);       //顯示第1行字符   
  352.                   i++;                               //指向下一字符                                         
  353.           }                                                                     
  354.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  355.           i = 0;                                                               
  356.           while(setok_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  357.           {                                                                     
  358.                   lcd_wdat(setok_line2[i]);       //顯示第2行字符   
  359.                    i++;                                       //指向下一字符
  360.         }
  361. }
  362. /********以下是密碼輸入函數(shù)********/
  363. void PassIn()
  364. {
  365.         static        uchar lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  366.         static         uchar count=0;                        //密碼計(jì)數(shù)器        ,注意是靜態(tài)局部變量
  367.         static uchar code_n=0;                        //密碼次數(shù)
  368. PASSWORD:

  369.       lcd_clr();                          //調(diào)清屏函數(shù)
  370.         CodeInDisp();//密碼輸入畫面函數(shù)
  371.         do{  
  372. /**********修改1***********/
  373.                 P1=0xf0;
  374.                 if(P1!=0xf0)                                //若有按鍵按下
  375.                 {
  376.                         MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)
  377.                         P1=0xf0;               
  378.                         while(P1!=0xf0);//等待按鍵松開
  379. /***************************/
  380.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  381.                         {
  382.                                 incode_buf[count]=key;        //將鍵值存入數(shù)組
  383.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  384.                                 lcd_wdat(0x2a);                           //顯示為"*",0x2a是"*"的LCD顯示碼
  385.                                         count++;                                //輸入下一位密碼
  386.                                         lcd_x++;                                //指向LCD的下一位置
  387.                                 }
  388.                         }
  389.                 }while(count<6);        //密碼設(shè)置為6位
  390.                 if(count>=6){count=0;lcd_x=0;}        
  391.                 if(memcmp(incode_buf,code_buf,6)==0)        //若兩個(gè)數(shù)組相等,則返回值為0,注意這里不能用strcmp函數(shù)進(jìn)行比較
  392.                 {
  393.                         CodeInOk();                                //若輸入的密碼正確,則顯示輸入正確的信息
  394.                         beep();beep();beep();                //輸入正確后,蜂鳴器響三聲
  395.                         flag_comp=1;                        //密碼比較標(biāo)志位置1
  396.                         code_n=0;                                //密碼計(jì)數(shù)器清0
  397.                         RELAY=0;                                //打開繼電器,開鎖
  398.                 }
  399.                 else if(memcmp(incode_buf,code_buf,6)!=0)//若輸入的密碼不正確
  400.                 {
  401.                         code_n++;                                //密碼計(jì)數(shù)器加1        
  402.                         if(code_n>=3)                        //有三次輸入的機(jī)會(huì)
  403.                         {
  404.                                 CodeInErr();                        //若三次輸入均錯(cuò)誤,顯示密碼錯(cuò)誤信息
  405.                                 flag_comp=0;                //密碼比較標(biāo)志位清0
  406.                                 code_n=0;                        //密碼計(jì)數(shù)器清0
  407.                         }
  408.                         else goto PASSWORD;                        //若還有機(jī)會(huì)輸入密碼,則跳轉(zhuǎn)到標(biāo)號(hào)PASSWORD處繼續(xù)輸入
  409.                 }        
  410. }
  411. /********以下是紅外線密碼輸入函數(shù)**********************************************************************************/

  412. void PassInhongwai()
  413. {
  414.         static        uchar lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  415.         static         uchar count=0;                        //密碼計(jì)數(shù)器        ,注意是靜態(tài)局部變量
  416.         static uchar code_n=0;                        //密碼次數(shù)
  417. PASSWORD:       lcd_clr();                          //調(diào)清屏函數(shù)
  418.         CodeInDisp();//密碼輸入畫面函數(shù)
  419.         do{  
  420. /**********修改1***********/

  421.                 if(hongwai==0)                                //若有按鍵按下
  422.                 {
  423.                   hongwaijvzhen();                        //調(diào)矩陣按鍵掃描函數(shù)

  424.                         while(!hongwai);//等待按鍵松開
  425. /***************************/
  426.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  427.                         {
  428.                                 incode_buf[count]=key;        //將鍵值存入數(shù)組
  429.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  430.                                 lcd_wdat(0x2a);                           //顯示為"*",0x2a是"*"的LCD顯示碼
  431.                                         count++;                                //輸入下一位密碼
  432.                                         lcd_x++;                                //指向LCD的下一位置
  433.                beep();
  434.                                 }
  435.                         }
  436.                 }while(count<6);        //密碼設(shè)置為6位
  437.                 if(count>=6){count=0;lcd_x=0;}        
  438.                 if(memcmp(incode_buf,code_buf,6)==0)        //若兩個(gè)數(shù)組相等,則返回值為0,注意這里不能用strcmp函數(shù)進(jìn)行比較
  439.                 {
  440.                         CodeInOk();                                //若輸入的密碼正確,則顯示輸入正確的信息
  441.                         beep();beep();beep();                //輸入正確后,蜂鳴器響三聲
  442.                         flag_comp=1;                        //密碼比較標(biāo)志位置1
  443.                         code_n=0;                                //密碼計(jì)數(shù)器清0
  444.                         RELAY=0;                                //打開繼電器,開鎖
  445.                 }
  446.                 else if(memcmp(incode_buf,code_buf,6)!=0)//若輸入的密碼不正確
  447.                 {
  448.                         code_n++;                                //密碼計(jì)數(shù)器加1        
  449.                         if(code_n>=3)                        //有三次輸入的機(jī)會(huì)
  450.                         {
  451.                                 CodeInErr();                        //若三次輸入均錯(cuò)誤,顯示密碼錯(cuò)誤信息
  452.                                 flag_comp=0;                //密碼比較標(biāo)志位清0
  453.                                 code_n=0;                        //密碼計(jì)數(shù)器清0
  454.                         }
  455.                         else goto PASSWORD;                        //若還有機(jī)會(huì)輸入密碼,則跳轉(zhuǎn)到標(biāo)號(hào)PASSWORD處繼續(xù)輸入
  456.                 }        
  457. }

  458. /********以下是密碼設(shè)置函數(shù)*******************************************************************************************************/
  459. void PassSet()
  460. {
  461.         static        uchar  lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  462.         static         uchar count=0;                        //密碼計(jì)數(shù)器        ,注意是靜態(tài)局部變量
  463.         lcd_clr();                                          //調(diào)清屏函數(shù)
  464.         CodeSetDisp();                                //密碼設(shè)置畫面函數(shù)
  465.         do{
  466. /********修改2**************/
  467.                 P1=0xf0;
  468.                 if(P1!=0xf0)                                //若有按鍵按下
  469.                 {
  470.                         MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)

  471.                                         P1=0xf0;               
  472.                         while(P1!=0xf0);//等待按鍵松開
  473. /**********************/
  474.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  475.                         {
  476.                                 code_buf[count]=key;                //將鍵值存入數(shù)組code_buf[]中
  477.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  478.                                 lcd_wdat(code_buf[count]+0x30);        //將輸入的密碼通過LCD顯示出來        
  479.                                 count++;                                //輸入下一位密碼
  480.                                 lcd_x++;                                //指向LCD的下一位置

  481.                         }
  482.                 }
  483.         }while(count<6);                //密碼設(shè)置為6位
  484.         if(count>=6){count=0;lcd_x=0;}
  485.         beep();beep();beep();        //輸入完畢后,蜂鳴器響三聲
  486.         write_nbyte(0xa0,0x00,code_buf,6);        //將數(shù)組code_buf[]中的6位密碼寫入24cxx從00開始的單元中
  487.         lcd_clr();                                          //調(diào)清屏函數(shù)
  488.         CodeSetOk();                                        //密碼設(shè)置正確畫面函數(shù)
  489. }
  490. /********************************************紅外密碼設(shè)置函數(shù)****************************************************************/
  491. void PassSethongwai()

  492. {
  493.         static        uchar  lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  494.         static         uchar count=0;                        //密碼計(jì)數(shù)器        ,注意是靜態(tài)局部變量
  495.         lcd_clr();                                          //調(diào)清屏函數(shù)
  496.         CodeSetDisp();                                //密碼設(shè)置畫面函數(shù)
  497.         do{
  498. /********修改2**************/

  499.                 if(hongwai==0)                                //若有按鍵按下
  500.                 {
  501.                   hongwaijvzhen();                        //調(diào)矩陣按鍵掃描函數(shù)

  502.                         while(!hongwai);//等待按鍵松開
  503. /**********************/
  504.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  505.                         {
  506.                                 code_buf[count]=key;                //將鍵值存入數(shù)組code_buf[]中
  507.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  508.                                 lcd_wdat(code_buf[count]+0x30);        //將輸入的密碼通過LCD顯示出來        
  509.                                 count++;                                //輸入下一位密碼
  510.                                 lcd_x++;                                //指向LCD的下一位置
  511.                                 beep();
  512.                         }
  513.                 }
  514.         }while(count<6);                //密碼設(shè)置為6位
  515.         if(count>=6){count=0;lcd_x=0;}
  516.         beep();beep();beep();        //輸入完畢后,蜂鳴器響三聲
  517.         write_nbyte(0xa0,0x00,code_buf,6);        //將數(shù)組code_buf[]中的6位密碼寫入24cxx從00開始的單元中
  518.         lcd_clr();                                          //調(diào)清屏函數(shù)
  519.         CodeSetOk();                                        //密碼設(shè)置正確畫面函數(shù)
  520. }
  521. /****************開機(jī)初始模式顯示函數(shù)******************************************/
  522. void kaijimoshi()
  523.     {

  524.     if(panduan==0) //如果P2.3腳接地顯示《KEY》
  525.            {           //                 PATTERN(1)

  526.         uchar i;
  527.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  528.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  529.           i = 0;                                                               
  530.           while(jianpan1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  531.           {                             
  532.                   lcd_wdat(jianpan1_data[i]);               //顯示第1行字符   
  533.                   i++;                               //指向下一字符                                         
  534.           }                                                                     
  535.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  536.           i = 0;                                                               
  537.           while(jianpan2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  538.           {                                                                     
  539.                   lcd_wdat(jianpan2_data[i]);               //顯示第2行字符   
  540.                    i++;                                       //指向下一字符
  541.         }
  542.    Delay_ms(3000);     //延時(shí)3秒
  543.    lcd_clr();

  544.                 }


  545.           if(panduan==1)   //如果P2.3腳懸空顯示《REMOTE》
  546.             {             //                  PATTERN(2)
  547.         uchar i;
  548.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  549.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  550.           i = 0;                                                               
  551.           while(hongwai1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  552.           {                             
  553.                   lcd_wdat(hongwai1_data[i]);               //顯示第1行字符   
  554.                   i++;                               //指向下一字符                                         
  555.           }                                                                     
  556.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  557.           i = 0;                                                               
  558.           while(hongwai2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  559.           {                                                                     
  560.                   lcd_wdat(hongwai2_data[i]);               //顯示第2行字符   
  561.                    i++;                                       //指向下一字符
  562.         }
  563.       Delay_ms(3000);      //延時(shí)3秒
  564.        lcd_clr();


  565.                 }

  566. }
  567. /********以下是主函數(shù)********/
  568. void main()
  569. {
  570.    EA=1;EX0=1;                 //允許總中斷中斷,使能 INT0 外部中斷
  571.    IT0 = 1;                               //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
  572.    IRIN=1;                            //遙控輸入腳置1
  573.    TMOD=0x01;                         //定時(shí)器T0方式1
  574.    TH0=0xee;
  575.    TL0=0x00;              //5ms定時(shí)初值
  576.    ET0=1;                        //開總中斷,開定時(shí)器T0中斷
  577.    Delay_ms(10);                                                            
  578.    lcd_init();                                  //調(diào)LCD初始化函數(shù)
  579.    I2C_init();                                //調(diào)I2C總線初始化函數(shù)(在I2C總線驅(qū)動(dòng)程序軟件包中)
  580.    kaijimoshi();
  581. START:  RELAY=1;                        //繼電器關(guān)斷
  582.         lcd_clr();
  583.         StartDisp();                                //開機(jī)畫面顯示函數(shù)
  584.         read_nbyte (0xa0,0x00,code_buf,6);//從24Cxx的0x00開始的單元中讀出6個(gè)密碼存入code_buf[]數(shù)組中
  585.         P1=0xf0;

  586.         while((P1==0xf0)&&(hongwai==0));                        //如果紅外和鍵盤不是同時(shí)按下,就進(jìn)入到下一步,否則等待
  587. MatrixKey();

  588. /*******************************執(zhí)行紅外模式密碼鎖方式****************************************************************************/
  589. if(panduan==1)
  590.   {
  591.      SCAN:        hongwaijvzhen ();                        //調(diào)矩陣按鍵掃描函數(shù)
  592.         if(key!=0x0a)goto SCAN;                //若按下的不是A鍵,跳轉(zhuǎn)到標(biāo)號(hào)SCAN處繼續(xù)掃描
  593.         TR0=1;                                //啟動(dòng)定時(shí)器T0
  594.         Delay_ms(500);                        //延時(shí)500ms               
  595.         beep();                                //蜂鳴器響一聲
  596.         if(flag_2s==1)flag_2s=0;                //若2s到,則將 2s標(biāo)志位清0
  597.         else goto SCAN;                        //若2s未到,則跳轉(zhuǎn)到標(biāo)號(hào)SCAN處繼續(xù)掃描        
  598.          PassInhongwai();                                          //調(diào)紅外密碼輸入函數(shù)
  599.         while(1)
  600.         {
  601.                 if(flag_comp==1)                //若輸入的密碼正確
  602.                 {        
  603.          hongwaijvzhen ();
  604.                         if(key==0x0b)        //在密碼正確的情況下若按下了B鍵
  605.                         {                        
  606.           PassSethongwai();          //        調(diào)紅外密碼設(shè)置函數(shù)               
  607.             hongwaijvzhen ();
  608.                                 if(key==0x0e)goto START;//若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  609.                         }
  610.                         if(key==0x0e)goto START;        //若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  611.                 }
  612.                 if(flag_comp==0)                                //若輸入的密碼不正確
  613.                 {                        
  614.         hongwaijvzhen ();
  615.                          if(key==0x0e)goto START;//若按下的是E鍵,跳轉(zhuǎn)到標(biāo)號(hào)START處重新開始
  616.                 }
  617.         }
  618. }
  619. /************************執(zhí)行鍵盤輸入密碼鎖模式**********************************************************************************************/
  620. if(panduan==0)
  621.   {

  622.    DSCAN:        MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)
  623.         if(key!=0x0a)goto DSCAN;                //若按下的不是A鍵,跳轉(zhuǎn)到標(biāo)號(hào)SCAN處繼續(xù)掃描
  624.         TR0=1;                                //啟動(dòng)定時(shí)器T0
  625.         Delay_ms(500);                        //延時(shí)500ms               
  626.         beep();                                //蜂鳴器響一聲
  627.         if(flag_2s==1)flag_2s=0;                //若2s到,則將 2s標(biāo)志位清0
  628.         else goto  DSCAN;                        //若2s未到,則跳轉(zhuǎn)到標(biāo)號(hào)SCAN處繼續(xù)掃描
  629.         PassIn();                                //調(diào)密碼輸入函數(shù)
  630.         /******************************************/
  631.         while(1)
  632.         {
  633.                 if(flag_comp==1)                //若輸入的密碼正確
  634.                 {

  635.                         MatrixKey();                //掃描按鍵
  636.                         if(key==0x0b)        //在密碼正確的情況下若按下了B鍵
  637.                         {
  638.                                 PassSet();        //若按下的是B鍵,調(diào)密碼設(shè)置函數(shù)
  639.                                 MatrixKey();        //掃描按鍵
  640.                                 if(key==0x0e)goto START;//若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  641.                         }
  642.                         if(key==0x0e)goto START;        //若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  643.                 }
  644.                 if(flag_comp==0)                                //若輸入的密碼不正確
  645.                 {
  646.                         MatrixKey();                        //掃描按鍵
  647.                          if(key==0x0e)goto START;//若按下的是E鍵,跳轉(zhuǎn)到標(biāo)號(hào)START處重新開始
  648.                 }
  649.         }

  650. }
  651. }
  652. /********以下是定時(shí)器T0中斷函數(shù)********/
  653. void timer0() interrupt 1
  654. {
  655.         TH0=0xee;TL0=0x00;                //重裝5ms定時(shí)初值
  656.   count_5ms++;                        //5ms 計(jì)數(shù)值加1
  657.   if(count_5ms==200)                //若count_5ms為200,說明1s到(200×0ms=1000ms)
  658.   {
  659.           count_5ms=0;                // count_5ms清0
  660.                 sec++;                           //秒計(jì)數(shù)器加1
  661.         }
  662.   if(sec==2)
  663.         {
  664.                 flag_2s=1;                        //若2s到,將2s標(biāo)志位置1
  665.                 TR0=0;                        //關(guān)斷定時(shí)器T0
  666.         }
  667. }
  668. /********以下是外中斷0函數(shù)********/
  669. void IR_decode() interrupt 0
  670. {
  671.         uchar j,k,count=0;
  672.   EX0 = 0;                           //暫時(shí)關(guān)閉外中斷0中斷請求



  673.         delayy(20);                        //延時(shí)20*0.14=2.8ms
  674.         if (IRIN==1)                         //等待 IRIN低電平出現(xiàn)
  675.   {
  676.                  EX0 =1;                //開外中斷0
  677.                    return;                //中斷返回
  678.         }                                                            
  679.   while (!IRIN) delayy(1);   //等待IRIN變?yōu)楦唠娖剑^9ms的低電平引導(dǎo)碼
  680.         for (j=0;j<4;j++)         //收集四組數(shù)據(jù),即用戶碼低位、用戶碼高位、鍵值數(shù)據(jù)碼和鍵值數(shù)碼反碼
  681.          {
  682.           for (k=0;k<8;k++)                        //每組數(shù)據(jù)有8位
  683.           {
  684.                    while (IRIN)            //等待IRIN變?yōu)榈碗娖剑^4.5ms的高電平引導(dǎo)碼信號(hào)。
  685.                      delayy(1);
  686.                         while (!IRIN)          //等待IRIN變?yōu)楦唠娖?br />
  687.                      delayy(1);
  688.                      while (IRIN)           //對IRIN高電平時(shí)間進(jìn)行計(jì)數(shù)
  689.                       {
  690.                             delayy(1);                //延時(shí)0.14ms
  691.                             count++;          //對0.14ms延時(shí)時(shí)間進(jìn)行計(jì)數(shù)
  692.                             if (count>=30)        
  693.                                  {
  694.                                         EX0=1;                //開外中斷0
  695.                                          return;        //0.14ms計(jì)數(shù)過長則返回
  696.                                 }                  
  697.                       }   
  698.                      IR_buf[j]=IR_buf[j] >> 1;                  //若計(jì)數(shù)小于6,數(shù)據(jù)最高位補(bǔ)"0",說明收到的是"0"
  699.                      if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;}  //若計(jì)數(shù)大于等于6,數(shù)據(jù)最高位補(bǔ)"1",說明收到的是"1"
  700.                      count=0;                                        //計(jì)數(shù)器清0        
  701.           }
  702. }
  703.         if (IR_buf[2]!=~IR_buf[3])                //將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯(cuò)誤,放棄
  704.          {

  705.      EX0 = 1;                         //開外中斷0
  706.         return;
  707. }


  708. /******************************************************************/
  709.   hongwai=0;
  710.           beep();                        //蜂鳴器響一聲
  711.   EX0 = 1;                         //開外中斷0
  712.   biaozhi=1;
  713.   jianpan=1;
  714. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:702039 發(fā)表于 2020-3-3 22:31 | 只看該作者
帶驗(yàn)證碼的怎么設(shè)置
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表