P2.3引脚控制着到底是数码管可以亮还是led灯可以亮,所以实际上两者是不会同时亮的,肉眼观察到的同时亮其实是一个高速动态扫描切换的过程。
实现流水灯,如果使用延时来达到视觉停留效果,就需要确定好延时的时间是多久,如果延时时间太短,则会影响流水灯的显示效果;如果时间过长,则数码管显示会有影响。
所以使用累加计数分频的方法就更方便一点,代码如下:
#include <STC15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char
uchar duanxuan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f};
uchar weixuan[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
sbit led_sel = P2 ^ 3;
uchar uiLed = 0x01;
uint uiLedCnt = 0;
uchar i = 0;
void Init()
{
P0M1 = 0x00;
P0M0 = 0xff;
P2M1 = 0x00;
P2M0 = 0xff;
led_sel = 0;
}
void delay_ms( uint n )
{
while( n )
{
uchar i, j;
i = 11;
j = 190;
do
{
while ( --j );
}
while ( --i );
n--;
}
}
void main()
{
Init();
while( 1 )
{
led_sel = 0;
for( i = 0; i < 8; i++ )
{
P0 = 0;
P2 = weixuan[i];
P0 = duanxuan[i];
delay_ms( 1 );
}
uiLedCnt++;
led_sel = 1;
P0 = uiLed;
delay_ms( 1 );
if( uiLedCnt == 50 )
{
if( uiLed == 0x80 )
uiLed = 0x01;
else
uiLed = uiLed << 1;
uiLedCnt = 0;
}
}
}
其中uiLedCnt就是要来计数的,每计到50次,led灯就左移一位。通过这种方法就能减少流水灯和数码管之间的干扰(PS:可以试着观察led灯的亮度,会发现亮度比单独使用led灯时的亮度更暗,这是因为led灯发光时间的占比改变了)。
(若有不足和错误,还请各位斧正)