找回密码
 立即注册
首页 业界区 安全 中断与数码管动态显示代码

中断与数码管动态显示代码

更成痒 2025-6-9 13:30:49
数码管从0-999999且高位0显示
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code LedChar[] = //数码管显示字符转换表
  8. {
  9.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  10.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  11. };
  12. unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
  13. {
  14.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  15. };
  16. unsigned char i = 0;//动态扫描的索引
  17. unsigned int cnt = 0;//记录T0中断次数
  18. unsigned char isFlag = 0;//1s标志位
  19. void main(void)
  20. {
  21.         unsigned long sec = 0;//记录经过的秒数
  22.         ENLED = 0;//使能U3,选择控制数码管
  23.         ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了
  24.         TMOD = 0x01;//设置T0为模式1
  25.         TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1ms
  26.         TL0 = 0x67;
  27.         TR0 = 1;//启动T0
  28.         EA = 1;//使能总中断
  29.         ET0 = 1;//使能T0中断
  30.         while (1)
  31.         {
  32.                 if (1 == isFlag)//判断1秒定时标志
  33.                 {
  34.                         isFlag = 0;//1秒定时标志清零
  35.                         if (999999 == sec)
  36.                                 sec = 0;
  37.                         else
  38.                                 sec++;//秒计数加1
  39.                         //以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符
  40.                         LedBuff[0] = LedChar[sec % 10];
  41.                         LedBuff[1] = LedChar[sec / 10 % 10];
  42.                         LedBuff[2] = LedChar[sec / 100 % 10];
  43.                         LedBuff[3] = LedChar[sec / 1000 % 10];
  44.                         LedBuff[4] = LedChar[sec / 10000 % 10];
  45.                         LedBuff[5] = LedChar[sec / 100000 % 10];
  46.                 }
  47.         }
  48. }
  49. /* 定时器中断服务函数 */
  50. void interrupt0 (void) interrupt 1//T0中断
  51. {
  52.         TH0 = 0xFC;//重新赋初值
  53.         TL0 = 0x67;
  54.         cnt++;//计数值加1
  55.         if (cnt > 1000)
  56.         {
  57.                 cnt = 0;//清零计数值以重新开始下一秒计时
  58.                 isFlag = 1;           //设置1秒定时标志位1
  59.         }
  60.         P0 = 0xFF;//显示消隐
  61.         //以下代码完成数码管动态扫描刷新
  62.         switch (i)
  63.         {
  64.         case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];break;
  65.         case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];break;
  66.         case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];break;
  67.         case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];break;
  68.         case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];break;
  69.         case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];break;
  70.         default:break;
  71.         }
  72. }
复制代码
数码管从0-999999且高位0不显示
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code LedChar[] = //数码管显示字符转换表
  8. {
  9.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  10.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  11. };
  12. unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
  13. {
  14.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  15. };
  16. unsigned char i = 0;//动态扫描的索引
  17. unsigned int cnt = 0;//记录T0中断次数
  18. unsigned char isFlag = 0;//1s标志位
  19. unsigned long sec = 0;//记录经过的秒数
  20. void main(void)
  21. {
  22.         ENLED = 0;//使能U3,选择控制数码管
  23.         ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了
  24.         TMOD = 0x01;//设置T0为模式1
  25.         TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1ms
  26.         TL0 = 0x67;
  27.         TR0 = 1;//启动T0
  28.         EA = 1;//使能总中断
  29.         ET0 = 1;//使能T0中断
  30.         while (1)
  31.         {
  32.                 if (1 == isFlag)//判断1秒定时标志
  33.                 {
  34.                         isFlag = 0;//1秒定时标志清零
  35.                         if (999999 == sec)
  36.                                 sec = 0;
  37.                         else
  38.                                 sec++;//秒计数加1
  39.                         //以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符
  40.                         LedBuff[0] = LedChar[sec % 10];
  41.                         LedBuff[1] = LedChar[sec / 10 % 10];
  42.                         LedBuff[2] = LedChar[sec / 100 % 10];
  43.                         LedBuff[3] = LedChar[sec / 1000 % 10];
  44.                         LedBuff[4] = LedChar[sec / 10000 % 10];
  45.                         LedBuff[5] = LedChar[sec / 100000 % 10];
  46.                 }
  47.         }
  48. }
  49. /* 定时器中断服务函数 */
  50. void interrupt0 (void) interrupt 1//T0中断
  51. {
  52.         TH0 = 0xFC;//重新赋初值
  53.         TL0 = 0x67;
  54.         cnt++;//计数值加1
  55.         if (cnt > 1000)
  56.         {
  57.                 cnt = 0;//清零计数值以重新开始下一秒计时
  58.                 isFlag = 1;           //设置1秒定时标志位1
  59.         }
  60.         P0 = 0xFF;//显示消隐
  61.         //以下代码完成数码管动态扫描刷新
  62.         switch (i)
  63.         {
  64.         case 0: if (sec >= 0){ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0 = LedBuff[0];}i++;break;
  65.         case 1: if (sec >= 10){ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0 = LedBuff[1];}i++;break;
  66.         case 2: if (sec >= 100){ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0 = LedBuff[2];}i++;break;
  67.         case 3: if (sec >= 1000){ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0 = LedBuff[3];}i++;break;
  68.         case 4: if (sec >= 10000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0 = LedBuff[4];}i++;break;
  69.         case 5: if (sec >= 100000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0 = LedBuff[5];}i = 0;break;
  70.         default:break;
  71.         }
  72. }
复制代码
数码管从999999-0且高位0显示
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code LedChar[] = //数码管显示字符转换表
  8. {
  9.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  10.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  11. };
  12. unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
  13. {
  14.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  15. };
  16. unsigned char i = 0;//动态扫描的索引
  17. unsigned int cnt = 0;//记录T0中断次数
  18. unsigned char isFlag = 0;//1s标志位
  19. void main(void)
  20. {
  21.         unsigned long sec = 999999;//秒数
  22.         ENLED = 0;//使能U3,选择控制数码管
  23.         ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了
  24.         TMOD = 0x01;//设置T0为模式1
  25.         TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1ms
  26.         TL0 = 0x67;
  27.         TR0 = 1;//启动T0
  28.         EA = 1;//使能总中断
  29.         ET0 = 1;//使能T0中断
  30.         while (1)
  31.         {
  32.                 if (1 == isFlag)//判断1秒定时标志
  33.                 {
  34.                         isFlag = 0;//1秒定时标志清零
  35.                         if (0 == sec)
  36.                                 sec = 999999;
  37.                         else
  38.                                 sec--;//秒计数减1
  39.                         //以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符
  40.                         LedBuff[0] = LedChar[sec % 10];
  41.                         LedBuff[1] = LedChar[sec / 10 % 10];
  42.                         LedBuff[2] = LedChar[sec / 100 % 10];
  43.                         LedBuff[3] = LedChar[sec / 1000 % 10];
  44.                         LedBuff[4] = LedChar[sec / 10000 % 10];
  45.                         LedBuff[5] = LedChar[sec / 100000 % 10];
  46.                 }
  47.         }
  48. }
  49. /* 定时器中断服务函数 */
  50. void interrupt0 (void) interrupt 1//T0中断
  51. {
  52.         TH0 = 0xFC;//重新赋初值
  53.         TL0 = 0x67;
  54.         cnt++;//计数值加1
  55.         if (cnt > 1000)
  56.         {
  57.                 cnt = 0;//清零计数值以重新开始下一秒计时
  58.                 isFlag = 1;           //设置1秒定时标志位1
  59.         }
  60.         P0 = 0xFF;//显示消隐
  61.         //以下代码完成数码管动态扫描刷新
  62.         switch (i)
  63.         {
  64.         case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];break;
  65.         case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];break;
  66.         case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];break;
  67.         case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];break;
  68.         case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];break;
  69.         case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];break;
  70.         default:break;
  71.         }
  72. }
复制代码
数码管从999999-0且高位0不显示
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code LedChar[] = //数码管显示字符转换表
  8. {
  9.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  10.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  11. };
  12. unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
  13. {
  14.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  15. };
  16. unsigned char i = 0;//动态扫描的索引
  17. unsigned int cnt = 0;//记录T0中断次数
  18. unsigned char isFlag = 0;//1s标志位
  19. unsigned long sec = 999999;//秒数
  20. void main(void)
  21. {
  22.        
  23.         ENLED = 0;//使能U3,选择控制数码管
  24.         ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了
  25.         TMOD = 0x01;//设置T0为模式1
  26.         TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1ms
  27.         TL0 = 0x67;
  28.         TR0 = 1;//启动T0
  29.         EA = 1;//使能总中断
  30.         ET0 = 1;//使能T0中断
  31.         while (1)
  32.         {
  33.                 if (1 == isFlag)//判断1秒定时标志
  34.                 {
  35.                         isFlag = 0;//1秒定时标志清零
  36.                         if (0 == sec)
  37.                                 sec = 999999;
  38.                         else
  39.                                 sec--;//秒计数减1
  40.                         //以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符
  41.                         LedBuff[0] = LedChar[sec % 10];
  42.                         LedBuff[1] = LedChar[sec / 10 % 10];
  43.                         LedBuff[2] = LedChar[sec / 100 % 10];
  44.                         LedBuff[3] = LedChar[sec / 1000 % 10];
  45.                         LedBuff[4] = LedChar[sec / 10000 % 10];
  46.                         LedBuff[5] = LedChar[sec / 100000 % 10];
  47.                 }
  48.         }
  49. }
  50. /* 定时器中断服务函数 */
  51. void interrupt0 (void) interrupt 1//T0中断
  52. {
  53.         TH0 = 0xFC;//重新赋初值
  54.         TL0 = 0x67;
  55.         cnt++;//计数值加1
  56.         if (cnt > 1000)
  57.         {
  58.                 cnt = 0;//清零计数值以重新开始下一秒计时
  59.                 isFlag = 1;           //设置1秒定时标志位1
  60.         }
  61.         P0 = 0xFF;//显示消隐
  62.         //以下代码完成数码管动态扫描刷新
  63.         switch (i)
  64.         {
  65.         case 0: if (sec >= 0){ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0 = LedBuff[0];}i++;break;
  66.         case 1: if (sec >= 10){ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0 = LedBuff[1];}i++;break;
  67.         case 2: if (sec >= 100){ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0 = LedBuff[2];}i++;break;
  68.         case 3: if (sec >= 1000){ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0 = LedBuff[3];}i++;break;
  69.         case 4: if (sec >= 10000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0 = LedBuff[4];}i++;break;
  70.         case 5: if (sec >= 100000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0 = LedBuff[5];}i = 0;break;
  71.         default:break;
  72.         }
  73. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册