四位数码管代码实验室 Pro

看代码 → 猜结果 → 补代码 → 运行验证 → 理解每一行。

得分 0
已完成 0/6

代码单步执行

P2 = 0xFE;
P1 = 0x3F;
delay1ms(500);
快速判断
P1 主要负责:

数码管仿真

代码解释

等待执行
点击“下一行”,观察代码对数码管的影响。

P1 段选实验

P2 = 0xFE;
P1 = 0x3F;
P1 =
代码补全 让第1位显示数字3
P2 = 0xFE;
P1 = ?;
P1负责显示什么数字。数字3对应哪一个段码?

运行结果

理解提示

P2 固定为 0xFE,也就是一直选择第1位。

只修改 P1,观察显示数字如何发生变化。

P2 位选实验

P1 = 0x3F;
P2 = 0xFE;
P2 =
代码补全 让第3位显示数字0
P1 = 0x3F;
P2 = ?;
第1~4位依次对应:0xFE、0xFD、0xFB、0xF7。

运行结果

P2 为什么能选位置?

0xFE

1111 1110

第1位为低电平

第1位被选中

动态扫描播放器

P2=0xFE; P1=seg[1]; delay1ms(2);
P2=0xFD; P1=seg[2]; delay1ms(2);
P2=0xFB; P1=seg[3]; delay1ms(2);
P2=0xF7; P1=seg[4]; delay1ms(2);
速度:
预测题
动态扫描时,某一个瞬间真正点亮的是:

实际扫描

切换足够快时,人眼感觉:
1234

当前执行

等待开始
点击下一步,观察四个位如何轮流被选中。

综合代码补全

综合代码补全 ①:让第2位显示数字5
P2 = ?;
P1 = ?;
综合代码补全 ②:第4位显示数字8
P2 = ?;
P1 = ?;

循环与扫描补全

综合代码补全 ③:补全一位显示 0~9 的循环
for(i=0;i<10;i++)
{
  P1 = ?;
  ?(500);
}
综合代码补全 ④:补全四位动态扫描
P2=0xFE; P1=seg[num]; delay1ms(2);
P2=?; P1=seg[num]; delay1ms(2);
P2=?; P1=seg[num]; delay1ms(2);
P2=?; P1=seg[num]; delay1ms(2);

挑战进度

目标:全部完成
○ 第2位显示数字5
○ 第4位显示数字8
○ 0~9循环补全
○ 动态扫描补全
核心理解
P1:显示什么数字
P2:第几位亮
seg[i]:根据 i 查找数字段码
delay1ms:控制数字停留时间
完整代码
查看老师给出的完整程序与详细解释
这份代码用于理解:P1、P2、数组 seg、for 循环和延时函数分别在做什么。
#include <reg51.h>      // AT89C51头文件

/*================================================
    P1决定:数码管显示什么数字(段选口)亮什么数字!

    P1 = 0x3F;     显示数字 0
    P1 = 0x06;     显示数字 1
    P1 = 0x5B;     显示数字 2
    P1 = 0x4F;     显示数字 3
    P1 = 0x66;     显示数字 4
    P1 = 0x6D;     显示数字 5
    P1 = 0x7D;     显示数字 6
    P1 = 0x07;     显示数字 7
    P1 = 0x7F;     显示数字 8
    P1 = 0x6F;     显示数字 9
================================================*/

/*================================================
    P2决定:第几个数码管亮(位选口)第几位亮

    P2 = 0xFE;     选中第1位数码管
                   1111 1110

    P2 = 0xFD;     选中第2位数码管
                   1111 1101

    P2 = 0xFB;     选中第3位数码管
                   1111 1011

    P2 = 0xF7;     选中第4位数码管
                   1111 0111

    P2 = 0xFF;     四位全部关闭
                   1111 1111
================================================*/


//定义数组
unsigned char code seg[10] =
{
    0x3F,      // seg[0]:显示数字0
    0x06,      // seg[1]:显示数字1
    0x5B,      // seg[2]:显示数字2
    0x4F,      // seg[3]:显示数字3
    0x66,      // seg[4]:显示数字4
    0x6D,      // seg[5]:显示数字5
    0x7D,      // seg[6]:显示数字6
    0x07,      // seg[7]:显示数字7
    0x7F,      // seg[8]:显示数字8
    0x6F       // seg[9]:显示数字9
};


完整代码等你们做完作业给你们看
下面是去掉大段解释后的代码版本,内容按你提供的代码整理。
#include <reg51.h>      // AT89C51头文件

//定义数组
unsigned char code seg[10] =
{
    0x3F,      // seg[0]:显示数字0
    0x06,      // seg[1]:显示数字1
    0x5B,      // seg[2]:显示数字2
    0x4F,      // seg[3]:显示数字3
    0x66,      // seg[4]:显示数字4
    0x6D,      // seg[5]:显示数字5
    0x7D,      // seg[6]:显示数字6
    0x07,      // seg[7]:显示数字7
    0x7F,      // seg[8]:显示数字8
    0x6F       // seg[9]:显示数字9
};

//延时函数
void delay1ms(unsigned int t)
{
    unsigned int i, j;

    for(i = 0; i < t; i++)
    {
        for(j = 0; j < 120; j++);
    }
}

//主函数
等你们做完作业给你们看