C51 动态数码管 个人笔记

8段led管构成一个数字。
开发板上共有8个数字。
每个数字有一个使能端(段选引脚)
每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起
轮流点亮不同数字,速度很快,视觉暂留,从而形成8个数字同时亮的效果

#include <reg51.h>
typedef unsigned int u16;		 
typedef unsigned char u8;

#define DIG P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;


//共阴的表
u8 code ledSegment  [9] = { 0x3f , 0x06,   0x5b,   0x4f,   0x66,   0x6d, 0x7d,   0x07,  0xe6
                            };

void delay(u16 i)
{
    while(i--);
}

void DigDisplay()
{
	u8 i;
	
	for(i=0;i<8;i++)
	{
	//段选,使能8个数码管中的某一个
	//38译码器输出端和动态数码管段选端短接
		switch(i)
		{
			case (0):		//段选选中第一个动态数码管,(共阴,J16^1是公共阴极,输出低电平)
				LSA = 0;	 //J15(38译码器输出)和J16(数码管输入)用短接片短接
				LSB = 0;	 //故J15^1即38译码器输出端Y0与J16^1相同,为低电平
				LSC = 0;	//因此38译码器输入端为000(由真值表知A0是低位,A2是高位)
				break;
			case (1):	LSC = 0;LSB = 0;LSA = 1;break;
			case (2):	LSC = 0;LSB = 1;LSA = 0;break;
			case (3):	LSC = 0;LSB = 1;LSA = 1;break;
			case (4):	LSC = 1;LSB = 0;LSA = 0;break;
			case (5):	LSC = 1;LSB = 0;LSA = 1;break;
			case (6):	LSC = 1;LSB = 1;LSA = 0;break;
			case (7):	LSC = 1;LSB = 1;LSA = 1;break;
		}
	//--位选,选择被使能的数码管中,哪几段点亮,(显示什么数字)
	//P0端口控制动态数码管的8个位选引脚J12
		DIG = ledSegment[i];  //	 共阴,高电平有效
		delay(200); //短暂延时1ms	(去掉或改变时间长度可能会变亮变暗)
		DIG = 0x00;
	}	 
}
void main(void)
{  
    while(1)
    {
        DigDisplay();  
    }
}

posted @ 2018-11-09 17:59  YuQiao0303  阅读(341)  评论(0编辑  收藏  举报