三位七段数码管驱动程序
定义一个结构体,包含三位要显示的数据,采用定时器,每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;
}
}