基于C语言在数码管上实现只显示有效位的秒表

基于C语言在数码管上实现只显示有效位的秒表,高位的0不显示。
本程序是基于STC-51开发板电路实现的。

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

code unsigned char LedChar[16] = {			  
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};											 //LED显示0-F字符时,对应的P0值


void main()
{
	ENLED = 0;		
	ADDR3 = 1;		//使能U3(74HC138),选择数码管

	TMOD = 0x01;	 //设置T0为模式1
	TH0 = 0xfc;
	TL0 = 0x67;		 //设置定时初值为0xFC67,定时为1ms
	TR0 = 1;	     //打开定时器T0

	EA = 1;			 //打开总中断
	ET0 = 1;		 //打开T0中断

	while(1);
}
void InterruptTimer0() interrupt 1
{
	static unsigned int cnt = 0;				 //ms计数变量
	static unsigned long sec = 0;				 //s计数变量
	static unsigned char i = 0;					 //数码管编号
	static unsigned char LedBuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
	

	TH0 = 0xfc;
	TL0 = 0x67;		 //定时溢出时,重新赋值,保证每次定时为1ms

	cnt++;
	//秒数变化时,重新计算每个数码管要显示的值,以及关闭高位的0,只显示有效位
	if(cnt >=1000)
	{
		cnt = 0;
		sec++;

		LedBuff[0] = LedChar[sec%10];
		LedBuff[1] = LedChar[sec/10%10];
		LedBuff[2] = LedChar[sec/100%10];
		LedBuff[3] = LedChar[sec/1000%10];
		LedBuff[4] = LedChar[sec/10000%10];
		LedBuff[5] = LedChar[sec/100000%10];

		if(sec <= 9)
		{
			LedBuff[1] = 0xff;LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
		}
		else if(sec <= 99)
		{
			LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
		}
		else if(sec <= 999)
		{
			LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
		}
		else if(sec <= 9999)
		{
			LedBuff[4] = 0xff;LedBuff[5] = 0xff;
		}
		else if(sec <= 99999)
		{
			LedBuff[5] = 0xff;
		}
	}

	P0 = 0xff;         //数码管显示消隐
	switch(i)
	{
		case 0 : ADDR2 = 0; ADDR1 = 0; ADDR0 = 0;i++;P0 = LedBuff[0];break;
		case 1 : ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;i++;P0 = LedBuff[1];break;
		case 2 : ADDR2 = 0; ADDR1 = 1; ADDR0 = 0;i++;P0 = LedBuff[2];break;
		case 3 : ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;i++;P0 = LedBuff[3];break;
		case 4 : ADDR2 = 1; ADDR1 = 0; ADDR0 = 0;i++;P0 = LedBuff[4];break;
		case 5 : ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;i=0;P0 = LedBuff[5];break;
		default : break;
	}
}

显示效果如下:
在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值