栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C51单片机之静态/动态数码管【03】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C51单片机之静态/动态数码管【03】

前言 数码管



分为共阴极和共阳极。
要想时显示6,需要AFEDCG均点亮。对应共阴极段码1011 1110

四位一体数码管

让第三位显示1,共阴极连接。
通过位选1101 仅让第三个数码管导通。然后再进行段选0110 0000 使数码管置1

开发板原理图


74HC245 双向数据缓冲器,为了提高驱动能力
DIR = VCC 时,把左边数据缓冲送到到右边去
DIR = 低电平时,把右边数据缓冲送到左边

高电平驱动电流有限,低电平驱动能力更强,这也是LED共阳极的原因。

74HC245 驱动能力是从VCC汲取过来的,能让数码管显示亮一点。

C是高位A是低位,CBA = 000时,
Y0有效,Y0是低电平有效
Y0 = 0,Y1~Y7 = 1,
也就是LED1 = 0

静态数码管

让LED6显示6

#include 
#include 

// 延时xms
void Delay1ms(unsigned int xms) //@11.0592MHz
{
    unsigned char i, j;
    while (xms) // while里面是延时1ms的代码
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j)
                ;
        } while (--i);
        --xms;
    }
}

void test1()
{
    // 位选,让第六个数码管(LED6)导通 也就是Y5=0
    P2_4 = 1;
    P2_3 = 0;
    P2_2 = 1;
    // 由于P2口也控制LED的亮灭,因此会产生引脚冲突,LED6数码管点亮的同时,D4也亮了

    // 段选 0111 1101
    P0 = 0x7D;
    while (1)
    {
        // 动态停机
    }
}
共阴极数码管断码


通过子函数调用实现,某个数码管显示某个数字。

unsigned char NixieTubeTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 对应0~9

void NixieTube(unsigned char location, unsigned char number)
{
    // 位选
    switch (location)
    {
    // LED8 是从左往右的第一个数码管
    case 1:
        P2_4 = 1;
        P2_3 = 1;
        P2_2 = 1;
        break;
    case 2:
        P2_4 = 1;
        P2_3 = 1;
        P2_2 = 0;
        break;
    case 3:
        P2_4 = 1;
        P2_3 = 0;
        P2_2 = 1;
        break;
    case 4:
        P2_4 = 1;
        P2_3 = 0;
        P2_2 = 0;
        break;
    case 5:
        P2_4 = 0;
        P2_3 = 1;
        P2_2 = 1;
        break;
    case 6:
        P2_4 = 0;
        P2_3 = 1;
        P2_2 = 0;
        break;
    case 7:
        P2_4 = 0;
        P2_3 = 0;
        P2_2 = 1;
        break;
    case 8:
        P2_4 = 0;
        P2_3 = 0;
        P2_2 = 0;
        break;
    }

    // 段选
    P0 = NixieTubeTable[number];
}
void test2()
{
    // 第一位显示1,然后变成第二位显示2
    NixieTube(1, 1);
    Delay1ms(500);
    NixieTube(2, 2);
    Delay1ms(500);
    while (1)
    {
    }
}

void main()
{
    test2();
}
动态数码管
// 动态数码管
void test3()
{
    while (1)
    {
        NixieTube(1, 1);
        NixieTube(2, 2);
        NixieTube(3, 3);
    }
}

void main()
{
    test3();
}

利用视觉余晖,让每个数码管都显示,但这样会出现错位,3跑到1的位置上去了等。。。

数码管消影

位选 段选 位选 段选 位选 段选 。。。
时间太短了,单片机速度太快,上一位的段选就直接串到下一位段选了。


解决办法:
位选 段选 清零 位选 段选 清零 位选 段选 清零 。。。

#include 
#include 

// 延时xms
void Delay1ms(unsigned int xms) //@11.0592MHz
{
    unsigned char i, j;
    while (xms) // while里面是延时1ms的代码
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j)
                ;
        } while (--i);
        --xms;
    }
}

unsigned char NixieTubeTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 对应0~9

void NixieTube(unsigned char location, unsigned char number)
{
    // 位选
    switch (location)
    {
    // LED8 是从左往右的第一个数码管
    case 1:
        P2_4 = 1;
        P2_3 = 1;
        P2_2 = 1;
        break;
    case 2:
        P2_4 = 1;
        P2_3 = 1;
        P2_2 = 0;
        break;
    case 3:
        P2_4 = 1;
        P2_3 = 0;
        P2_2 = 1;
        break;
    case 4:
        P2_4 = 1;
        P2_3 = 0;
        P2_2 = 0;
        break;
    case 5:
        P2_4 = 0;
        P2_3 = 1;
        P2_2 = 1;
        break;
    case 6:
        P2_4 = 0;
        P2_3 = 1;
        P2_2 = 0;
        break;
    case 7:
        P2_4 = 0;
        P2_3 = 0;
        P2_2 = 1;
        break;
    case 8:
        P2_4 = 0;
        P2_3 = 0;
        P2_2 = 0;
        break;
    }

    // 段选
    P0 = NixieTubeTable[number];
    Delay1ms(1); // 延时1ms 让数字稳定显示
    P0 = 0x00; // 清零
}



// 动态数码管 显示学号
void test3()
{
    while (1)
    {
        NixieTube(1, 2);
        NixieTube(2, 0);
        NixieTube(3, 2);
        NixieTube(4, 0);
        NixieTube(5, 1);
        NixieTube(6, 3);
        NixieTube(7, 5);
        NixieTube(8, 7);
    }
}

void main()
{
    test3();
}
数码管驱动方式

尾声



写文不易,如果有帮助烦请点个赞~ 

Thanks♪(・ω・)ノ



由于笔者水平有限,在今后的博文中难免会出现错误之处,本人非常希望您如果发现错误,恳请留言批评斧正,希望和大家一起学习,一起进步ヽ( ̄ω ̄( ̄ω ̄〃)ゝ,期待您的留言评论。
附GitHub仓库链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号