这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 多位数码管如何同时亮并间隔一段时间再灭?

共2条 1/1 1 跳转至

多位数码管如何同时亮并间隔一段时间再灭?

工程师
2024-11-18 10:12:29     打赏

下面是我的程序,是不是只有时钟和中断才能实现呢?
#include <REGX52.H>
void Delay(unsigned int xms)//@11.0592MHz
{
unsigned char data 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,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=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];//调用第几个断码
Delay(1);
P0=0x00;
}
void main()
{
while(1)
{
Nixie(8,6);Nixie(7,6);Nixie(6,6);
//第八个晶体管,显示6//第七个晶体管,显示6//第六个晶体管,显示6
}
}
/*********************************************************
是普中的A2开发板
89c52rc
下面是数码管和译码器的原理图

屏幕截图 2024-09-19 005402.png





关键词: 数码管    

助工
2024-11-18 10:12:49     打赏
2楼

为了实现多位数码管同时亮并间隔一段时间再灭,可以使用定时器和中断来实现。下面是修改后的程序:

```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秒)再灭。 


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]