正反推驱动数码管伪代码
•0 字•0 分钟阅读
嵌入式开发
u8 DispBuf[] = {0x00, 0x00};
unsigned char segment[] = {
0x3F,
0x06,
0x5B,
0x4F,
0x66, // 0-4
0x6D,
0x7D,
0x07,
0x7F,
0x6F, // 5-9
0x40,
0x71,
0x74, // '-', F, H
};
void f_digitalTubeScan()
{
static unsigned char state = 0;
// 重置引脚状态
TUBE_1 = 0;
TUBE_2 = 0;
TUBE_3 = 0;
TUBE_4 = 0;
TUBE_5 = 0;
PCM0 &= 0x04;
PBM1 &= 0x04;
PBM2 = 0;
PBM3 &= 0x30;
// 将数码管分成一个一个的led灯去扫描
switch (state)
{
case 0:
PBM2 = 0x44;
if (DispBuf[0] & 0x01)
{
TUBE_3 = 1;
TUBE_5 = 0;
}
break;
case 1:
PCM0 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x02)
{
TUBE_1 = 1;
TUBE_5 = 0;
}
break;
case 2:
PBM3 |= 0x04;
PBM2 |= 0x04;
if (DispBuf[0] & 0x04)
{
TUBE_2 = 1;
TUBE_5 = 0;
}
break;
case 3:
PBM1 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x08)
{
TUBE_4 = 1;
TUBE_5 = 0;
}
break;
case 4:
PBM3 |= 0x04;
PBM2 |= 0x04;
if (DispBuf[0] & 0x10)
{
TUBE_2 = 0;
TUBE_5 = 1;
}
break;
case 5:
PCM0 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x20)
{
TUBE_1 = 0;
TUBE_5 = 1;
}
break;
case 6:
PBM1 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x40)
{
TUBE_4 = 0;
TUBE_5 = 1;
}
break;
case 7:
PBM2 = 0x44;
if (DispBuf[1] & 0x01)
{
TUBE_3 = 0;
TUBE_5 = 1;
}
break;
case 8:
PCM0 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x02)
{
TUBE_3 = 1;
TUBE_1 = 0;
}
break;
case 9:
PBM3 |= 0x04;
PBM2 |= 0x40;
if (DispBuf[1] & 0x04)
{
TUBE_3 = 1;
TUBE_2 = 0;
}
break;
case 10:
PBM1 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x08)
{
TUBE_3 = 1;
TUBE_4 = 0;
}
break;
case 11:
PBM1 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x10)
{
TUBE_3 = 0;
TUBE_4 = 1;
}
break;
case 12:
PCM0 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x20)
{
TUBE_3 = 0;
TUBE_1 = 1;
}
break;
case 13:
PBM3 |= 0x04;
PBM2 |= 0x40;
if (DispBuf[1] & 0x40)
{
TUBE_3 = 0;
TUBE_2 = 1;
}
break;
}
state = (state + 1) % 14;
}
// 显示 12
DispBuf[0] = segment[1];
DispBuf[1] = segment[2];