为了实现多位数码管同时亮并间隔一段时间再灭,可以使用定时器和中断来实现。下面是修改后的程序:
```c
#include
void Delay(unsigned int xms) {
unsigned char i, j;
while (xms--) {
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
}
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; // 数码管显示数字断码
void Nixie(unsigned char Location, unsigned char Number) {
switch (Location) {
case 1:
P2_4 = 1;
P2_3 = 1;
P2_2 = 1;
break;
case 2:
P2_4 = 1;
P2_3 = 1;
P2_2 = 0;
break;
case 3:
P2_4 = 1;
P2_3 = 0;
P2_2 = 1;
break;
case 4:
P2_4 = 0;
P2_3 = 1;
P2_2 = 1;
break;
}
P0 = NixieTable[Number]; // 显示数字
Delay(1); // 延时1ms
switch (Location) {
case 1:
P2_4 = 0;
P2_3 = 0;
P2_2 = 0;
break;
case 2:
P2_4 = 0;
P2_3 = 0;
P2_2 = 1;
break;
case 3:
P2_4 = 0;
P2_3 = 1;
P2_2 = 0;
break;
case 4:
P2_4 = 1;
P2_3 = 0;
P2_2 = 0;
break;
}
}
void Timer0_Init() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xFC; // 定时器初值
TL0 = 0x18;
ET0 = 1; // 使能定时器0中断
EA = 1; // 使能全局中断
TR0 = 1; // 启动定时器0
}
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重新加载定时器初值
TL0 = 0x18;
static unsigned char count = 0;
count++;
if (count >= 1000) { // 1000次中断,约1秒
count = 0;
P2 = 0xFF; // 关闭所有数码管
}
}
void main() {
unsigned char i;
Timer0_Init(); // 初始化定时器0
while (1) {
for (i = 1; i <= 4; i++) {
Nixie(i, i); // 显示数字i
}
}
}
```
这个程序使用了定时器0和中断来实现数码管的显示。首先,初始化定时器0,设置为工作模式1,定时器初值为0xFC18,使能定时器0中断和全局中断,然后启动定时器0。在定时器0的中断服务程序中,重新加载定时器初值,并通过一个静态变量`count`来计数。当计数达到1000次(约1秒)时,关闭所有数码管。
在主函数中,使用一个循环来依次显示数字1到4。每次调用`Nixie`函数时,会根据传入的数码管位置和数字来显示相应的数字。这样,数码管会依次显示数字1到4,然后间隔一段时间(约1秒)再灭。
为了实现多位数码管同时亮并间隔一段时间再灭,可以使用定时器和中断来实现。下面是修改后的程序:
```c
#include
void Delay(unsigned int xms) {
unsigned char i, j;
while (xms--) {
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
}
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; // 数码管显示数字断码
void Nixie(unsigned char Location, unsigned char Number) {
switch (Location) {
case 1:
P2_4 = 1;
P2_3 = 1;
P2_2 = 1;
break;
case 2:
P2_4 = 1;
P2_3 = 1;
P2_2 = 0;
break;
case 3:
P2_4 = 1;
P2_3 = 0;
P2_2 = 1;
break;
case 4:
P2_4 = 0;
P2_3 = 1;
P2_2 = 1;
break;
}
P0 = NixieTable[Number]; // 显示数字
Delay(1); // 延时1ms
switch (Location) {
case 1:
P2_4 = 0;
P2_3 = 0;
P2_2 = 0;
break;
case 2:
P2_4 = 0;
P2_3 = 0;
P2_2 = 1;
break;
case 3:
P2_4 = 0;
P2_3 = 1;
P2_2 = 0;
break;
case 4:
P2_4 = 1;
P2_3 = 0;
P2_2 = 0;
break;
}
}
void Timer0_Init() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xFC; // 定时器初值
TL0 = 0x18;
ET0 = 1; // 使能定时器0中断
EA = 1; // 使能全局中断
TR0 = 1; // 启动定时器0
}
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重新加载定时器初值
TL0 = 0x18;
static unsigned char count = 0;
count++;
if (count >= 1000) { // 1000次中断,约1秒
count = 0;
P2 = 0xFF; // 关闭所有数码管
}
}
void main() {
unsigned char i;
Timer0_Init(); // 初始化定时器0
while (1) {
for (i = 1; i <= 4; i++) {
Nixie(i, i); // 显示数字i
}
}
}
```
这个程序使用了定时器0和中断来实现数码管的显示。首先,初始化定时器0,设置为工作模式1,定时器初值为0xFC18,使能定时器0中断和全局中断,然后启动定时器0。在定时器0的中断服务程序中,重新加载定时器初值,并通过一个静态变量`count`来计数。当计数达到1000次(约1秒)时,关闭所有数码管。
在主函数中,使用一个循环来依次显示数字1到4。每次调用`Nixie`函数时,会根据传入的数码管位置和数字来显示相应的数字。这样,数码管会依次显示数字1到4,然后间隔一段时间(约1秒)再灭。
举报