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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1441|回復: 4
收起左側

單片機程序 按清除鍵,會清除密碼,但是從新輸入密碼,不顯示字

[復制鏈接]
ID:985137 發表于 2022-3-20 10:31 | 顯示全部樓層 |閱讀模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <absacc.h>
  6. #include "lcd1602.h"
  7. #include "main.h"
  8. #include "key.h"

  9. sbit Lock = P3^7;  //代表鎖控的繼電器IO   高電平關鎖,低電平開鎖
  10. sbit LEDRED = P3^3;  //代表密碼輸入錯誤的紅燈IO  高電平熄滅,低電平點亮
  11. sbit LEDGREEN = P3^4;  //代表密碼輸入正確的綠燈IO  高電平熄滅,低電平點亮
  12. uchar genPasswd[4];           //存儲生成的四位隨機數密碼
  13. uchar inpPasswd[4];           //存儲取包時輸入的四位密碼
  14. uchar code welcome[8]="welcome";  //開機顯示的歡迎標語
  15. uchar code set[7]="Passwd";    //顯示生成的密碼標題
  16. uchar code  close[12]="close door!";   //提示關門
  17. uchar code         input[13] = "input passwd";   //提示請輸入密碼

  18. /****************定時器設置相關的變量***********************/
  19. unsigned char TL0_temp;         /*暫存TL0的初值*/
  20. unsigned char TH0_temp;         /*暫存TH0的初值*/
  21. #define INT_CLOCK 10    /*INT_CLOCK為定時值,單位為ms ,此處定義為10ms*/
  22. #define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY為晶振頻率,單位為Hz*/



  23. /*延時程序*/
  24. void delay(uint z)               
  25. {
  26.         unsigned int i,j;
  27.    for(i=0;i<z;i++)
  28.     for(j=0;j<100;j++);
  29. }
  30. /******************************
  31. 顯示首頁 welcome
  32. ******************************/
  33. void display1()
  34. {
  35.    unsigned char i;
  36.    for(i = 0;i < 7;i++)
  37.    {
  38.                    wr_com(0x85+i);
  39.                 wr_dat(welcome[i]);
  40.    }
  41. }


  42. /************************************
  43. 顯示密碼生成界面
  44. ************************************/
  45. void display2()
  46. {
  47.    unsigned char i;

  48.    for(i = 0;i < 6;i++)
  49.    {
  50.                    wr_com(0x85+i);
  51.                 wr_dat(set[i]);
  52.    }
  53.    for(i = 0;i < 4;i++)
  54.    {
  55.                    wr_com(0xc6+i);
  56.                 wr_dat(genPasswd[i]+0x30);
  57.                
  58.    }
  59. }

  60. /************************************
  61. 顯示請關門界面
  62. ************************************/

  63. void display3()
  64. {
  65.      unsigned char i;
  66.    for(i = 0;i < 11;i++)
  67.    {
  68.                    wr_com(0x83+i);
  69.                 wr_dat(close[i]);
  70.    }

  71. }


  72. /************************************
  73. 顯示密碼輸入界面
  74. ************************************/
  75. void display4()
  76. {
  77.    unsigned char i;
  78.    for(i = 0;i < 12;i++)
  79.    {
  80.                    wr_com(0x82+i);
  81.                 wr_dat(input[i]);
  82.    }
  83.    for(i = 0;i < 4;i++)
  84.    {
  85.                    wr_com(0xc6+i);
  86.                 wr_dat(inpPasswd[i]+0x30);
  87.                
  88.    }

  89. }
  90.         


  91. /***********************************
  92. 定時器0初始化
  93. ***********************************/
  94. void Timer0_init()
  95. {
  96.         unsigned long T0_temp;                                     /*暫存T0的初始值        */
  97.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值計算公式,參考教科書*/
  98.         TL0_temp = T0_temp & 0xff;
  99.         TH0_temp = T0_temp >> 8;
  100.         TL0 = TL0_temp;
  101.         TH0 = TH0_temp;
  102.         TMOD |= 0x01;
  103.         TR0 = 1;                        /*開定時器0中斷*/
  104.         ET0 = 1;  
  105.         EA = 1;                    /*開總中斷*/                                       

  106. }



  107. /*主函數*/
  108. uchar global_state = 0;
  109. uchar count_num = 0;  //輸入的數字個數
  110. void main()
  111. {  
  112.    uchar i;
  113.    uchar passwd;

  114.            uchar key_value = 0;
  115.         uchar temp_key_value = 0xff;
  116.         Lock = 1;  //剛上電 鎖是需要保持閉合
  117.         Timer0_init();        //定時器初始化
  118.          lcd_init();        //LCD1602初始化

  119.         while(1)        //進入不斷循環
  120.         {
  121.                    temp_key_value = Calkey_scan();          //讀取矩陣按鍵的鍵值
  122.                 if(temp_key_value != 0xff)
  123.                 {
  124.                         key_value = temp_key_value;
  125.                 }
  126.                 switch(global_state)
  127.                 {
  128.                         case 0:         //初始化狀態
  129.                                 display1();         //顯示歡迎語句        -- "welcome"
  130.                         

  131.                                 if(key_value == 13)  //存包按鍵被按下
  132.                                 {
  133.                                     key_value = 0xff;  //將按鍵值清除
  134.                                         Lock = 0;    //開鎖
  135.                                        
  136.                                         display3();    //顯示關門提示語        -- "close door!"
  137.                                     delay(1900);    //等待關門 大約3秒
  138.                                         Lock = 1;   //關門
  139.                                         clear();                 //清屏,準備下一屏的顯示
  140.                                         global_state = 1;   //切換運行狀態
  141.                                         passwd = TL0;  //采用定時器寄存器的值作為密碼
  142.                                         genPasswd[0] = passwd/100;                  //存儲密碼
  143.                                         genPasswd[1] = passwd%100/10;
  144.                                         genPasswd[2] = passwd%10;
  145.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
  146.                                 }
  147.                                 if(key_value == 14)  //取包按鍵被按下
  148.                                 {
  149.                                     key_value = 0xff;  //將按鍵值清除
  150.                                         clear();    //清屏,準備下一屏的顯示
  151.                                         global_state = 2;  //切換運行狀態
  152.                                         count_num = 0;   //清除數字按鍵變量
  153.                                         for(i = 0;i < 4;i++)  //清空輸入的密碼數組
  154.                                             inpPasswd[i] = ' '-0x30;
  155.                                 }
  156.                         break;
  157.                         case 1:                //密碼生成狀態
  158.                                    display2();         //顯示密碼生成界面
  159.                                 delay(1900);    //等待大約3秒
  160.                                 global_state = 0;  //返回到初始界面
  161.                                 clear();        //清屏,準備下一屏的顯示
  162.                                 
  163.                         break;
  164.                         case 2:          //輸入密碼狀態
  165.                            display4();           //顯示輸入密碼界面
  166.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的為0-9的數字按鍵
  167.                            {
  168.                               
  169.                                 if(count_num <= 3)         //如果按鍵次數小于4次
  170.                                         {
  171.                                         inpPasswd[count_num] = key_value; //將按鍵值存入數組,并顯示
  172.                                                    count_num++;
  173.                                     }
  174.                                          key_value = 0xff;  //將按鍵值清除
  175.                            }
  176.                            if(key_value == 15) //清除按鍵被按下
  177.                            {
  178.                                 key_value = 0xff;  //將按鍵值清除
  179.                                            for(i = 0;i < 4;i++)
  180.                                           inpPasswd[i] = ' '-0x30;  //清除剛剛輸入的密碼
  181.                            }
  182.                            if(key_value == 16) //確認按鍵被按下
  183.                            {
  184.                                 key_value = 0xff;  //將按鍵值清除
  185.                                            for(i = 0;i < 4;i++)
  186.                                         {
  187.                                                 if(inpPasswd[i] != genPasswd[i])
  188.                                                    break;
  189.                                         }
  190.                                         if(i == 4)          //密碼輸入正確
  191.                                         {
  192.                                                 LEDRED = 1;         //紅燈熄滅
  193.                                                 LEDGREEN = 0;  //綠燈亮
  194.                                                 Lock = 1;  //開鎖
  195.                                                 delay(1900);    //等待大約3秒
  196.                                                 Lock = 0;  //關鎖
  197.                                                 LEDGREEN = 1;  //綠燈熄滅
  198.                                         }
  199.                                         else   //密碼輸入錯誤
  200.                                         {
  201.                                                 LEDRED = 0;         //紅燈亮
  202.                                                 LEDGREEN = 1;  //綠燈熄滅
  203.                                                 Lock = 0;  //關鎖
  204.                                                 delay(1900);    //等待大約3秒
  205.                                                 LEDRED = 1;  //紅燈熄滅
  206.                                         }
  207.                                         clear();           //清屏,準備下一屏的顯示
  208.                                         global_state = 0;  //返回到初始界面

  209.                            }
  210.                         break;        
  211.                 }
  212.         }
  213. }


  214. void T0_interrupt(void) interrupt 1         
  215. {
  216.         TH0 += TH0_temp;
  217.         TL0 += TL0_temp;

  218. }
復制代碼

存包柜.zip

180.15 KB, 下載次數: 2

回復

使用道具 舉報

ID:161164 發表于 2022-3-20 16:02 | 顯示全部樓層
inpPasswd[i] = ' '-0x30;  //清除剛剛輸入的密碼
' 'Space的ASCII是0x20
0x20-0x30 = 0xF0
回復

使用道具 舉報

ID:985137 發表于 2022-3-20 16:40 | 顯示全部樓層
lkc8210 發表于 2022-3-20 16:02
inpPasswd = ' '-0x30;  //清除剛剛輸入的密碼
' 'Space的ASCII是0x20
0x20-0x30 = 0xF0

清除之后這個格還是占用,在輸入直接在寫一個格
回復

使用道具 舉報

ID:161164 發表于 2022-3-20 23:36 | 顯示全部樓層
2248373991 發表于 2022-3-20 16:40
清除之后這個格還是占用,在輸入直接在寫一個格

對不起~沒看到display4()里的wr_dat(inpPasswd[ i]+0x30);
你寫的沒錯

問題出于清除按鍵被按下后沒有對count_num清0
count_num繼續大于3
引致這段代不運行
  1.                 if(count_num <= 3)         //如果按鍵次數小于4次
  2.                 {
  3.                     inpPasswd[count_num] = key_value; //將按鍵值存入數組,并顯示
  4.                     count_num++;
  5.                 }
復制代碼

inpPasswd[count_num]數組不能被更新

回復

使用道具 舉報

ID:985137 發表于 2022-3-21 08:25 | 顯示全部樓層
lkc8210 發表于 2022-3-20 23:36
對不起~沒看到display4()里的wr_dat(inpPasswd[ i]+0x30);
你寫的沒錯

if(key_value == 15) //清除按鍵被按下
                           {
                                        key_value = 0xff;  //將按鍵值清除
                                        for(i = 0;i < 4;i++)
                                        inpPasswd[ i] = ' '-0x30;  //清除剛剛輸入的密碼
                                        count_num=0;
                           }
太感謝了,這樣寫就好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情五月激情综合网 | 婷婷精品| 久久av一区二区三区 | 国产一级片在线观看视频 | 国产丝袜一区二区三区免费视频 | 99re6在线视频精品免费 | 国产成人精品综合 | 免费v片在线观看 | 精品国产乱码久久久久久蜜柚 | 日本午夜免费福利视频 | 成人在线精品视频 | 欧美精品久久久 | 人妖videosex高潮另类 | 欧美天天视频 | 99精品久久久久久 | 国产精品免费看 | 日韩欧美在线观看视频网站 | 国产一级免费视频 | 天天草视频 | 成人免费视频网站在线看 | 日韩成年人视频在线 | 高清国产午夜精品久久久久久 | 在线观看视频中文字幕 | 亚洲91视频 | 久干网 | 天天操天天摸天天干 | 成人精品毛片 | 久久久一区二区三区四区 | 午夜大片| 欧美高清视频 | 奇米久久久 | 久久国产日韩欧美 | 久久99精品久久久久久国产越南 | 久久精品国产一区二区电影 | 精品久久香蕉国产线看观看亚洲 | 日韩av.com | 欧美黄色性生活视频 | 中文字幕 在线观看 | 久久久久免费精品国产小说色大师 | 国产在线观看一区二区 | 国产精品一区二区在线播放 |