程序设计目标及程序运行效果说明
从左到右8个数码管分别显示1、2、3、4、5、6、7、8。LED灯从右往左依次亮起。
工作原理
P0口的8位输出分别控制8个发光二极管L0~L7的阳极;而P2.3经反相器U4C控制8个发光管阴极E3;当阳极为高(对应P0口位为1)、阴极为低时,对应的二极管将会发光。
而P2.3经反相器U4C控制74HC138的使能信号E3,结合P2.0、P2.1、P2.2这3个位选控制信号确定8个LED数码管中的哪个被点亮;电阻R15~R22为限流电阻。当段选为高、使能信号有效时,对应的LED管将会发光。
通过以一定频率扫描位选信号,选择段选信号进行数码管点亮一段时间,从而给人视觉上几个数码管几乎同时显示的效果;同时扫描led,使led从左到右不断亮起。
代码如下:
#include<STC15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char
uchar arrSeg7Select[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
uchar arrDigitSelect[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
sbit sbtLedSel=P2^3;
uchar value=0x01; //LEDµÆÖµ¼Ä´æ
uint uiLedCnt=0; //LEDµÆÀۼƼÆÊýÆ÷
uchar i=0; //ÊýÂë¹ÜɨÃèÏÔʾѻ·
/*---------³õʼ»¯º¯Êý---------*/
void Init()
{
P0M1=0x00;
P0M0=0xff;
P2M1=0x00;
P2M0=0x08;
sbtLedSel=0; //ÏÈÑ¡ÔñÊýÂë¹ÜÁÁ
}
/*---------ÑÓʱº¯Êý---------*/
void delay(int n)
{
while(n--);
}
/*---------Ö÷º¯Êý---------*/
void main()
{
Init();
while(1)
{
sbtLedSel=0;
for(i=0;i<8;i++)
{
P0=0;
P2=arrDigitSelect[i];
P0=arrSeg7Select[i+1];
delay(600);
}
uiLedCnt++;
sbtLedSel=1;
P0=value;
delay(600);
if(uiLedCnt==50)
{
if(value==0x80)
value=0x01;
else
value<<=1;
uiLedCnt=0;
}
}
}
看似简单的程序实际上并不简单,需要注意以下几点:
(1)数码管的扫描频率要高一点,才能有视觉上的显示效果。
(2)流水灯的扫描频率不能过高,否则灯的亮度难以保证,所以需要分频。