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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于51單片機按鍵控制程序調試

[復制鏈接]
跳轉到指定樓層
樓主
ID:372579 發表于 2021-11-8 09:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
30黑幣
就是想做一個按鍵控制幾個LED燈的程序,一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,按鍵按兩次第二個燈亮,并延時熄滅,以此類推,當累計到第八次時,全滅,第九次又回到第一個燈亮,重新累計。下面是自己寫的,就只有第一次會亮,大家幫忙看下,謝謝!

#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--);
}

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

使用道具 舉報

沙發
ID:277550 發表于 2021-11-8 11:08 | 只看該作者
邏輯有些許不清晰

是連續按2次(較短時間內)、

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

使用道具 舉報

板凳
ID:372579 發表于 2021-11-8 11:41 | 只看該作者
devcang 發表于 2021-11-8 11:08
邏輯有些許不清晰

是連續按2次(較短時間內)、

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

使用道具 舉報

地板
ID:514901 發表于 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--);
}
回復

使用道具 舉報

5#
ID:313048 發表于 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.                         //開相應的燈
  16.                 }
  17.                 //下面進行輪詢查詢時間
  18.                 for(char i = 0;i<8;i++)
  19.                 {
  20.                         if(Time[i][0]< (g_timeMs - Time[i][1])) //亮的時間到了
  21.                         {
  22.                                 //關閉相對應的燈
  23.                         }
  24.                 }
  25.         }
  26.         
  27. }

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

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

使用道具 舉報

6#
ID:976661 發表于 2021-11-8 15:57 | 只看該作者
程序缺少while(1),沒有while(1)的程序只能運行一次
回復

使用道具 舉報

7#
ID:313048 發表于 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;  //保存按下的時間
                        //開相應的燈
                }
                //下面進行輪詢查詢時間
                for(char i = 0;i<8;i++)
                {
                        if(Time[i][0]< (g_timeMs - Time[i][1])) //亮的時間到了
                        {
                                //關閉相對應的燈
                        }
                }
        }
       
}

void timer0 interrupt 1
{
        g_timeMs++;
}


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

使用道具 舉報

8#
ID:624769 發表于 2021-11-8 16:16 | 只看該作者
你說: 一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,以此類推,當累計到第八次時,全滅,

疑惑:8個燈 第一 第一個燈亮滅, 第8次不是應該 第八個燈  亮  滅?  怎么變全滅了? 到底應該以什么,怎么  “推” ? 是當中某一次亮兩個燈?還是第八個燈另有用途? 還是把全滅 推后到 第9次??

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

使用道具 舉報

9#
ID:372579 發表于 2021-11-8 21:05 | 只看該作者
188610329 發表于 2021-11-8 16:16
你說: 一個按鍵控制8個LED,按鍵按一次,第一個燈亮,并延時熄滅,以此類推,當累計到第八次時,全滅,

...

不好意思,這里應該是第九次全滅,我弄錯了
回復

使用道具 舉報

10#
ID:624769 發表于 2021-11-8 21:34 | 只看該作者
aide51 發表于 2021-11-8 21:05
不好意思,這里應該是第九次全滅,我弄錯了

全滅這個檔位到底如何設計? 前面8個燈都亮 然后滅了, 在這個時候按第九次 究竟應該如何體現(本來就全滅著……)?
回復

使用道具 舉報

11#
ID:213173 發表于 2021-11-9 10:26 | 只看該作者
沒有主循環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. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美另类视频在线 | 一区二区视频 | 91九色网站 | 一级毛片免费完整视频 | 欧美午夜影院 | 亚洲人人 | 日韩中文字幕一区二区三区 | 天天操操| 久久久www成人免费无遮挡大片 | 久久久久久久国产精品 | 亚洲第一黄色网 | 岛国二区| 免费福利视频一区二区三区 | 国产精品大片在线观看 | 免费黄色的网站 | 男女啪啪网址 | 精品福利一区 | 日日干日日射 | 成人在线免费看 | 国产日韩精品视频 | 亚洲综合天堂网 | 成人在线视频网 | 91视频三区 | 成人久久18免费网站麻豆 | 91嫩草精品| 成人福利影院 | 亚洲一区二区三区视频在线 | 亚洲一卡二卡 | 国产精品一区二区免费看 | 国产精品视频不卡 | 性色在线| 国产精品国产a级 | 免费看一区二区三区 | 久久久精品久久 | 97精品超碰一区二区三区 | av日韩在线播放 | 久久精品亚洲成在人线av网址 | 久久久久久网 | 日本视频中文字幕 | 成人欧美一区二区三区在线观看 | 久草99 |