【案例】数码管显示

数码管显示



一、数码管6位显示数字9

1.效果图

请添加图片描述

2.代码块

#include<reg52.h>  // 头文件

// 定义锁存器控制引脚
sbit dula=P3^4;    // 锁存器U2(段选)
sbit wela=P1^6;    // 锁存器U2(位选)

// 主函数
void main()
{
    // 1.位选控制
    wela=1;     // 打开位选
    P0=0xc0; // 位选3个数码管 1111 1000
    wela=0;     // 关闭位选
    
    // 2.段选控制
    dula=1;     //    打开段选
    P0=0x6F; // 数码管显示“0”  0011 1111
    dula=0;     // 关闭段选

    // 3.保持
    while(1);
}

二、数码管第1位和第6位显示数字7

1.效果图

请添加图片描述

代码块

#include<reg52.h>  // 头文件

// 定义锁存器控制引脚
sbit dula=P3^4;    // 锁存器U2(段选)
sbit wela=P1^6;    // 锁存器U2(位选)

// 主函数
void main()
{
    // 1.位选控制
    wela=1;     // 打开位选
    P0=0xDE; // 位选3个数码管 1111 1000
    wela=0;     // 关闭位选
    
    // 2.段选控制
    dula=1;     //    打开段选
    P0=0x07; // 数码管显示“0”  0011 1111
    dula=0;     // 关闭段选

    // 3.保持
    while(1);
}

三、数码管轮播显示6位

1.效果图

请添加图片描述

2.代码块

#include<reg52.h>  // 头文件

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula=P3^4;    // 锁存器U2(段选)
sbit wela=P1^6;    // 锁存器U3(位选)

// 共阴极数码管段码表
uchar code seg_code[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 位选码表 - 6位数码管(低电平选通)
uchar code bit_code[] = {
    0xFE, // 1111 1110 - 第1位
    0xFD, // 1111 1101 - 第2位
    0xFB, // 1111 1011 - 第3位
    0xF7, // 1111 0111 - 第4位
    0xEF, // 1110 1111 - 第5位
    0xDF  // 1101 1111 - 第6位
};

// 延时函数
void delay(uint ms) {
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

// 主函数
void main()
{
    uchar digit, pos, scan;
    while(1) 
    {
        for(digit = 0; digit < 10; digit++) // 轮流显示0到9 
        {  
            // 每个数字显示约500ms(100轮扫描 × 6位 × 约0.8ms)
            for(scan = 0; scan < 100; scan++) 
            {
                // 快速扫描6位数码管
                for(pos = 0; pos < 6; pos++)
                {
                    // 1. 消隐 - 关闭段选
                    P0 = 0x00;
                    dula = 1;
                    dula = 0;
                    
                    // 2. 位选 - 选中当前位
                    P0 = bit_code[pos];
                    wela = 1;
                    wela = 0;
                    
                    // 3. 段选 - 发送数字段码
                    P0 = seg_code[digit];
                    dula = 1;
                    dula = 0;
                    
                    // 4. 延时约1ms(每位显示时间)
                    delay(1);
                }
            }
        }
    }
}

四、数码管轮播显示2位

1.效果图

请添加图片描述

2.代码块

#include<reg52.h>  // 头文件

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula=P3^4;    // 锁存器U2(段选)
sbit wela=P1^6;    // 锁存器U3(位选)

// 共阴极数码管段码表
uchar code seg_code[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 位选码表 - 只使用第3位和第4位(低电平选通)
// 位顺序:第1位 第2位 第3位 第4位 第5位 第6位
uchar code bit_code[] = {
    0xFB, // 1111 1011 - 第3位亮
    0xF7  // 1111 0111 - 第4位亮
};

// 延时函数
void delay(uint ms) {
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

// 主函数
void main()
{
    uchar digit, pos, scan;
    while(1) 
    {
        for(digit = 0; digit < 10; digit++) // 轮流显示0到9 
        {  
            // 每个数字显示约400ms(100轮扫描 × 2位 × 2ms)
            for(scan = 0; scan < 100; scan++) 
            {
                // 只扫描第3位和第4位
                for(pos = 0; pos < 2; pos++)
                {
                    // 1. 消隐 - 关闭段选
                    P0 = 0x00;
                    dula = 1;
                    dula = 0;
                    
                    // 2. 位选 - 选中当前位(第3位或第4位)
                    P0 = bit_code[pos];
                    wela = 1;
                    wela = 0;
                    
                    // 3. 段选 - 发送数字段码
                    P0 = seg_code[digit];
                    dula = 1;
                    dula = 0;
                    
                    // 4. 延时约2ms(每位显示时间)
                    delay(2);
                }
            }
        }
    }

五、数码管显示123456

1.效果图

请添加图片描述

2.代码块

#include <reg52.h>  // 头文件                           ```c

#define uchar unsigned char
#define uint unsigned int

// 定义锁存器控制引脚
sbit dula = P3^4;    // 段选锁存器U2
sbit wela = P1^6;    // 位选锁存器U3

// 数码管的段码表(定义0-9的段码)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管显示位码,对应第1到第6个数码管(需要将2进制转换成16进制)
uchar code TableWela[] = {
    0xFE,
    0xFD,
    0xFB,
    0xF7,
    0xEF,
    0xDF
// 补充代码
    // 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管
    // 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管
    // 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管
    // 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管
     // 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管
      // 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管
};

// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
     {
        for(j=0;j<125;j++);
     }   
}

// 主函数
void main() {
    uchar i;
    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00;           // 清空之前的输出
            dula = 0;
            wela = 0;

            P0 = TableWela[i];   // 先送位码,依次选中1-6位数码管
            wela = 1;            // 锁存位码
            wela = 0;

            P0 = TableDula[i+1];   // 再送段码,第1个数码管显示0,第2个数码管显示1...
            dula = 1;            // 锁存段码
            dula = 0;

            delay(2);            // 保持一段时间
        }
    }
}

六、数码管显示13.14.15

1.效果图

在这里插入图片描述

2.代码块

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula = P3^4; // 段选锁存器
sbit wela = P1^6; // 位选锁存器

// 数码管的段码表(0~9)
uchar code TableDula[] = { 
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 数码管段码表(0~9,带小数点)→ 我已经帮你补全!
uchar code TableDulaPoint[] = {
    0xBF, // 0.
    0x86, // 1.
    0xDB, // 2.
    0xCF, // 3.
    0xE6, // 4.
    0xED, // 5.
    0xFD, // 6.
    0x87, // 7.
    0xFF, // 8.
    0xEF  // 9.
};

// 数码管显示位码,对应第1到第6个数码管
uchar code TableWela[] = {
    0xfe, // 第1位
    0xfd, // 第2位
    0xfb, // 第3位
    0xf7, // 第4位
    0xef, // 第5位
    0xdf  // 第6位
};

// 延时函数
void delay(uchar x)
{
    uchar j;
    while(x--)
    {
        for(j = 0; j < 125; j++);
    }
}

void main() {
    uchar i;

    // ====================== 这里改成 1 3 . 1 4 . 1 5 ==================
    // 6位数码管显示:1 3 1 4 1 5
    uchar displayData[6] = {1, 3, 1, 4, 1, 5};

    // 小数点:第2位、第4位点亮 → 显示 13.14.15
    uchar pointFlag[6] = {0, 1, 0, 1, 0, 0};
    // =================================================================

    while(1) {
        for(i = 0; i < 6; i++) {
            P0 = 0x00; // 清除显示
            dula = 0;
            wela = 0;

            // 位选
            P0 = TableWela[i];
            wela = 1;
            wela = 0;

            // 段码:判断是否需要小数点
            if(pointFlag[i] == 1)
			{
				P0 = TableDulaPoint[displayData[i]];
			}
            else
			{
			   P0 = TableDula[displayData[i]];
			}

            dula = 1;
            dula = 0;

            delay(2);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值