03DSEG动态数码管

一、第一个数码管显示0,第二个数码管显示1

#include<stc15.h>

void Delay_MS(unsigned int MS);
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	while(1)
	{
		P2=0XC0;P0=0X01;//打开数码管控制位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=0XC0;//打开数码管控制段选的锁存器,然后给上述选中的数码管输出码值
		Delay_MS(1);
		P2=0XC0;P0=0X02;//打开数码管控制位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=0XF9;//打开数码管控制段选的锁存器,然后给上述选中的数码管输出码值
		Delay_MS(1);
	}
	
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}

二、多个数码管显示不同内容(创建数码管显示子函数)

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	while(1)
	{
		
		SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;//方便改变内容
		SEG_Display(SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8);
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba)
{
		P0=0XFF;//阴影消除
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

改进1、创建多个子函数

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
void SEG_Display12(unsigned char yi,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	while(1)
	{
		
		SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;//方便改变内容
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
		
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
		P0=0XFF;//阴影消除
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}
void SEG_Display34(unsigned char san,unsigned char si)
{	
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}	
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

改进2、使用宏定义,用字符代替数据类型的定义或者用类型定义,用字符代替数据类型的定义

#define  uchar unsigned char
#define  uint unsigned int
(typedef unsigned char uchar;
   typedef unsigned int uint;后面要加分号)

#include<stc15.h>
#define  uchar unsigned char
#define  uint unsigned int
//typedef unsigned char uchar;
//typedef unsigned int uint;
unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(uint MS);

void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(uchar wu,uchar liu);
void SEG_Display78(uchar qi,uchar ba);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;
	
	while(1)
	{
	SEG1=1,SEG2=2;SEG3=3;SEG4=4;SEG5=5;SEG6=6;SEG7=7;SEG8=8;	
	SEG_Display12(SEG1,SEG2);
	SEG_Display34(SEG3,SEG4);	
	SEG_Display56(SEG5,SEG6);
	SEG_Display78(SEG7,SEG8);	
	}
}
void Delay_MS(uint MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(uchar yi,uchar er)
{
	P0=0XFF;
	P2=0XC0;P0=0X01;
	P2=0XFF;P0=tab[yi];
	Delay_MS(1);
	
	P0=0XFF;
	P2=0XC0;P0=0X02;
	P2=0XFF;P0=tab[er];
	Delay_MS(1);
}

void SEG_Display34(uchar san,uchar si)
{
	P0=0XFF;
	P2=0XC0;P0=0X04;
	P2=0XFF;P0=tab[san];
	Delay_MS(1);
	
	P0=0XFF;
	P2=0XC0;P0=0X08;
	P2=0XFF;P0=tab[si];
	Delay_MS(1);
}
void SEG_Display56(uchar wu,uchar liu)
{
	P0=0XFF;
	P2=0XC0;P0=0X10;
	P2=0XFF;P0=tab[wu];
	Delay_MS(1);
	
	P0=0XFF;
	P2=0XC0;P0=0X20;
	P2=0XFF;P0=tab[liu];
	Delay_MS(1);
}
void SEG_Display78(uchar qi,uchar ba)
{
	P0=0XFF;
	P2=0XC0;P0=0X40;
	P2=0XFF;P0=tab[qi];
	Delay_MS(1);
	
	P0=0XFF;
	P2=0XC0;P0=0X80;
	P2=0XFF;P0=tab[ba];
	Delay_MS(1);
}

三、多位数码管倒计时,第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char Num=255;
unsigned int Num_Refresh=0;
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void SEG_Display12(unsigned char yi,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11,SEG6=2,SEG7=5,SEG8=5;
		
	while(1)
	{
		
		
		if(++Num_Refresh==125)
		{
			Num_Refresh=0;
			Num--;
			SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
		}
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
		
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j; 
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
		P0=0XFF;//阴影消除
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}
void SEG_Display34(unsigned char san,unsigned char si)
{	
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}	
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

四、在8位数码管中,前面4位显示年份2018,接着2位是分隔符“--”,最后两位是月份。

#include<stc15.h>

unsigned char yu=1;
unsigned char code SMG_duanma[18]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,
                              0X82,0XF8,0X80,0X90,0X88,0X80,
                              0XC6,0XC0,0X86,0X8E,0XBF,0X7F};


void DelaySMG(unsigned int t)
{
	while(t--);
}
															
															
void SlecetHC573(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			P2=(P2&0X1F)|0X80;
		break;
		case 5:
			P2=(P2&0X1F)|0XA0;
		break;
		case 6:
			P2=(P2&0X1F)|0XC0;
		break;
		case 7:
			P2=(P2&0X1F)|0XE0;
		break;
	}
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
	SlecetHC573(6);
	P0=0X01<<pos;
	SlecetHC573(7);
	P0=value;
}
void Display_Dynamic()
{
	DisplaySMG_Bit(SMG_duanma[2],0);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[0],1);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[1],2);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[8],3);
	DelaySMG(500);
	
	DisplaySMG_Bit(SMG_duanma[16],4);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[16],5);
	DelaySMG(500);
	
	DisplaySMG_Bit(SMG_duanma[yu/10],6);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[yu%10],7);
	DelaySMG(500);
}
void  Delay(unsigned char t)
{
	while(t--)
	{
		Display_Dynamic();
	}
}

void main()
{
	while(1)
	{
		Display_Dynamic();
		yu++;
		if(yu>12)
		{
			yu=1;
		}
		Delay(200);
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值