数码管显示程序,采用定时器进行位选切换


定义一个结构体,包含三位要显示的数据,采用定时器,每1ms进行一次位切换。

段选和位选控制端口定义

			#define led_a         P50 //0X02   seg1
			#define led_b         P45 //0x80	 seg2
			#define led_c         P06 //0X20	 seg3
			#define led_d         P51 //0x08	 seg4
			#define led_e         P52	// 0X04	 seg5
			#define led_f         P53 //0x01	 seg6
			#define led_g         P25 //0X40		seg7
			
			#define led_com1			P41
			#define led_com2			P42
			#define led_com3			P43
			#define led_com4			P44

段控制程序

void DuanCodeWrite(u16 num)
{
	switch(num)		
	{
		case zero:      //0
			led_a = 0;led_b = 0;led_c = 0;led_d = 0;led_e = 0;led_f = 0;led_g = 1;
				break;		
		case one:				//1
			led_a = 1;led_b = 0;led_c = 0;led_d = 1;led_e = 1;led_f = 1;led_g = 1;	
			break;			
		case two:				// 2
			led_a = 0;led_b = 0;led_c = 1;led_d = 0;led_e = 0;led_f = 1;led_g = 0;	
		break;	
		case three:     //3
			led_a = 0;led_b = 0;led_c = 0;led_d = 0;led_e = 1;led_f = 1;led_g = 0;	
		break;	
		case four:			//4
			led_a = 1;led_b = 0;led_c = 0;led_d = 1;led_e = 1;led_f = 0;led_g = 0;	
		break;	
		case five:    	//5
			led_a = 0;led_b = 1;led_c = 0;led_d = 0;led_e = 1;led_f = 0;led_g = 0;	
		break;	
		case six:
			led_a = 0;led_b = 1;led_c = 0;led_d = 0;led_e = 0;led_f = 0;led_g = 0;	
		break;	
		case seven:
			led_a = 0;led_b = 0;led_c = 0;led_d = 1;led_e = 1;led_f = 1;led_g = 1;
		break;	
		case eight:			
			led_a = 0;led_b = 0;led_c = 0;led_d = 0;led_e = 0;led_f = 0;led_g = 0;
		break;		
		case nine:
			led_a = 0;led_b = 0;led_c = 0;led_d = 0;led_e = 1;led_f = 0;led_g = 0;
		break;	
		case Ec:  //E
			led_a = 0;led_b = 1;led_c = 1;led_d = 0;led_e = 0;led_f = 0;led_g = 0;
		break;
		case duan_off: 		//全关
			led_a = 1;led_b = 1;led_c = 1;led_d = 1;led_e = 1;led_f = 1;led_g = 1;	
		break;	
		case firedis:  //火焰符号 		
			led_a = 1;led_b = 0;led_c = 1;led_d = 1;led_e = 1;led_f = 1;led_g = 1;			
		break;	
		case tempdis: 		//温度符号
			led_a = 0;led_b = 1;led_c = 1;led_d = 1;led_e = 1;led_f = 1;led_g = 1;			
		break;
		case timedis: 		//时间'min'符号
			led_a = 1;led_b = 1;led_c = 0;led_d = 0;led_e = 1;led_f = 1;led_g = 1;
		break;		
		case fireandtime:	//时间和火焰符号
			led_a = 1;led_b = 0;led_c = 0;led_d = 0;led_e = 1;led_f = 1;led_g = 1;	
		break;	
		case oilalarmsymright:	//油盒提醒右
			led_a = 1;led_b = 1;led_c = 1;led_d = 0;led_e = 0;led_f = 0;led_g = 0;
		break;
		case oilalarmsymleft:		//油盒提醒左
			led_a = 1;led_b = 0;led_c = 0;led_d = 0;led_e = 1;led_f = 1;led_g = 0;
		break;
	}
}

位数据写入

void WeiCodeWrite(u16 num)
{		
	switch(num)
	{
		case baiwei:     //位1
			led_com1 = 0;led_com2 = 1;led_com3 = 1;led_com4 = 1;
		break;
		case shiwei:			//位2
			led_com1 = 1;led_com2 = 0;led_com3 = 1;led_com4 = 1;
		break;
		case gewei:      //位3
			led_com1 = 1;led_com2 = 1;led_com3 = 0;led_com4 = 1;		
		break;	
		case symwei:			//
			led_com1 = 1;led_com2 = 1;led_com3 = 1;led_com4 = 0;	
		break;
		case wei_off:			//全关
			led_com1 = 1;led_com2 = 1;led_com3 = 1;led_com4 = 1;	
		break;		
		case wei_on: 		 //全开
			led_com1 = 0;led_com2 = 0;led_com3 = 0;led_com4 = 0;	
		break;		
	}
}

显示数据刷新函数

使用定时器扫描位,每1ms切换1位

void Timer3Int(void) interrupt 13
{		
		//US0CON3 = 0xAA;
    TXINX = 0x03;   //选择定时器T3
		TFX = 0;        //溢出清零
		DisplayInformation();		
//		TIMER_InterruptRun(); 
//	if(Buz_1ms_Flag <65530)
//			Buz_1ms_Flag++;
    //P05 = ~P05;
}

显示信息刷新函数

void DisplayInformation(void)
{
	static u8 count = 0;
	count++;
	if(count > 4)
		count = 0;		
	switch(count)
	{
		case 1:
				display_data_write(disCB.bainum,baiwei);
		break;
		case 2:
				display_data_write(disCB.shinum,shiwei);
		break;
		case 3:
				display_data_write(disCB.genum,gewei);
		break;
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值