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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求教編程思路 用獨立按鍵控制流水燈的方向,按一下流水燈從亮的地方反向流轉

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

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:65425 發表于 2017-1-9 09:14 | 只看該作者
八位數碼管采用共陽極接法(所有陽極接一起接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); //延時消抖
          if(!key1)
          flag1=1;
     }
     if(!key2)
     {
          delay_ms(10); //延時消抖
          if(!key2)
           flag2=1;
         }
     if(!key3)
     {
          delay_ms(10); //延時消抖
          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;}        //如果有其它按鍵按下響應其它按鍵
                   }
             }
             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;
              }
        }
}
回復

使用道具 舉報

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

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

我寫過這樣一個程序,發給你參考一下。

單鍵控制循環燈移動樣式.zip

33.52 KB, 下載次數: 1000

回復

使用道具 舉報

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

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

模擬.rar

33.65 KB, 下載次數: 350

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

嗯嗯,謝謝了。
回復

使用道具 舉報

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

嗯嗯,謝謝啦
回復

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

應該是采用了空循環做延時,改用定時器做延時就好了

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

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

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

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

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

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

13#
ID:161477 發表于 2017-1-12 16:20 | 只看該作者
按鍵做個標志,然后取反
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

16#
ID:110456 發表于 2017-5-5 23:13 | 只看該作者
第一,需要用一個IO口來控制按鍵,需要進行延時消抖,第二需要讓流水燈做來回點亮構成死循環

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

17#
ID:110456 發表于 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);                 }         } }
回復

使用道具 舉報

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

使用道具 舉報

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

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

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


回復

使用道具 舉報

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

26#
ID:439490 發表于 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);   //延時       
                }
                for(num=0;num<7;num++)
                {
                        P1=dat2;          //初始化賦值
                        dat2=dat2>>1; //右移一位
                        delay(500);   //延時       
                }
        }
void delay(uint z)
{
    uchar j;
    for(z;z>0;z--)
        for(j=200;j>0;j--);
回復

使用道具 舉報

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

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

使用道具 舉報

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

剛看到您的評論,好幾年了,感謝
回復

使用道具 舉報

29#
ID:851329 發表于 2020-12-16 18:46 | 只看該作者
加一個按鍵控制,用循環和延時就可以
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天天天操| 午夜不卡一区二区 | 成人福利在线 | 国产精品一区二区在线播放 | 日韩欧美网 | 国产女人与拘做受视频 | 黄色一级免费 | 欧美精品一区二区在线观看 | 亚洲三区视频 | 91麻豆精品一区二区三区 | 9久久精品| 亚洲在线观看视频 | 九九精品在线 | 亚洲一区二区av | 一级a性色生活片久久毛片 午夜精品在线观看 | 一区二区日本 | 国产美女特级嫩嫩嫩bbb片 | 久久精品一区二区三区四区 | 青青草一区 | 久久综合一区 | 亚洲精品一区中文字幕乱码 | 日本高清aⅴ毛片免费 | 久久99这里只有精品 | 人人人干| 国产成人av一区二区三区 | 久久国产区 | 综合五月 | 国产精品美女在线观看 | 狠狠色香婷婷久久亚洲精品 | 久久另类| 在线欧美小视频 | h视频在线看 | 日韩久久中文字幕 | 国产午夜在线 | 一区在线观看 | 成人免费视频7777777 | 综合久久综合久久 | 黑人巨大精品欧美黑白配亚洲 | 99久久精品免费看国产四区 | 国产999精品久久久久久 | 精品三级 |