需要用IAP15W4K58S4来驱动一个共阴极的数码管。现在用数码管的少了,碰到应用,编写了一个数码管的驱动程序,供大家探讨。
1. 工作原理
IAP15是一款国产的MCU,频率最高达到30MHz,RAM为4K,略显小一点,但对于控制家电等设备基本够用。程序的思路是用定时器驱动数码管显示电路。需要轮流在一个总线上分时输出,选择的定时器时钟为100μs产生一次中断。在中断程序中计数,当计数值为50时,更新数码管的1位,计数值清零。在200ms完成一次4位数码管显示。
2. 程序
void Timer4Init(void) //10毫秒@11.0592MHz
{
T4T3M |= 0x20; //定时器时钟T模式
T4L = 0xAB; //设置定时初值
T4H = 0xFB; //设置定时初值
T4T3M |= 0x80; //定时器4开始计时
IE2 |= ET4; // ET4 start
}
这个程序来自stc isp编程软件。
但要注意,这个程序中没有
IE2 |= ET4; 如果没有这个命令,定时器无法启动。
然后我们在中断程序中编写程序:
void timer4_ISR (void) interrupt TIMER4_VECTOR
{
// The Interrupt 10 ms once
/* ************************************************ */
/* The interrupt routine is 100 μs once */
/* ************************************************ */
static int iLoRa001 = 0;
static int iLoRa002 = 0;
// static int iLoRa003 = 0;
u16 ucDisplay = 0;
iLoRa002++;
if (iLoRa002 > 50 )
{
switch ( uPos )
{
case 0x08 : // Pos 1 display
ucDisplay = uCurrent / 1000; // 千位
disLed(ucDisplay, false);
DG1Low();
uPos = 0x04;
break;
case 0x04 :
ucDisplay = uCurrent / 100 % 10; // 百位
disLed(ucDisplay, true);
DG2Low();
uPos = 0x02;
break;
case 0x02 :
ucDisplay = uCurrent / 10 % 10; // 十位
disLed(ucDisplay, false);
DG3Low();
uPos = 0x01;
break;
case 0x01 :
ucDisplay = uCurrent % 10; // 个位
disLed(ucDisplay, false);
DG4Low();
uPos = 0x08;
break;
default :
break;
}
iLoRa002 = 0;
}
}
下面是要编制显示分程序和选通位程序。选通位程序就是四个DG1~DG4一个为低电平,其余的3个为高电平,要输出那个位就将响应的位变为低电平。disLed的程序如下:
void disLed(u8 u8Data, BOOL dp)
{
u8 xIN = 0;
if ( u8Data < 16 )
{
xIN = table[u8Data];
P43 = getBit(xIN, 0); // A
P23 = getBit(xIN, 1); // B
P21 = getBit(xIN, 2); // C
P42 = getBit(xIN, 3); // D
P41 = getBit(xIN, 4); // E
P20 = getBit(xIN, 5); // F
P22 = getBit(xIN, 6); // G
P44 = dp; // DP
}
}
3. 执行程序
程序执行,显示串口输入的数据。