找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3432|回復(fù): 10
收起左側(cè)

關(guān)于51單片機(jī)按鍵控制程序調(diào)試

[復(fù)制鏈接]
ID:372579 發(fā)表于 2021-11-8 09:57 | 顯示全部樓層 |閱讀模式
30黑幣
就是想做一個按鍵控制幾個LED燈的程序,一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,按鍵按兩次第二個燈亮,并延時熄滅,以此類推,當(dāng)累計(jì)到第八次時,全滅,第九次又回到第一個燈亮,重新累計(jì)。下面是自己寫的,就只有第一次會亮,大家?guī)兔聪,謝謝!

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit led0 = P1^0;
sbit led1 = P1^1;
sbit led2 = P1^2;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
void delay(uint);
void main()
{
        P1=0xff;           
        if(key1==0)
                {
                        delay(20);
                         if(key1==0)
                                 led1=0;
                                delay(5000);
                }

        if(key2==0)
                {
                        delay(20);
                         if(key2==0)
                                 led2=0;
                                delay(5000);
                }           
        void delay(uint z)
{
        uint x,y;
                for(x=z;x>0;x--)
                        for(y=109;y>0;y--);
}

回復(fù)

使用道具 舉報(bào)

ID:277550 發(fā)表于 2021-11-8 11:08 | 顯示全部樓層
邏輯有些許不清晰

是連續(xù)按2次(較短時間內(nèi))、

還是
開始
按第1次、亮LED1、延時熄滅
按第2次、亮LED2、延時熄滅
..........
按第8次、亮LED8、延時熄滅
按第9次、沒動作
循環(huán)至“開始”
回復(fù)

使用道具 舉報(bào)

ID:372579 發(fā)表于 2021-11-8 11:41 | 顯示全部樓層
devcang 發(fā)表于 2021-11-8 11:08
邏輯有些許不清晰

是連續(xù)按2次(較短時間內(nèi))、

就是按一次延時熄滅,如果再按一次,那就是兩次,那么就第二個燈亮,然后延時熄滅,且每個燈延時時間不一樣
回復(fù)

使用道具 舉報(bào)

ID:514901 發(fā)表于 2021-11-8 14:27 | 顯示全部樓層
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1 = P3^4;
void delay(uint);
void main()
{
    char cnt = 0;
    P1=0xff;   
    while(1)
    {
       if(key1 == 0)
       {
          delay(10);
          if(key1 == 0)
          {
              if(++cnt==9)
                  cnt = 0;
              P1 = ~(0X0001 << cnt)              
          }
       }
    }      
}   
void delay(uint z)
{
        uint x,y;
                for(x=z;x>0;x--)
                        for(y=109;y>0;y--);
}
回復(fù)

使用道具 舉報(bào)

ID:313048 發(fā)表于 2021-11-8 15:32 | 顯示全部樓層
  1. unsigned long int g_timeMs = 0;                //做全局變量        
  2. unsigned int Time[8][2] = {};                //這里為你每個燈要延時的時間  8個燈  2前面為要延時的時間   后面那個為按下的時間
  3. int main()
  4. {
  5.         unsigned char key_value = 0;
  6.         timer_init();                //定時器初始化 1ms
  7.         key_init();
  8.         led_init();
  9.         while(1)
  10.         {
  11.                 if(key_scan() == true)  //按鍵檢測是否按下  按下返回true
  12.                 {
  13.                         key_value++;
  14.                         Time[key_value][1] = g_timeMs;  //保存按下的時間
  15.                         //開相應(yīng)的燈
  16.                 }
  17.                 //下面進(jìn)行輪詢查詢時間
  18.                 for(char i = 0;i<8;i++)
  19.                 {
  20.                         if(Time[i][0]< (g_timeMs - Time[i][1])) //亮的時間到了
  21.                         {
  22.                                 //關(guān)閉相對應(yīng)的燈
  23.                         }
  24.                 }
  25.         }
  26.         
  27. }

  28. void timer0 interrupt 1
  29. {
  30.         g_timeMs++;
  31. }
復(fù)制代碼

僅做參考,這樣不需要硬延時,亮的時間可以隨意定,只要不是太大就可以了,只提供此思路,直接長時間使用可能會出現(xiàn)g_timeMs越界的問題,不過一般自己玩還是不會出現(xiàn)這個問題的。
回復(fù)

使用道具 舉報(bào)

ID:976661 發(fā)表于 2021-11-8 15:57 | 顯示全部樓層
程序缺少while(1),沒有while(1)的程序只能運(yùn)行一次
回復(fù)

使用道具 舉報(bào)

ID:313048 發(fā)表于 2021-11-8 16:11 | 顯示全部樓層


unsigned long int g_timeMs = 0;                //做全局變量       
unsigned int Time[8][2] = {};                //這里為你每個燈要延時的時間  8個燈  2前面為要延時的時間   后面那個為按下的時間
int main()
{
        unsigned char key_value = 0;
        timer_init();                //定時器初始化 1ms
        key_init();
        led_init();
        while(1)
        {
                if(key_scan() == true)  //按鍵檢測是否按下  按下返回true
                {
                        key_value++;
                        Time[key_value][1] = g_timeMs;  //保存按下的時間
                        //開相應(yīng)的燈
                }
                //下面進(jìn)行輪詢查詢時間
                for(char i = 0;i<8;i++)
                {
                        if(Time[i][0]< (g_timeMs - Time[i][1])) //亮的時間到了
                        {
                                //關(guān)閉相對應(yīng)的燈
                        }
                }
        }
       
}

void timer0 interrupt 1
{
        g_timeMs++;
}


大致就這樣吧  可以隨便設(shè)置要亮的時間,不過要考慮g_timeMs越界的問題,但是自己玩玩的話應(yīng)該是沒問題的,畢竟要越界還是要很長很長的時間的。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-8 16:16 | 顯示全部樓層
你說: 一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,以此類推,當(dāng)累計(jì)到第八次時,全滅,

疑惑:8個燈 第一 第一個燈亮滅, 第8次不是應(yīng)該 第八個燈  亮  滅?  怎么變?nèi)珳缌耍?到底應(yīng)該以什么,怎么  “推” ? 是當(dāng)中某一次亮兩個燈?還是第八個燈另有用途? 還是把全滅 推后到 第9次??

你又說: 第九次又回到第一個燈亮,重新累計(jì)。
疑問: 到底還要不要有全滅這個擋位? 全滅這個檔位到底如何設(shè)計(jì)? 前面8個燈都亮 然后滅了, 在這個時候按第九次 究竟應(yīng)該如何體現(xiàn)(本來就全滅著……)?
回復(fù)

使用道具 舉報(bào)

ID:372579 發(fā)表于 2021-11-8 21:05 | 顯示全部樓層
188610329 發(fā)表于 2021-11-8 16:16
你說: 一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,以此類推,當(dāng)累計(jì)到第八次時,全滅,

...

不好意思,這里應(yīng)該是第九次全滅,我弄錯了
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-8 21:34 | 顯示全部樓層
aide51 發(fā)表于 2021-11-8 21:05
不好意思,這里應(yīng)該是第九次全滅,我弄錯了

全滅這個檔位到底如何設(shè)計(jì)? 前面8個燈都亮 然后滅了, 在這個時候按第九次 究竟應(yīng)該如何體現(xiàn)(本來就全滅著……)?
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-11-9 10:26 | 顯示全部樓層
沒有主循環(huán)while(1),給你改好了。
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key1 = P3^4;
  5. uint i,j;
  6. void delay(uint);

  7. void main()
  8. {
  9.         while(1)
  10.         {   
  11.                 if(key1==0)
  12.                 {
  13.                         delay(20);
  14.                         if(key1==0)
  15.                         {
  16.                                 P1=~(0x01<<i);
  17.                                 delay(1000);
  18.                                 i=++i%8;
  19.                         }
  20.                 }
  21.                 P1=0xff;
  22.         }
  23. }
  24.    
  25. void delay(uint z)
  26. {
  27.         uint x,y;
  28.         for(x=z;x>0;x--)
  29.                 for(y=120;y>0;y--);
  30. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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