炳裘垦 发表于 2025-7-26 09:32:30

数码管代码部分

数码管真值表

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
    ENLED = 0;
    ADDR3 = 1; // U3 74HC138芯片使能
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0; // 三极管导通

    P0 = 0xf9;        //数字1
    while (1);
}单个数码管倒计时

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
   0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//真值表

void main(void)
{
    char i = 15; // 真值表下标
    char cnt = 0;// 定时器溢出次数
    ENLED = 0;
    ADDR3 = 1; // U3 74HC138芯片使能
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0; // 三极管导通

    TMOD = 1; // 设置定时器0为模式1

    TH0 = 0xB8;
    TL0 = 0x00; // 设置定时器0的初始值

    TR0 = 1; // 定时器0开始工作
    P0= LedChar;

    while (1) {

      if (1 == TF0) // 定时器溢出
      {
            TF0 = 0;//将溢出标志恢复初值,再次定时

            TH0 = 0xB8;
            TL0 = 0x00; // 设置定时器0的初始值

            cnt++;

            if (cnt >= 50)
            {
                cnt = 0;
                if (i < 0)
                  i = 15;
                P0 = LedChar;
            }
      }
    }
}6段数码管动态显示

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};

unsigned char LedBuff[] =
{
    0xFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF
};

void main(void)
{
    unsigned char i = 0;//当前工作的数码管下标
    unsigned int cnt = 0;//溢出次数
    unsigned long sec = 0; // 秒
    ENLED = 0;
    ADDR3 = 1; // U3 74HC138芯片使能
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0; // 三极管导通

    TMOD = 1; // 设置定时器0为模式1

    TH0 = 0xFC;
    TL0 = 0x67; // 设置定时器0的初始值

    TR0 = 1; // 定时器0开始工作

    while (1)
    {

      if (1 == TF0) // 定时器溢出
      {
            TF0 = 0; // 将溢出标志恢复初值,再次定时

            TH0 = 0xFC;
            TL0 = 0x67; // 设置定时器0的初始值

            cnt++;

            if (cnt >= 1000) //1s
            {
                cnt = 0;
                sec++;
                if (sec >= 999999)
                  sec = 0;

                                LedBuff = LedChar;
                    LedBuff = LedChar[(sec / 10) % 10];
                    LedBuff = LedChar[(sec / 100) % 10];
                    LedBuff = LedChar[(sec / 1000) % 10];
                    LedBuff = LedChar[(sec / 10000) % 10];
                    LedBuff = LedChar[(sec / 100000) % 10];
            }

            switch (i)
            {
                case 0:
                  ADDR2 = 0;
                  ADDR1 = 0;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 1:
                  ADDR2 = 0;
                  ADDR1 = 0;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 2:
                  ADDR2 = 0;
                  ADDR1 = 1;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 3:
                  ADDR2 = 0;
                  ADDR1 = 1;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 4:
                  ADDR2 = 1;
                  ADDR1 = 0;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 5:
                  ADDR2 = 1;
                  ADDR1 = 0;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i = 0;
                  break;
            }
      }
    }
}动态显示的数码管显示消隐

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};

unsigned char LedBuff[] =
{
    0xFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF
};

void main(void)
{
    unsigned char i = 0;//当前工作的数码管下标
    unsigned int cnt = 0;//溢出次数
    unsigned long sec = 0; // 秒
    ENLED = 0;
    ADDR3 = 1; // U3 74HC138芯片使能
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0; // 三极管导通

    TMOD = 1; // 设置定时器0为模式1

    TH0 = 0xFC;
    TL0 = 0x67; // 设置定时器0的初始值

    TR0 = 1; // 定时器0开始工作

    while (1)
    {

      if (1 == TF0) // 定时器溢出
      {
            TF0 = 0; // 将溢出标志恢复初值,再次定时

            TH0 = 0xFC;
            TL0 = 0x67; // 设置定时器0的初始值

            cnt++;

            if (cnt >= 1000) //1s
            {
                cnt = 0;
                sec++;
                if (sec >= 999999)
                  sec = 0;

                                LedBuff = LedChar;
                    LedBuff = LedChar[(sec / 10) % 10];
                    LedBuff = LedChar[(sec / 100) % 10];
                    LedBuff = LedChar[(sec / 1000) % 10];
                    LedBuff = LedChar[(sec / 10000) % 10];
                    LedBuff = LedChar[(sec / 100000) % 10];
            }

            
                        P0 = 0xFF;//显示消隐处理
            switch (i)
            {
                case 0:
                  ADDR2 = 0;
                  ADDR1 = 0;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 1:
                  ADDR2 = 0;
                  ADDR1 = 0;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 2:
                  ADDR2 = 0;
                  ADDR1 = 1;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 3:
                  ADDR2 = 0;
                  ADDR1 = 1;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 4:
                  ADDR2 = 1;
                  ADDR1 = 0;
                  ADDR0 = 0; // 三极管导通
                  P0 = LedBuff;
                  i++;
                  break;
                case 5:
                  ADDR2 = 1;
                  ADDR1 = 0;
                  ADDR0 = 1; // 三极管导通
                  P0 = LedBuff;
                  i = 0;
                  break;
            }
      }
    }
}采用中断的动态显示

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表

unsigned char LedBuff[] =
{
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};//数码管显示缓冲区

unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char flag1s = 0;//1s定时标志

void main(void)
{
    unsigned long sec = 0;//记录经过的秒数
    EA = 1;//使能总中断
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    TMOD = 0x01;//设置定时器T0模式1
    TH0 = 0xFC;
    TL0 = 0x67;//设置定时器T0的初值
    ET0 = 1;//使能定时器T0中断
    TR0 = 1;//启动定时器T0

    while (1)
    {
      if (1 == flag1s)//判断1s定时标志
      {
            flag1s = 0;//1s定时标志清零
            sec++;//秒数加1

            //设置数码管的值
            LedBuff = LedChar;
            LedBuff = LedChar[(sec / 10) % 10];
            LedBuff = LedChar[(sec / 100) % 10];
            LedBuff = LedChar[(sec / 1000) % 10];
            LedBuff = LedChar[(sec / 10000) % 10];
            LedBuff = LedChar[(sec / 100000) % 10];

      }
    }
}

void InterruptTimer0() interrupt 1
{
    TH0 = 0xFC;
    TL0 = 0x67;//设置定时器T0的初值
    cnt++;//中断次数+1

    if (cnt >= 1000)//中断1000次即1秒
    {
      cnt = 0;//中断次数清零
      flag1s = 1;//设置1s定时标志为1
    }

    P0 = 0xff;//显示消隐

   switch (i)
    {
      case 0:
            ADDR2 = 0;
            ADDR1 = 0;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 1:
            ADDR2 = 0;
            ADDR1 = 0;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 2:
            ADDR2 = 0;
            ADDR1 = 1;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 3:
            ADDR2 = 0;
            ADDR1 = 1;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 4:
            ADDR2 = 1;
            ADDR1 = 0;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 5:
            ADDR2 = 1;
            ADDR1 = 0;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            i = 0;
            break;
      default:
            break;
    }
}动态显示时不显示高位0-采用中断

#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表

unsigned char LedBuff[] =
{
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};//数码管显示缓冲区

unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char flag1s = 0;//1s定时标志
unsigned long sec = 0;//记录经过的秒数

void main(void)
{
    //unsigned long sec = 0;//记录经过的秒数
    EA = 1;//使能总中断
    ENLED = 0;
    ADDR3 = 1;//U3 74HC138芯片使能
    TMOD = 0x01;//设置定时器T0模式1
    TH0 = 0xFC;
    TL0 = 0x67;//设置定时器T0的初值
    ET0 = 1;//使能定时器T0中断
    TR0 = 1;//启动定时器T0

    while (1)
    {
      if (1 == flag1s)//判断1s定时标志
      {
            flag1s = 0;//1s定时标志清零
            sec++;//秒数加1

            //设置数码管的值
            LedBuff = LedChar;
            LedBuff = LedChar[(sec / 10) % 10];
            LedBuff = LedChar[(sec / 100) % 10];
            LedBuff = LedChar[(sec / 1000) % 10];
            LedBuff = LedChar[(sec / 10000) % 10];
            LedBuff = LedChar[(sec / 100000) % 10];
      }
    }
}

void InterruptTimer0() interrupt 1
{
    TH0 = 0xFC;
    TL0 = 0x67;//设置定时器T0的初值
    cnt++;//中断次数+1

    if (cnt >= 1000)//中断1000次即1秒
    {
      cnt = 0;//中断次数清零
      flag1s = 1;//设置1s定时标志为1
    }

    P0 = 0xff;//显示消隐

   switch (i)
    {
      case 0:
            ADDR2 = 0;
            ADDR1 = 0;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            i++;
            break;
      case 1:
            i++;
            if (sec < 10)
                break;
            ADDR2 = 0;
            ADDR1 = 0;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            break;
      case 2:
            i++;
            if (sec < 100)
                break;
            ADDR2 = 0;
            ADDR1 = 1;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            break;
      case 3:
            i++;
            if (sec < 1000)
                break;
            ADDR2 = 0;
            ADDR1 = 1;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            break;
      case 4:
            i++;
            if (sec < 10000)
                break;
            ADDR2 = 1;
            ADDR1 = 0;
            ADDR0 = 0; // 三极管导通
            P0 = LedBuff;
            break;
      case 5:
            i = 0;
            if (sec < 100000)
                break;
            ADDR2 = 1;
            ADDR1 = 0;
            ADDR0 = 1; // 三极管导通
            P0 = LedBuff;
            break;
      default:
            break;
    }
}
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: 数码管代码部分