怎么樣才能讓51單片機led一邊流水一邊閃爍最笨的法已經會了,由于篇幅要求,哪位大佬幫想一個篇幅少的
uj5u.com熱心網友回復:
篇幅要求?你原先的是怎樣的,發出來看看,才知道如何精簡。uj5u.com熱心網友回復:
{
delay(5000);
P2=0xff;
delay(5000);
P2=0xbf;
delay(5000);
P2=0xff;
delay(5000);
P2=0xdf;
delay(5000);
P2=0xff;
delay(5000);
P2=0xef;
delay(5000);
P2=0xff;
delay(5000);
P2=0xf7;
delay(5000);
P2=0xff;
delay(5000);
P2=0xfb;
delay(5000);
P2=0xff;
delay(5000);
P2=0xfd;
delay(5000);
P2=0xff;
delay(5000);
P2=0xfe;
}
uj5u.com熱心網友回復:
原來就是這個回圈,,,,,,
uj5u.com熱心網友回復:
難道沒學過歸納,不至于連最起碼的歸納都不會?!
void LedXm()
{
P2=0xff;
}
main()
{
unisgend char x=0;
while(1)
{
delay(5000);
if(++x%2) LedXm();
else
{
if(x==2)P2=0xbf;
else if(x==4)P2=0xdf;
else if(x==6)P2=0xef;
else if(x==8)P2=0xf7;
else if(x==10)P2=0xfb;
else if(x==12)P2=0xfd;
else if(x==14){P2=0xfe;x=0;}
}
}
uj5u.com熱心網友回復:
上面拼錯了,更正并修改:
main()
{
unsigend char x=0;
while(1)
{
delay(5000);
if(++x%2) P2=0xff;;
else
{
if(x==2)P2=0xbf;
else if(x==4)P2=0xdf;
else if(x==6)P2=0xef;
else if(x==8)P2=0xf7;
else if(x==10)P2=0xfb;
else if(x==12)P2=0xfd;
else if(x==14){P2=0xfe;x=0;}
}
}
uj5u.com熱心網友回復:
main()
{
unsigned char x=0;
while(1)
{
delay(5000);
if(++x%2) P2=0xff;;
else
{
if(x==2)P2=0xbf;
else if(x==4)P2=0xdf;
else if(x==6)P2=0xef;
else if(x==8)P2=0xf7;
else if(x==10)P2=0xfb;
else if(x==12)P2=0xfd;
else if(x==14){P2=0xfe;x=0;}
}
}
uj5u.com熱心網友回復:
看不懂,,,,,我是剛剛才自學這個
uj5u.com熱心網友回復:
哦,那好,看在你是自學的,你哪里看不懂?你先把程式下載到芯片運行看是否正確,驗證一下。
這樣你把我修改的程式每句都注釋一下,我看看你是哪里看不懂。
好像多了個分號,更正一下:
main()
{
unsigned char x=0;
while(1)
{
delay(5000);
if(++x%2) P2=0xff;
else
{
if(x==2)P2=0xbf;
else if(x==4)P2=0xdf;
else if(x==6)P2=0xef;
else if(x==8)P2=0xf7;
else if(x==10)P2=0xfb;
else if(x==12)P2=0xfd;
else if(x==14){P2=0xfe;x=0;}
}
}
照你給的代碼直接修改的,只能回圈7個LED,你自己認真看看,是否少復制代碼了?
uj5u.com熱心網友回復:
你應該還少了一個7F的狀態,第一次優化后,還可以繼續優化,比如使用陣列:
void main()
{
unsigned char aa[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe},x=0;
unsigned int y=0;
while(1)
{
y=20000;while(y--);
if(++x%2) P2=aa[0];
else P2=aa[x/2];
if(x==16)x=0;
}
}
uj5u.com熱心網友回復:
如果你進一步學習的話還可以使用現有的左移右移函式實作這個效果,當然已經超出了你的提問了。uj5u.com熱心網友回復:
不知道我理解的對不對,一個燈亮,然后所有的燈亮,再然后下一個燈亮...回圈#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
uchar led[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //led閃爍次序
void delay(uint t){ //延遲
while(t--);
}
void main(){
while(1){ //回圈閃爍
for(i=0;i<8;i++){
P2=0x00; //所有的燈全部閃爍
delay(60000);
P2=led[i]; //依次流水閃爍
delay(60000);
}
}
}
uj5u.com熱心網友回復:
我的理解是全黑,然后一個燈亮,再全黑,再下一個燈亮,再全黑。。。全黑簡單,直接輸出0xff就行了,亮燈部分只要用一個0,7個1的位元組,比如0x7F回圈移位輸出即可。這樣只要一個簡單的回圈。
修改這個回圈位元組的值,可以達到不同的亮燈效果,比如用0x77回圈移位輸出:
0111 0111
1011 1011
1101 1101
1110 1110
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/83316.html
標籤:單片機/工控
上一篇:從今天開始記錄我的msp430f149單片機藍牙多功能智能小車制作之旅
下一篇:游戲開發
