51小作业

在上次51单片机课程中老师布置了一个小作业
作业要求:
四位数码管闪烁显示H66S,且要求中间数字为66倒计时。
代码思路类似于两位倒计时,只不过第一位和第四位固定显示而已。
参考代码分享给小伙伴:

#include <reg52.h>
sbit LSA=P1^5;  			
sbit LSB=P1^6; 			
sbit LSC=P1^7;
unsigned int cnt=0;	
signed char sec;
signed char sec_all=66;
signed char count=0;
unsigned char smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90,0x89};
void timer10ms()
{
	TMOD = 0x00; 		         //清空T0控制位
	TMOD = 0x01; 		         //设置T0模式为01
	TL0 = -9216%256;            //计数值装载
	TH0 = -9216/256;
	ET0 = 1;                     //使能T0中断
}
void EXINT0() interrupt 0     	
{
	count++;				
}
void Timer0() interrupt 1
{
	TH0 = -9216/256; 	
	TL0 = -9216%256;
	cnt++; 		                //中断次数加一
	if (cnt >= 100)              //中断50次=1s
	{
		cnt = 0;
		sec--; 
		if (sec < 0)            //当显示数值到0时,闪烁
		{
			sec = 0;
		}
	}
}
void ledscan(unsigned char wei,unsigned char display)
{
    unsigned char i;
    for(i=0;i<=wei;i++)
    {	
	P0=display;	
	switch(wei)	                  //位选
	{
		case(0):
		LSA=1;LSB=0;LSC=0; break; //显示第0位
		case(1):
		LSA=0;LSB=1;LSC=0; break; //显示第1位
		case(2):
		LSA=1;LSB=1;LSC=0; break; //显示第2位
		case(3):
		LSA=0;LSB=0;LSC=1; break; //显示第3位
	}
	P0=0xff;LSA=1;LSB=1;LSC=1;//消隐	      	                  			
    }	
}
void delayms(unsigned int xms)
{
    int i,j;
	for(i=xms;i>0;i--)
	for(j=110;j>0;j--);
}
void main(void)
{
	LSA = 0;
    LSB = 0;
    LSC = 0;
	cnt = 0;                 		
	sec = sec_all;                		
	timer10ms();
	EA=1;                                   
	IT0=1; 
	EX0=1;    	
    TR0=1;	
    while(1)
    {
	if(count%2==0)
	{
		TR0 = 1;
	}
	else
	{
		TR0 = 0;
	}
	if((cnt>50))
	{
		ledscan(0,0xff);    	
		ledscan(1,0xff);    	   	//清除个位	
	    ledscan(2,0xff);            //清除十位
		ledscan(3,0xff);
	}
	else
	{
		ledscan(0,smgduan[5]); 
		ledscan(1,smgduan[sec%10]);   //显示个位
		ledscan(2,smgduan[sec/10]);   //显示十位
	    ledscan(3,smgduan[10]);
	}  
    }
}
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值