找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)流水燈程序如何加個開關(guān)換向?

[復(fù)制鏈接]
ID:1047343 發(fā)表于 2022-10-11 20:24 | 顯示全部樓層 |閱讀模式
想要用p1的開關(guān)來控制流水燈的方向改變,求解決思路

單片機(jī)源程序如下:
#include<reg52.h>   //頭文件
#include<intrins.h>
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義
void delayms(uchar ms) //延時子函數(shù)
{
   uchar i;
   while(ms--)
   for(i=0;i<123;i++);
}
void main()//主函數(shù)
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延時100ms
      P0=(P0<<1)|(P0>>7);//循環(huán)移位
    }
}  
1.png
回復(fù)

使用道具 舉報

ID:121859 發(fā)表于 2022-10-12 08:41 | 顯示全部樓層
#include<reg52.h>   //頭文件
#include<intrins.h>
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義

sbit Key = P1^0;
bit  Forward;

void delayms(uchar ms) //延時子函數(shù)
{
   uchar i;
   while(ms--)
   {
        for(i=0;i<123;i++);        //酌情減小
   }
}
void main()//主函數(shù)
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延時100ms
      if(Key==0)
      {
        while(Key==0);
        Forward = !Forward;
      }
      if(Forward){P0=(P0<<1)|0x01;if(P0==0xff)P0=0xfe;}
      else{P0=(P0>>1)|0x80;if(P0==0xff)P0=0x7f;}
    }
}
回復(fù)

使用道具 舉報

ID:1047343 發(fā)表于 2022-10-11 22:45 來自觸屏版 | 顯示全部樓層
求大伙指點一下
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-11 23:07 | 顯示全部樓層
在你的代碼基礎(chǔ)上改的。

#include<reg52.h>   //頭文件
#include<intrins.h>
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義

sbit Key = P1^0;
bit        Press,Forward;

void delayms(uchar ms) //延時子函數(shù)
{
   uchar i;
   while(ms--)
   {
           if(Key == 0) Press = 1;        //檢查Key
        for(i=0;i<123;i++);        //酌情減小
   }
}
void main()//主函數(shù)
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延時100ms
      if(Press)
      {
              Press = 0;
        Forward = !Forward;
      }
      if(Forward)      P0=(P0<<7)(P0>>1);//循環(huán)移位
      else      P0=(P0<<1)(P0>>7);//循環(huán)移位
    }
}

回復(fù)

使用道具 舉報

ID:1047343 發(fā)表于 2022-10-12 08:10 | 顯示全部樓層
188610329 發(fā)表于 2022-10-11 23:07
在你的代碼基礎(chǔ)上改的。

這連原來的循環(huán)都沒有了,p1.0的開關(guān)也沒用上
回復(fù)

使用道具 舉報

ID:1047343 發(fā)表于 2022-10-12 08:20 | 顯示全部樓層
188610329 發(fā)表于 2022-10-11 23:07
在你的代碼基礎(chǔ)上改的。

對不起是我的問題,代碼是正確的,感謝指導(dǎo)
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2022-10-12 09:04 | 顯示全部樓層
1、沒有換相這一說!也沒有流水這一說。∵@有N個燈從一個顯示狀態(tài)【A】,切換成另一個顯示狀態(tài)【B】而矣!。
【A】=第3個燈亮,【B】=第4個燈亮,于是就認(rèn)為是向右了。
【A】=第3個燈亮,【B】=第2個燈亮,于是就認(rèn)為是向左了。
2、任意給個信號(如開關(guān)),收到信號后,修改一個[【A】【B】的狀態(tài)就可以達(dá)成,你希望的任何狀態(tài)形式。
回復(fù)

使用道具 舉報

ID:1047343 發(fā)表于 2022-10-12 10:23 來自觸屏版 | 顯示全部樓層
zhxiufan 發(fā)表于 2022-10-12 08:41
#include   //頭文件
#include
#define uchar unsigned char//宏定義

這個優(yōu)化了上面的,把key從延時函數(shù)里移到了主函數(shù)里,感謝大佬
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-12 12:02 | 顯示全部樓層
zephry 發(fā)表于 2022-10-12 10:23
這個優(yōu)化了上面的,把key從延時函數(shù)里移到了主函數(shù)里,感謝大佬

到底是不是優(yōu)化,當(dāng)你多按幾次按鍵,或者,你把  delayms(uchar ms)   這個 uchar  修正成 uint  
你delayms(500); 這個 500 正確傳遞進(jìn)去了(你現(xiàn)在傳得其實是244), 你就明白 為什么  按鍵判斷要寫在  delay 函數(shù)里了。
回復(fù)

使用道具 舉報

ID:1047409 發(fā)表于 2022-10-12 13:23 | 顯示全部樓層
#include <REGX51.H>
unsigned char k=0;
void delay(unsigned int num)
{
         unsigned int i,j;
         for(i=0;i<num;i++)
         for(j=0;j<120;j++)
        ;
}
void main()
{
         unsigned char i,j;  
       
          IT0=1; //ÅäÖÃ′¥·¢·½ê½£¬Ï½μÑØ′¥·¢
          EX0=1;  //ÖD¶ÏÔêDí
          EA=1;  //×ü¿a1Ø
          PX0=0;  //ÖD¶ÏóÅÏè¼¶£¬Ä¬èÏóÅÏè¼¶¿éòÔê¡
          while(1)
                {
                if(k==0)
                        {
                                j=0xfe;
                                for(i=0;i<8;i++) //¶¨òåiÎa0~8μÄìõ¼têy£¬jÎaLED1μ½8μÄ
                                 {
                                        P1=j;
                                        j=(j<<1)|0x01;
                                        delay(300);
                                 }
                  }                       
                        else
                        {
                                        j=0x7f;
                                        for(i=8;i>0;i--)
                                 {
                                        P1=j;
                                        j=(j>>1)|0x80;
                                        delay(300);
                                 }
                        }
                }
}

void waib0() interrupt 0  //°′ò»ÏÂè¡·′
{
        k=~k;
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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