1.流水燈的本質(zhì)分析
(1)流水燈的本質(zhì)其實(shí)就是不同的亮的狀態(tài)相應(yīng)間隔一定的時(shí)間。
(2)流水燈
第一個(gè)狀態(tài)等于0x80(10000000)
第一個(gè)狀態(tài)等于0x40(01000000)
第一個(gè)狀態(tài)等于0x20(00100000)
第一個(gè)狀態(tài)等于0x10(00010000)
第一個(gè)狀態(tài)等于0x08(00001000)
第一個(gè)狀態(tài)等于0x04(00000100)
第一個(gè)狀態(tài)等于0x02(00000010)
第一個(gè)狀態(tài)等于0x01(00000001)
(3)延長(zhǎng)時(shí)間越長(zhǎng),流水燈就流的越慢,越短就流水越快
(4)8個(gè)狀態(tài)一次執(zhí)行,完成后從頭開(kāi)始,其實(shí)就是一個(gè)循環(huán)
#include <reg51.h>
void delay(void)
{
unsigned char i = 100;
unsigned char i = 100;
while (i--)
{
while (j--);
}
}
void main(void)
{
while (1)
{
p0 = 0x80;
delay();
p0 = 0x40;
delay();
p0 = 0x20;
delay();
p0 = 0x10;
delay();
p0 = 0x08;
delay();
p0 = 0x04;
delay();
p0 = 0x02;
delay();
p0 = 0x01;
delay();
}
}
2.上一節(jié)程序的缺陷分析
(1)功能實(shí)現(xiàn)了,但是寫的太笨了,如果狀態(tài)變多程序就更長(zhǎng)。
(2)改進(jìn)思路:通過(guò)變量運(yùn)算來(lái)得到合適的端口輸出值
①首先定義變量unsigned char a;,初值等于0x80(10000000)
②8個(gè)狀態(tài),其實(shí)就是a依次右移0-7位
③我們這樣就相當(dāng)于是用C語(yǔ)言讓單片機(jī)去運(yùn)算得到每個(gè)狀態(tài)的端口值,而不用自己事先去計(jì)算好。這樣程序就簡(jiǎn)化了。
(3)C語(yǔ)言移位運(yùn)算介紹
C語(yǔ)言中有移位運(yùn)算符, >> 可以右移,<< 可以左移。(無(wú)符號(hào)所屬移位:移出去的位丟掉了,空出來(lái)的位用0補(bǔ))。
寫法一:d本身沒(méi)有發(fā)生改變,一直是0x80
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i--)
{
for (j=0; j<200; j--);
}
}
void main(void)
{
unsigned char i =0;
unsigned char d = 0x80;
while (1)
{
for (i=0; i<8; i++)
{
p0 = (d >> i);
delay();
}
}
}
寫法二:d本身發(fā)生改變,0x80~0x0變化中
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i--)
{
for (j=0; j<200; j--);
}
}
void main(void)
{
unsigned char i =0;
while (1)
{
unsigned char d = 0x80;
for (i=0; i<8; i++)
{
d = d >> 1;
p0 = d;
delay();
}
}
}
3.跑馬燈效果實(shí)現(xiàn)
3.1、什么是跑馬燈
跑馬燈和流水燈很像,不同的是:流水燈是8顆LED其中7滅1亮,亮的在移動(dòng);跑馬燈是8顆LED7亮1滅,滅的在移動(dòng)。
3.2、實(shí)現(xiàn)思路分析:
(1)一個(gè)個(gè)計(jì)算,01111111——0x7f
(2)左移(右移)+ 按位取反,10000000——~——01111111
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i++)
for (j=0; j<200; j++);
}
void main(void)
{
unsigned char i = 0;
while (1)
{
unsigned char d = 0x80;
for (i=0; i<8; i++)
{
p0 = ~d;
d >>= 1;
delay();
}
}
}