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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個一個單片機密碼鎖程序請教這里面的密碼是怎樣的設置的?

[復制鏈接]
跳轉到指定樓層
樓主
ID:362792 發表于 2019-11-10 13:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /***************************************************************
  2. 此程序是在電子密碼鎖的基礎上增加的紅外遙控功能
  3. 采用STC89C52單片機
  4. 外中斷口P3.2為紅外接收頭接口
  5. 紅外和鍵盤兩種模式轉換用P2.3控制,0為鍵盤模式,1為紅外輸入
  6. 遙控器使用常用的HT6122核心的
  7. 液晶用1602         引腳定義在I2C_drive.h中
  8. 存儲器采用的24C04 引腳定義在I2C_drive.h中
  9. P1口接4X4矩陣按鍵
  10. ****************************************************************/
  11. #include<reg52.h>
  12. #include <string.h>
  13. #include "I2C_drive.h"                        //包含I2C總線驅動程序軟件包
  14. #include "LCD_drive.h"                        //包含I2C總線驅動程序軟件包
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17. uchar code_buf[6];                                //存儲器密碼緩沖區
  18. uchar incode_buf[6];                                //輸入密碼緩沖區
  19. uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]為用戶碼低位、用戶碼高位接收緩沖區
  20.                                                 // IR_buf[2]、IR_buf[3]為鍵數據碼和鍵數據碼反碼接收緩沖區
  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;         //紅外,鍵盤轉換引腳,接地為鍵盤模式,懸空為紅外模式

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



  37. void  beep(){//-揚聲器--按鍵音
  38.         unsigned char a;//定義變量用于發聲的長度設置
  39.         for(a=100;a>0;a--){//聲音的長度
  40.                 BEEP = ~BEEP;
  41.                 Delay(50);//音調設置延時
  42.         }
  43.         BEEP = 1;//音樂結束后揚聲器拉高關閉
  44. }               
  45. /********以下是0.14ms的x倍延時函數********/
  46. void delayy(uchar x)            //延時x*0.14ms
  47. {
  48. uchar i;
  49. while(x--)
  50.    for (i = 0; i<13; i++);
  51. }
  52. /********以下是矩陣按鍵掃描函數********/
  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);                //延時10ms去抖               
  62.                 temp=P1;                        //再讀取P1口按鍵
  63.                 temp=temp & 0x0f;                //再判斷列線(P1.0~P1.3)是否有0
  64.                 if (temp!=0x0f)                //若temp不等于0x0f,說明確實有鍵按下
  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,說明按鍵還沒有釋放,繼續等待
  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. /*********************紅外按鍵矩陣函數*************************************************************************************************/
  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. /********以下是開機畫面信息********/
  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. /********以下是密碼輸入錯誤信息********/
  234. uchar code inerr_line1[] = {"INPUT PASSWORD "};           //定義第1行顯示的字符                              
  235. uchar code inerr_line2[] = {"   INPUT ERR    "};                 //定義第2行顯示的字符      
  236. /********以下是密碼設置畫面信息********/
  237. uchar code modify_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  238. uchar code modify_line2[] = {"PASSWORD:------ "};                 //定義第2行顯示的字符      
  239. /********以下是密碼設置正確信息********/
  240. uchar code setok_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  241. uchar code setok_line2[] = {"   MODIFY OK     "};                 //定義第2行顯示的字符      
  242. /********以下是開機畫面顯示函數********/
  243. void StartDisp()
  244. {
  245.         uchar i;
  246.         lcd_clr();                                                  //調清屏函數
  247.         lcd_wcmd(0x00|0x80);                           //設置顯示位置為第1行第0列
  248.           i = 0;                                                               
  249.           while(line1_data[i] != '\0')                      //若沒有到達第1行字符串尾部
  250.           {                             
  251.                   lcd_wdat(line1_data[i]);               //顯示第1行字符   
  252.                   i++;                               //指向下一字符                                         
  253.           }                                                                     
  254.           lcd_wcmd(0x40|0x80);                  //設置顯示位置為第2行第0列            
  255.           i = 0;                                                               
  256.           while(line2_data[i] != '\0')                  //若沒有到達第2行字符串尾部
  257.           {                                                                     
  258.                   lcd_wdat(line2_data[i]);               //顯示第2行字符   
  259.                    i++;                                       //指向下一字符
  260.         }
  261. }
  262. /********以下是密碼輸入畫面顯示函數********/
  263. void CodeInDisp()
  264. {
  265.         uchar i;
  266.         lcd_clr();                                          //調清屏函數
  267.         lcd_wcmd(0x00|0x80);                   //設置顯示位置為第1行第0列
  268.           i = 0;                                                               
  269.           while(in_line1[i] != '\0')              //若沒有到達第1行字符串尾部
  270.           {                             
  271.                   lcd_wdat(in_line1[i]);      //顯示第1行字符   
  272.                   i++;                     //指向下一字符                                         
  273.           }                                                                     
  274.           lcd_wcmd(0x40|0x80);          //設置顯示位置為第2行第0列            
  275.           i = 0;                                                               
  276.           while(in_line2[i] != '\0')                  //若沒有到達第2行字符串尾部
  277.           {                                                                     
  278.                   lcd_wdat(in_line2[i]);     //顯示第2行字符   
  279.                    i++;                               //指向下一字符
  280.         }
  281. }
  282. /********以下是密碼輸入錯誤顯示函數********/
  283. void CodeInErr()
  284. {
  285.         uchar i;
  286.         lcd_clr();                                                  //調清屏函數
  287.         lcd_wcmd(0x00|0x80);                           //設置顯示位置為第1行第0列
  288.           i = 0;                                                               
  289.           while(inerr_line1[i] != '\0')                      //若沒有到達第1行字符串尾部
  290.           {                             
  291.                   lcd_wdat(inerr_line1[i]);       //顯示第1行字符   
  292.                   i++;                               //指向下一字符                                         
  293.           }                                                                     
  294.           lcd_wcmd(0x40|0x80);                  //設置顯示位置為第2行第0列            
  295.           i = 0;                                                               
  296.           while(inerr_line2[i] != '\0')                  //若沒有到達第2行字符串尾部
  297.           {                                                                     
  298.                   lcd_wdat(inerr_line2[i]);               //顯示第2行字符   
  299.                    i++;                                       //指向下一字符
  300.         }
  301. }
  302. /********以下是密碼輸入正確顯示函數********/
  303. void CodeInOk()
  304. {
  305.         uchar i;
  306.         lcd_clr();                                                  //調清屏函數
  307.         lcd_wcmd(0x00|0x80);                           //設置顯示位置為第1行第0列
  308.           i = 0;                                                               
  309.           while(inok_line1[i] != '\0')                      //若沒有到達第1行字符串尾部
  310.           {                             
  311.                   lcd_wdat(inok_line1[i]);       //顯示第1行字符   
  312.                   i++;                               //指向下一字符                                         
  313.           }                                                                     
  314.           lcd_wcmd(0x40|0x80);                  //設置顯示位置為第2行第0列            
  315.           i = 0;                                                               
  316.           while(inok_line2[i] != '\0')                  //若沒有到達第2行字符串尾部
  317.           {                                                                     
  318.                   lcd_wdat(inok_line2[i]);       //顯示第2行字符   
  319.                    i++;                                       //指向下一字符
  320.         }
  321. }
  322. /********以下是密碼設置畫面顯示函數********/
  323. void CodeSetDisp()
  324. {
  325.         uchar i;
  326.         lcd_clr();                                                  //調清屏函數
  327.         lcd_wcmd(0x00|0x80);                           //設置顯示位置為第1行第0列
  328.           i = 0;                                                               
  329.           while(modify_line1[i] != '\0')              //若沒有到達第1行字符串尾部
  330.           {                             
  331.                   lcd_wdat(modify_line1[i]);       //顯示第1行字符   
  332.                   i++;                               //指向下一字符                                         
  333.           }                                                                     
  334.           lcd_wcmd(0x40|0x80);                  //設置顯示位置為第2行第0列            
  335.           i = 0;                                                               
  336.           while(modify_line2[i] != '\0')                  //若沒有到達第2行字符串尾部
  337.           {                                                                     
  338.                   lcd_wdat(modify_line2[i]);       //顯示第2行字符   
  339.                    i++;                                       //指向下一字符
  340.         }
  341. }
  342. /********以下是密碼設置正確顯示函數********/
  343. void CodeSetOk()
  344. {
  345.         uchar i;
  346.         lcd_clr();                                                  //調清屏函數
  347.         lcd_wcmd(0x00|0x80);                           //設置顯示位置為第1行第0列
  348.           i = 0;                                                               
  349.           while(setok_line1[i] != '\0')                      //若沒有到達第1行字符串尾部
  350.           {                             
  351.                   lcd_wdat(setok_line1[i]);       //顯示第1行字符   
  352.                   i++;                               //指向下一字符                                         
  353.           }                                                                     
  354.           lcd_wcmd(0x40|0x80);                  //設置顯示位置為第2行第0列            
  355.           i = 0;                                                               
  356.           while(setok_line2[i] != '\0')                  //若沒有到達第2行字符串尾部
  357.           {                                                                     
  358.                   lcd_wdat(setok_line2[i]);       //顯示第2行字符   
  359.                    i++;                                       //指向下一字符
  360.         }
  361. }
  362. /********以下是密碼輸入函數********/
  363. void PassIn()
  364. {
  365.         static        uchar lcd_x=0;                        //顯示指針,注意是靜態局部變量
  366.         static         uchar count=0;                        //密碼計數器        ,注意是靜態局部變量
  367.         static uchar code_n=0;                        //密碼次數
  368. PASSWORD:

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

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

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

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

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

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

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

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

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

  502.                         while(!hongwai);//等待按鍵松開
  503. /**********************/
  504.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數字,字母鍵A~F無效)
  505.                         {
  506.                                 code_buf[count]=key;                //將鍵值存入數組code_buf[]中
  507.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設置顯示位置為第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);                //密碼設置為6位
  515.         if(count>=6){count=0;lcd_x=0;}
  516.         beep();beep();beep();        //輸入完畢后,蜂鳴器響三聲
  517.         write_nbyte(0xa0,0x00,code_buf,6);        //將數組code_buf[]中的6位密碼寫入24cxx從00開始的單元中
  518.         lcd_clr();                                          //調清屏函數
  519.         CodeSetOk();                                        //密碼設置正確畫面函數
  520. }
  521. /****************開機初始模式顯示函數******************************************/
  522. void kaijimoshi()
  523.     {

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

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

  544.                 }


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


  565.                 }

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

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

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

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

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

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



  673.         delayy(20);                        //延時20*0.14=2.8ms
  674.         if (IRIN==1)                         //等待 IRIN低電平出現
  675.   {
  676.                  EX0 =1;                //開外中斷0
  677.                    return;                //中斷返回
  678.         }                                                            
  679.   while (!IRIN) delayy(1);   //等待IRIN變為高電平,跳過9ms的低電平引導碼
  680.         for (j=0;j<4;j++)         //收集四組數據,即用戶碼低位、用戶碼高位、鍵值數據碼和鍵值數碼反碼
  681.          {
  682.           for (k=0;k<8;k++)                        //每組數據有8位
  683.           {
  684.                    while (IRIN)            //等待IRIN變為低電平,跳過4.5ms的高電平引導碼信號。
  685.                      delayy(1);
  686.                         while (!IRIN)          //等待IRIN變為高電平
  687.                      delayy(1);
  688.                      while (IRIN)           //對IRIN高電平時間進行計數
  689.                       {
  690.                             delayy(1);                //延時0.14ms
  691.                             count++;          //對0.14ms延時時間進行計數
  692.                             if (count>=30)        
  693.                                  {
  694.                                         EX0=1;                //開外中斷0
  695.                                          return;        //0.14ms計數過長則返回
  696.                                 }                  
  697.                       }   
  698.                      IR_buf[j]=IR_buf[j] >> 1;                  //若計數小于6,數據最高位補"0",說明收到的是"0"
  699.                      if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;}  //若計數大于等于6,數據最高位補"1",說明收到的是"1"
  700.                      count=0;                                        //計數器清0        
  701.           }
  702. }
  703.         if (IR_buf[2]!=~IR_buf[3])                //將鍵數據反碼取反后與鍵數據碼碼比較,若不等,表示接收數據錯誤,放棄
  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. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:702039 發表于 2020-3-3 22:31 | 只看該作者
帶驗證碼的怎么設置
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品视频在线观看 | 午夜国产一级 | 视频一区二区三区中文字幕 | 免费黄色av网站 | 午夜精品网站 | 日韩精品在线一区 | a黄视频| 91大神新作在线观看 | 日日摸夜夜爽人人添av | 亭亭五月激情 | 国产日韩精品视频 | 亚洲精品福利视频 | 99国产精品一区二区三区 | 国产精品欧美一区喷水 | 在线成人免费视频 | 欧美成人一区二区三区 | 天天射视频 | 亚洲一二三区精品 | 欧美精品99 | 91资源在线 | 亚洲国产成人精 | 91精品国产综合久久精品 | 欧美综合国产精品久久丁香 | 日韩av在线一区 | 久久国内精品 | 国产综合久久 | 欧美日韩亚洲国产综合 | 天天曰夜夜操 | 日本a∨视频| 天天射网站 | 欧美精品一区二区三区在线 | 天天操夜夜爽 | 欧美午夜剧场 | 国产精品一区二区三区久久 | 欧美一级视频在线观看 | 日本不卡一区 | 超碰人人做 | 91色在线 | 久久精品99国产精品日本 | 日韩av一二三区 | 色婷婷精品 |