找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)STC8G1K08A單鍵依次點(diǎn)亮7種亮燈模式后,第8次循環(huán)有時(shí)能跳出有時(shí)不能跳出循環(huán)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:957836 發(fā)表于 2021-10-24 17:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)STC8G1K08A
單鍵每按下一次就點(diǎn)亮一種模式,依次點(diǎn)亮7種亮燈模式后,第8次循環(huán)點(diǎn)亮前7種模式,但按下按鍵有時(shí)能跳出有時(shí)不能跳出第8種模式。

#include <stc8.h>
sbit      K=P5^5;         


void  delay (unsigned int i)
        {
                 unsigned int k,m;
                        for(m=0;m<9000;m++);
                                for(k=0;k<i;k++);
        }     


void port_mode()
        {
                P3M1=0X00;P3M0=0X00;P5M1=0X00;P5M0=0X00;
        }
       
void main()
        {   
                unsigned char i=0;        
                                       
                                        port_mode();
                                        P5=0XE0;
                                        P3=0X00;
                                        while(1)
                 {
                                        if(K==0)   
                                        {
                                                                delay(1200);     
                                                                if(K==0)         
                                                                {   
                                                                 while(!K);  
                                                                 delay(1200);
                                                                 if(++i==9)i=1;                                                                                           
                                                                }  
                                        }
                                         switch(i)            
                                        {
                                                         case  1:P3=0x02;break;
                                                         case  2:P3=0x04;break;
                                                         case  3:P3=0x08;break;
                                                         case  4:P3=0x06;break;
                                                         case  5:P3=0x0a;break;
                                                         case  6:P3=0x0c;break;
                                                         case  7:P3=0x0e;break;
                                                         case  8:                    
                                                                     P3=0x02;            
                                                                     delay(50000);                     
                                                                     P3=0x04;  
                                                                     delay(50000);                     
                                                                     P3=0x08;
                                                                     delay(50000);                     
                                                                     P3=0x06;
                                                                     delay(50000);                     
                                                                     P3=0x0a;
                                                                     delay(50000);
                                                                     P3=0x0c;
                                                                     delay(50000);                                                    
                                                                    P3=0x0e;
                                                                    delay(50000);break;
                                                                 
                                                        default:P3=0X00;break;
                                        }
                                                 
                        }   
        }

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

使用道具 舉報(bào)

沙發(fā)
ID:973695 發(fā)表于 2021-10-24 21:58 | 只看該作者
delay(1200);     是用執(zhí)行空操作的方式來(lái)延時(shí),所以很容易出現(xiàn)檢測(cè)不到按鍵動(dòng)作 。要解決的話(huà)只能用外部中斷來(lái)捕捉按鍵動(dòng)作。
回復(fù)

使用道具 舉報(bào)

板凳
ID:957836 發(fā)表于 2021-10-24 22:03 | 只看該作者
謝謝回復(fù),我再按您給的提示嘗試一下。
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2021-10-24 22:17 | 只看該作者
因?yàn)榘存I第8次進(jìn)入流水燈期間按鍵無(wú)效,流水燈結(jié)束時(shí)按鍵難以及時(shí)操作,鍵值 i 沒(méi)有改變,所以繼續(xù)進(jìn)入流水燈。要在流水燈結(jié)束時(shí)鍵值清0。
  1. #include <stc8.h>

  2. sbit      K=P5^5;         
  3.   
  4. void delay(unsigned int k)                //@11.0592MHz
  5. {
  6.         unsigned char i, j;
  7.         while (--k)
  8.         {
  9.                 i = 15;
  10.                 j = 90;
  11.                 do
  12.                 {
  13.                         while (--j);
  14.                 } while (--i);
  15.         }
  16. }

  17. void port_mode()
  18. {
  19.         P3M1=0X00;
  20.         P3M0=0X00;
  21.         P5M1=0X00;
  22.         P5M0=0X00;
  23. }

  24. void main()
  25. {   
  26.         unsigned char i=0;        
  27.         port_mode();
  28.         P5=0XE0;
  29.         P3=0X00;
  30.         while(1)
  31.         {
  32.                 if(K==0)   
  33.                 {
  34.                         delay(20);     
  35.                         if(K==0)         
  36.                         {   
  37.                                 if(++i==9)i=1;
  38.                                 while(!K);
  39.                         }  
  40.                 }
  41.                 switch(i)            
  42.                 {
  43.                         case  1:P3=0x02;break;
  44.                         case  2:P3=0x04;break;
  45.                         case  3:P3=0x08;break;
  46.                         case  4:P3=0x06;break;
  47.                         case  5:P3=0x0a;break;
  48.                         case  6:P3=0x0c;break;
  49.                         case  7:P3=0x0e;break;
  50.                         case  8:                    
  51.                                         P3=0x02;
  52.                                         delay(1000);
  53.                                         P3=0x04;
  54.                                         delay(1000);
  55.                                         P3=0x08;
  56.                                         delay(1000);
  57.                                         P3=0x06;
  58.                                         delay(1000);
  59.                                         P3=0x0a;
  60.                                         delay(1000);
  61.                                         P3=0x0c;
  62.                                         delay(1000);
  63.                                         P3=0x0e;
  64.                                         delay(1000);
  65.                                         i=0;break;
  66.                         default:P3=0X00;break;
  67.                 }
  68.         }   
  69. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2021-10-25 16:44 | 只看該作者
可能的原因:
1、按鍵防彈動(dòng)未做洽當(dāng)。
2、延時(shí)程序占用CPU時(shí)間。(在此時(shí)間里你按鍵了,但程序死在延時(shí)當(dāng)中,還未出來(lái)呢)
解決建議:
1、按鍵用中斷方式識(shí)別。
2、延時(shí)用定時(shí)器做(設(shè)立一個(gè)延時(shí)標(biāo)記,在定時(shí)器中看到標(biāo)記就對(duì)其它計(jì)時(shí),到時(shí)后清除它或設(shè)置一個(gè)你希望的東東,供你延時(shí)判斷用)。
3、主程序延時(shí)處理時(shí),只判斷看延時(shí)標(biāo)記,有則執(zhí)行你想做的事,無(wú)則立即退出。這樣既辦了事,又不耽誤時(shí)間。
回復(fù)

使用道具 舉報(bào)

6#
ID:959346 發(fā)表于 2021-10-25 17:46 | 只看該作者
在執(zhí)行CASE 8部分,有很長(zhǎng)的延時(shí),沒(méi)有辦法檢測(cè)到按鍵。一直到這部分執(zhí)行完,再次跑到按鍵檢測(cè),才能檢測(cè)按鍵,只有在這時(shí)檢測(cè)到按鍵了,才能退出。所以1一直按著不放,等到按鍵檢測(cè)那;2在剛退出case 8操作時(shí),按鍵按下,剛好可以檢測(cè)到,而由于這個(gè)檢測(cè)時(shí)間比case 8操作的時(shí)間小很多,所以有時(shí)靈有時(shí)不靈
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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