[范例教程] 数码管的静态显示

[复制链接]
757|0
 楼主| i1mcu 发表于 2023-12-23 12:24 | 显示全部楼层 |阅读模式


  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. //用数组来存储数码管的真值表,数组将在下一章详细介绍
  8. unsigned char code LedChar[] = {
  9.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  10.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  11. };

  12. void main(){
  13.     unsigned char cnt = 0;  //记录 T0 中断次数
  14.     unsigned char sec = 0;  //记录经过的秒数

  15.     ENLED = 0;  //使能 U3,选择数码管 DS1
  16.     ADDR3 = 1;
  17.     ADDR2 = 0;
  18.     ADDR1 = 0;
  19.     ADDR0 = 0;
  20.     TMOD = 0x01;  //设置 T0 为模式1
  21.     TH0 = 0xB8;  //为 T0 赋初值 0xB800
  22.     TL0 = 0x00;
  23.     TR0 = 1;  //启动 T0

  24.     while (1){
  25.         if (TF0 == 1){  //判断 T0 是否溢出
  26.             TF0 = 0;  //T0 溢出后,清零中断标志
  27.             TH0 = 0xB8;  //并重新赋初值

  28.             TL0 = 0x00;
  29.             cnt++;  //计数值自加1
  30.             if (cnt >= 50){  //判断 T0 溢出是否达到50次
  31.                 cnt = 0;  //达到50次后计数值清零
  32.                 P0 = LedChar[sec]; //当前秒数对应的真值表中的值送到 P0 口
  33.                 sec++;  //秒数记录自加1
  34.                 if (sec >= 16){  //当秒数超过 0x0F(15)后,重新从0开始
  35.                    sec = 0;
  36.                 }
  37.             }
  38.         }
  39.     }
  40. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

279

主题

8825

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部