原理:
因为数码管有8个,我们必须采用38译码器来节省单片机的资源,这里先简单介绍一下38译码器的原理,之后会慢慢补充常用芯片的原理和工作方法。
功能:38译码器有三个信号输入端,2的3次方就是8,有八种输出情况,每种情况对应一个输出,八个数码管分别连接八个输出,三个输入就可以实现八个数码管的动态显示。
真值表:
代码:
#include <reg52.h>
#define SMG P0
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//配置38译码器,到时候要用
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 SMG_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管显示0到F,但是实验只需要八个,即0到7
void delay(u16 i)
{
while(i--);
}
void SMG_show(void)
{
u8 i;
for(i=0;i<8;i++) //循环八次,依次替换
{
switch(i) //位选
{
case 0:LSC=1;LSB=1;LSA=1;break; //当111时,第一个输出高电平,别的都是低电平,其他以此类推
case 1:LSC=1;LSB=1;LSA=0;break;
case 2:LSC=1;LSB=0;LSA=1;break;
case 3:LSC=1;LSB=0;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=0;LSB=1;LSA=0;break;
case 6:LSC=0;LSB=0;LSA=1;break;
case 7:LSC=0;LSB=0;LSA=0;break;
}
SMG=SMG_code[i]; //让P0端口输出电平
delay(100); //其实你看到八个数码管都在显示,是假的,他们是依次亮的,只是人眼看不出来。
SMG=0x00; //减少闪烁
}
}
void main(void)
{
while(1)
{
SMG_show(); //引用显示函数
}
}