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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機C語言程序 什么地方該用延時函數?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1080265 發表于 2023-5-30 13:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      自己寫的一個密碼鎖,4*4鍵盤,8盞燈,4位數密碼,感覺大概邏輯還簡單。先輸入設置密碼,同時對應亮起相應的燈提示有在輸入,因為只有8盞燈,所以密碼只能設置1~8。后輸入密碼進行解鎖操作,此時只需4個LED燈按順序從左到右亮起,提示輸入了幾位了。最后檢查判斷。      燒錄到板子上感覺應該是執行太快了,輸入了幾位馬上跳最后密碼正確了。請問各位同志,哪些地方該調用延時函數?或者應該添加新的按鍵作為結束輸入的功能?

單片機C語言源程序如下:
  1. #include<STC12C5A60S2.h>
  2. #include<LCD1602.h>
  3. #include<Key_scan.h>              //返回鍵盤值1~16
  4. #define uchar        unsigned char
  5. #define uint        unsigned int


  6. void Delay_ms(uint time)   //延時函數
  7. {
  8.         uint i,j;
  9.         for(i = 0;i < time;i ++)
  10.                 for(j = 0;j < 930;j ++);
  11. }

  12. void pass(void)                                   //通過后的跑馬燈效果
  13. {
  14. void Delay_ms(uint time);
  15. int temp;
  16. temp=0xaa;
  17. while(1)
  18. {
  19.    P0=temp;     
  20.    Delay_ms(800);  
  21.    temp=_crol_(temp,1);                             
  22. }               
  23. }
  24. int current_led=0;
  25. int last_led=0;
  26. int main()
  27. {  int key,password[4]={0,0,0,0};           //鍵盤值;原始密碼
  28.    int i=0,input[4]={0};                                //循環次數變量;輸入的密碼
  29.    for(i=0;i<4;i++)//輸入設置密碼
  30.      {
  31.          key=Key_scan();
  32.             password[i]=key;
  33.          switch(key)
  34.          {
  35.             case 1:P00=0;break;
  36.         case 2:P01=0;break;
  37.         case 3:P02=0;break;
  38.         case 4:P03=0;break;
  39.         case 5:P04=0;break;
  40.         case 6:P05=0;break;
  41.         case 7:P06=0;break;
  42.         case 8:P07=0;break;
  43.      }
  44.          Delay_ms(5000);
  45.             }  P0=1;                                                  //輸入完4位數密碼,燈全滅
  46.    for(i=0;i<4;i++){    //輸入密碼進行解鎖
  47.      key=Key_scan();
  48.          if(key!=0)                                                  //鍵盤有輸入,燈順序亮起
  49.          {
  50.            current_led++;
  51.            switch(current_led)
  52.            {
  53.             case 1:P00=0;break;
  54.         case 2:P01=0;break;
  55.         case 3:P02=0;break;
  56.         case 4:P03=0;break;
  57.         case 5:P04=0;break;
  58.         case 6:P05=0;break;
  59.         case 7:P06=0;break;
  60.         case 8:P07=0;break;
  61.            }
  62.           }
  63.          input[i]=key;                                           //將鍵盤值輸入
  64.          }
  65.         
  66.         for(i=0;i<4;i++){                                                                        //最后檢查密碼是否正確
  67.           if(input[i]==password[i])
  68.              pass();
  69.           else
  70.              P0=0;Delay_ms(500);
  71.                  P0=1;Delay_ms(500);
  72.                 }
  73. return 0;         
  74. }
復制代碼



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

使用道具 舉報

沙發
ID:883242 發表于 2023-5-30 16:05 | 只看該作者
在Key_scan()里面加延遲。
回復

使用道具 舉報

板凳
ID:1080265 發表于 2023-5-30 16:15 | 只看該作者
Hephaestus 發表于 2023-5-30 16:05
在Key_scan()里面加延遲。

我的意思是主函數里哪里該調用延遲函數使得全過程流暢可分辨。
回復

使用道具 舉報

地板
ID:161164 發表于 2023-5-30 18:18 | 只看該作者
violet233 發表于 2023-5-30 16:15
我的意思是主函數里哪里該調用延遲函數使得全過程流暢可分辨。

由于你的代碼邏輯混亂引致按鍵體驗不好
解決方法
1. 慢方法,理順邏輯,全寫代碼
2. 快方法,僭建代碼,在Bug上運行
以下是方法2的改正代碼
  1. #include<STC12C5A60S2.h>
  2. #include<LCD1602.h>
  3. #include<Key_scan.h>              //返回鍵盤值1~16
  4. #define uchar        unsigned char
  5. #define uint        unsigned int

  6. void Delay_ms(uint time)   //延時函數
  7. {
  8.         uint i,j;
  9.         for(i = 0; i < time; i ++)
  10.                 for(j = 0; j < 930; j ++);
  11. }

  12. void pass(void)                                   //通過后的跑馬燈效果
  13. {
  14.         void Delay_ms(uint time);
  15.         int temp;
  16.         temp=0xaa;
  17.         while(1)
  18.         {
  19.                 P0=temp;
  20.                 Delay_ms(800);
  21.                 temp=_crol_(temp,1);
  22.         }
  23. }
  24. int current_led=0;
  25. int last_led=0;
  26. int main()
  27. {
  28.         int key,password[4]= {0,0,0,0};          //鍵盤值;原始密碼
  29.         int i=0,input[4]= {0};                               //循環次數變量;輸入的密碼
  30.         while(1)
  31.         {
  32.                 for(i=0; i<4;) //輸入設置密碼
  33.                 {
  34.                         key=Key_scan();
  35.                         password[i]=key;
  36.                         switch(key)
  37.                         {
  38.                                 case 1:P00=0;i++;break;
  39.                                 case 2:P01=0;i++;break;
  40.                                 case 3:P02=0;i++;break;
  41.                                 case 4:P03=0;i++;break;
  42.                                 case 5:P04=0;i++;break;
  43.                                 case 6:P05=0;i++;break;
  44.                                 case 7:P06=0;i++;break;
  45.                                 case 8:P07=0;i++;break;
  46.                         }
  47.                 }
  48.                 P0=1;                                                  //輸入完4位數密碼,燈全滅
  49.                 for(i=0; i<4;)   //輸入密碼進行解鎖
  50.                 {
  51.                         key=Key_scan();
  52.                         if(key!=0)                                                  //鍵盤有輸入,燈順序亮起
  53.                         {
  54.                                 current_led++;
  55.                                 switch(current_led)
  56.                                 {
  57.                                         case 1:P00=0;break;
  58.                                         case 2:P01=0;break;
  59.                                         case 3:P02=0;break;
  60.                                         case 4:P03=0;break;
  61.                                         case 5:P04=0;break;
  62.                                         case 6:P05=0;break;
  63.                                         case 7:P06=0;break;
  64.                                         case 8:P07=0;break;
  65.                                 }
  66.                                 input[i]=key;                                           //將鍵盤值輸入
  67.                                 i++;
  68.                         }
  69.                 }

  70.                 for(i=0; i<4; i++)                                                                       //最后檢查密碼是否正確
  71.                 {
  72.                         if(input[i]==password[i])
  73.                                 pass();
  74.                         else
  75.                                 P0=0;
  76.                         Delay_ms(500);
  77.                         P0=1;
  78.                         Delay_ms(500);
  79.                 }               
  80.         }
  81.         return 0;
  82. }
復制代碼



回復

使用道具 舉報

5#
ID:123289 發表于 2023-5-31 10:41 | 只看該作者
【什么地方該用延時函數】與【C語言】無關!
與設計者為了達成目的,對時序的理解有關。
大多情況下,是為了適應硬件的需求。
例如:按鍵會有彈動,AD采樣需要時間,顯示需要以秒為單位……。
回復

使用道具 舉報

6#
ID:1080265 發表于 2023-6-1 18:11 | 只看該作者
lkc8210 發表于 2023-5-30 18:18
由于你的代碼邏輯混亂引致按鍵體驗不好
解決方法
1. 慢方法,理順邏輯,全寫代碼

真心感謝,對萌新來說能成功實現效果真的是很振奮人心!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产不卡一区二区三区 | 国产一区二区三区在线看 | 午夜小视频在线播放 | 黄色在线网站 | 亚洲精品一区二区二区 | 国产一区二区影院 | 亚洲免费在线观看 | 日日骚av | 玖玖在线免费视频 | 精品国产久 | 九九在线视频 | 天天影视色综合 | 91精品一区二区三区久久久久 | 免费看91 | 国产99热| 伊人超碰| 成人一区二区三区在线观看 | 欧美xxxx色视频在线观看免费 | 国产在线91 | 亚洲综合字幕 | 在线国产视频观看 | 久久精品综合 | 亚洲精品一区二区三区蜜桃久 | 久久成人国产 | 网色| 国产久视频 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 在线免费观看毛片 | 免费色网址 | 一a一片一级一片啪啪 | 亚洲精久 | 久久久美女 | 国产黄色在线观看 | 欧美激情一区二区三级高清视频 | 99精品在线| 精品区一区二区 | 91电影在线播放 | 精品欧美一区二区精品久久久 | 91亚洲精品久久久电影 | 欧美国产精品一区二区 | 中文字幕亚洲一区 |