找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求教編程思路 用獨(dú)立按鍵控制流水燈的方向,按一下流水燈從亮的地方反向流轉(zhuǎn)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
      剛學(xué)單片機(jī),學(xué)長布置的題,用獨(dú)立按鍵控制流水燈的方向,按一下流水燈從亮的地方反向流轉(zhuǎn),求教思路,想了很久還沒解決,謝謝好心人了

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
649459021 + 5 很給力!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:65425 發(fā)表于 2017-1-9 09:14 | 只看該作者
八位數(shù)碼管采用共陽極接法(所有陽極接一起接Vcc,陰極接P0口)
按鍵分別接P2.0  P2.1  P2.2(低電平有效)

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1 =P2^0; //按鍵1
sbit key2 =P2^1; //按鍵2
sbit key3 =P2^2; //按鍵3
uchar flag1=0,flag2=0,flag3=0;
void delay_ms(uint z)
{
     uint i,j;
     for(i=0;i<z;i++)
     for(j=0;j<110;j++);
}
void O_to_E() //1,3,5,7與2,4,6,8交替閃爍
{
     P0=0Xaa;
     delay_ms(200);
     P0=~0Xaa;
     delay_ms(200);
}
void key_scan()    //鍵盤掃描
{
     if(!key1)
     {
          delay_ms(10); //延時(shí)消抖
          if(!key1)
          flag1=1;
     }
     if(!key2)
     {
          delay_ms(10); //延時(shí)消抖
          if(!key2)
           flag2=1;
         }
     if(!key3)
     {
          delay_ms(10); //延時(shí)消抖
          if(!key3)
           flag3=1;
     }
}
void main()
{
     uchar i;
     while(1)
     {
            key_scan();
            if(flag1)                               //按鍵一按下?               
            {
                   for(i=0;i<8;i++)            //從左至右亮,每次一盞            
                   {
                            P0=~(0x80>>i);
                            delay_ms(100);
                            key_scan();                 //按鍵掃描   
                            if(flag2||flag3){flag1=0;break;}        //如果有其它按鍵按下響應(yīng)其它按鍵
                   }
             }
             if(flag2)                                //按鍵一按下?                  
             {
                    for(i=0;i<8;i++)             //從右至左亮,每次一盞  
                   {
                            P0=~(0x01<<i);
                            delay_ms(100);
                            key_scan();
                            if(flag1||flag3){flag2=0;break;}
                   }
             }
              if(flag3)
             {
                   O_to_E();                             //奇偶交替閃爍
                   key_scan();
                   if(flag1||flag2)flag3=0;
              }
        }
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:149988 發(fā)表于 2017-1-9 09:21 | 只看該作者

RE: 求教編程思路 用獨(dú)立按鍵控制流水燈的方向,按一下流水燈從亮的地方反向流轉(zhuǎn)

我寫過這樣一個(gè)程序,發(fā)給你參考一下。

單鍵控制循環(huán)燈移動(dòng)樣式.zip

33.52 KB, 下載次數(shù): 1000

回復(fù)

使用道具 舉報(bào)

地板
ID:150865 發(fā)表于 2017-1-9 23:22 | 只看該作者
本帖最后由 espopoi 于 2017-1-9 23:24 編輯

這個(gè)程序能差不多滿足要求,就有一點(diǎn),精度不高,不能在按下的瞬間就從亮的地方返回,他有時(shí)候會(huì)先按原來的順序亮一個(gè)燈,再按相反的順序亮,希望有大神能改進(jìn),

模擬.rar

33.65 KB, 下載次數(shù): 350

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:71584 發(fā)表于 2017-1-10 00:16 | 只看該作者
弄清高低位就好了
回復(fù)

使用道具 舉報(bào)

6#
ID:160860 發(fā)表于 2017-1-10 06:53 | 只看該作者
不倒翁.WZT 發(fā)表于 2017-1-9 09:21
我寫過這樣一個(gè)程序,發(fā)給你參考一下。

嗯嗯,謝謝了。
回復(fù)

使用道具 舉報(bào)

7#
ID:160860 發(fā)表于 2017-1-10 06:57 | 只看該作者
espopoi 發(fā)表于 2017-1-9 23:22
這個(gè)程序能差不多滿足要求,就有一點(diǎn),精度不高,不能在按下的瞬間就從亮的地方返回,他有時(shí)候會(huì)先按原來的 ...

嗯嗯,謝謝啦
回復(fù)

使用道具 舉報(bào)

8#
ID:161074 發(fā)表于 2017-1-10 10:24 | 只看該作者
加一個(gè)鍵盤檢測程序,然后里面寫左右循環(huán)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

9#
ID:156580 發(fā)表于 2017-1-10 10:33 | 只看該作者
espopoi 發(fā)表于 2017-1-9 23:22
這個(gè)程序能差不多滿足要求,就有一點(diǎn),精度不高,不能在按下的瞬間就從亮的地方返回,他有時(shí)候會(huì)先按原來的 ...

應(yīng)該是采用了空循環(huán)做延時(shí),改用定時(shí)器做延時(shí)就好了

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:153041 發(fā)表于 2017-1-10 21:12 | 只看該作者
提供思路僅供參考:
1、流水燈左右循環(huán)通過循環(huán)左移、循環(huán)右移;弄個(gè)變量標(biāo)志方向,每次移動(dòng)判斷一下是左還是右。
2、如果不用定時(shí)器和中斷,那就把你的延時(shí)函數(shù)做成 循環(huán)檢測按鍵,檢測到按鍵就把方向變量反一下。
3、追求精確的延時(shí)用定時(shí)器方便。
4、如果用空循環(huán)等待,把按鍵接到中斷,用中斷方式讀按鍵也行得通。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

11#
ID:140489 發(fā)表于 2017-1-11 14:01 | 只看該作者
#include <REG51.h> //51頭文件

/*********************************************************************************************/

#define DY_PORT                P1 //設(shè)置LED連接的I/O組
#define DY_SPEED        100 //設(shè)置每一個(gè)明亮級(jí)的停留時(shí)間(值域:0~65535)

/*********************************************************************************************

bit [自定義名] ; //定義一個(gè)位(位的值只能是0或1)例:bit LED
#define [代替名]        [原名]  //用代替名代替原名(可以方便修改常改或調(diào)試的值)例:#define LED P1
sbit  [自定義名] = [系統(tǒng)位名] ; //自定義系統(tǒng)位名。例:sbit Add_Key = P3 ^ 1;
unsigned char [自定義名] ; //定義一個(gè)0~255的整數(shù)變量.例:unsigned char a;
unsigned int [自定義名] ; //定義一個(gè)0~65535的整數(shù)變量

/*********************************************************************************************/
void delay (unsigned int a){ // 1ms延時(shí)程序
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 600; i++);//STC單片機(jī)在外部晶振為12MHz時(shí)i值上限為600  
        }                                                       //AT89C51單片機(jī)在外部晶振為12MHz時(shí)i值上限為125
}
/*********************************************************************************************/
void main(void){
        unsigned int i;
        unsigned int temp;
        while(1){
            temp=0x01;
            for(i=0;i<8;i++){ //8個(gè)流水燈逐個(gè)閃動(dòng)
                     DY_PORT=~temp;
                     delay(DY_SPEED);   //調(diào)用延時(shí)函數(shù)
                     temp<<=1;
            }
                temp=0x80;
                for(i=0;i<8;i++){ //8個(gè)流水燈反向逐個(gè)閃動(dòng)
                    DY_PORT=~temp;
                    delay(DY_SPEED);   //調(diào)用延時(shí)函數(shù)
                    temp>>=1;
                   }
            temp=0xFE;
                for(i=0;i<8;i++){ //8個(gè)流水燈依次全部點(diǎn)亮
                     DY_PORT=temp;
                     delay(DY_SPEED);   //調(diào)用延時(shí)函數(shù)
                     temp<<=1;
            }
                   temp=0x7F;
                   for(i=0;i<8;i++){ //8個(gè)流水燈依次反向全部點(diǎn)亮
                     DY_PORT=temp;
                     delay(DY_SPEED);   //調(diào)用延時(shí)函數(shù)
                     temp>>=1;
            }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

12#
ID:161286 發(fā)表于 2017-1-11 14:04 | 只看該作者
功能順序理清楚就行了。。。
回復(fù)

使用道具 舉報(bào)

13#
ID:161477 發(fā)表于 2017-1-12 16:20 | 只看該作者
按鍵做個(gè)標(biāo)志,然后取反
回復(fù)

使用道具 舉報(bào)

14#
ID:153199 發(fā)表于 2017-2-3 11:48 | 只看該作者
不錯(cuò)的分享,值得收藏
回復(fù)

使用道具 舉報(bào)

15#
ID:186719 發(fā)表于 2017-5-5 15:32 | 只看該作者
AVR的好不
回復(fù)

使用道具 舉報(bào)

16#
ID:110456 發(fā)表于 2017-5-5 23:13 | 只看該作者
第一,需要用一個(gè)IO口來控制按鍵,需要進(jìn)行延時(shí)消抖,第二需要讓流水燈做來回點(diǎn)亮構(gòu)成死循環(huán)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

17#
ID:110456 發(fā)表于 2017-5-5 23:14 | 只看該作者
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int  void DelayMS(uint x) {          uchar i;         while(x--)         {                  for(i=200;i>0;i--);         } }  void Move_LED() {          if((P1 &= 0x10)==0)        P0 = _cror_(P0,1);         else if((P1 &= 0x20)==0)        P0 = _crol_(P0,1);         else if((P1 &= 0x40)==0)        P2 = _cror_(P2,1);         else if((P1 &= 0x80)==0)        P2 = _crol_(P2,1); }  void main() {          uchar Recent_Key=0xff;         P0=0xfe;         P1=0xfe;         P2=0xfe;         while(1)         {                  if(Recent_Key != P1)                 {                          Recent_Key=P1;                         Move_LED();                         DelayMS(10);                 }         } }
回復(fù)

使用道具 舉報(bào)

18#
ID:162242 發(fā)表于 2017-5-6 13:10 | 只看該作者
用獨(dú)立按鍵控制流水燈的方向
回復(fù)

使用道具 舉報(bào)

19#
ID:111634 發(fā)表于 2017-5-7 17:37 | 只看該作者
本帖最后由 zl2168 于 2017-5-7 17:51 編輯

實(shí)例7  鍵控流水循環(huán)燈先Proteus仿真一下,確認(rèn)有效。
實(shí)例7 鍵控流水循環(huán)燈.rar (36.04 KB, 下載次數(shù): 175)

以上摘自張志良編著《80C51單片機(jī)Proteus仿真設(shè)計(jì)實(shí)例教程》清華大學(xué)出版社ISBN 978-7-302-41682-1仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。
仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。


回復(fù)

使用道具 舉報(bào)

20#
ID:197820 發(fā)表于 2017-5-7 17:43 | 只看該作者
設(shè)置一個(gè)全局bit型變量,打開外部中斷,用按鍵產(chǎn)生中斷,在中斷程序里吧bit型變量取反,然后在主程序里判斷bit變量,1就正移動(dòng),0就反移動(dòng)。這樣就能實(shí)現(xiàn)用按鍵控制流水燈正反向了

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

21#
ID:197820 發(fā)表于 2017-5-7 17:45 | 只看該作者
設(shè)置一個(gè)全局的bit變量,在外部中斷函數(shù)里取反這個(gè)變量的值,在主程序判斷bit是1還是0來控制流水燈正反。
回復(fù)

使用道具 舉報(bào)

22#
ID:197826 發(fā)表于 2017-5-7 17:51 | 只看該作者
不錯(cuò)的分享,值得收藏
回復(fù)

使用道具 舉報(bào)

23#
ID:216258 發(fā)表于 2018-3-16 21:14 | 只看該作者
向前看zk 發(fā)表于 2017-1-9 09:14
八位數(shù)碼管采用共陽極接法(所有陽極接一起接Vcc,陰極接P0口)
按鍵分別接P2.0  P2.1  P2.2(低電平有效 ...

請教一下,此程序要怎么改成按鍵按下不放執(zhí)行程序,放開按鍵不執(zhí)行程序,每次按下按鍵重新執(zhí)行程序,謝謝
回復(fù)

使用道具 舉報(bào)

24#
ID:437955 發(fā)表于 2018-12-2 21:30 | 只看該作者
求一個(gè)按鍵流水燈的程序和仿真圖
回復(fù)

使用道具 舉報(bào)

25#
ID:438961 發(fā)表于 2018-12-4 09:54 | 只看該作者
不要在流水燈程序里延時(shí)循環(huán),這樣需要等運(yùn)行完一遍了才能換向?梢杂枚〞r(shí)器的方式
回復(fù)

使用道具 舉報(bào)

26#
ID:439490 發(fā)表于 2018-12-4 20:12 | 只看該作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

void delay(uint z);
void main()
{
        uchar  num,dat1,dat2;
        delay(500);
        P0=0;
        while(1)
        {
                dat1=0xfe;
                dat2=0x7f;
                for(num=0;num<7;num++)
                {
                        P1=dat1;          //初始化賦值
                        dat1=dat1<<1; //右移一位
                        delay(500);   //延時(shí)       
                }
                for(num=0;num<7;num++)
                {
                        P1=dat2;          //初始化賦值
                        dat2=dat2>>1; //右移一位
                        delay(500);   //延時(shí)       
                }
        }
void delay(uint z)
{
    uchar j;
    for(z;z>0;z--)
        for(j=200;j>0;j--);
回復(fù)

使用道具 舉報(bào)

27#
ID:160860 發(fā)表于 2020-12-2 13:40 | 只看該作者
不倒翁.WZT 發(fā)表于 2017-1-9 09:21
我寫過這樣一個(gè)程序,發(fā)給你參考一下。

好久沒上過這個(gè)論壇啦,登上來之后看到這么多熱心的人,感激不盡
回復(fù)

使用道具 舉報(bào)

28#
ID:160860 發(fā)表于 2020-12-2 13:42 | 只看該作者
zl2168 發(fā)表于 2017-5-7 17:37
實(shí)例7  鍵控流水循環(huán)燈先Proteus仿真一下,確認(rèn)有效。

剛看到您的評(píng)論,好幾年了,感謝
回復(fù)

使用道具 舉報(bào)

29#
ID:851329 發(fā)表于 2020-12-16 18:46 | 只看該作者
加一個(gè)按鍵控制,用循環(huán)和延時(shí)就可以
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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