【蓝桥杯单片机03】数码管的静态显示

【蓝桥杯单片机03】数码管的静态显示

广东职业技术学院  欧浩源

    不管是省赛还是国赛,数码管显示是蓝桥杯“单片机设计与开发”赛项必考的内容之一。要掌握数码管显示这个内容需要分为两个步骤:首先弄清楚数码管的静态显示,然后再去掌握数码管的动态显示。至于什么是静态显示,什么是动态显示,不清楚的可以百度一下。


1、关于数码管的基础知识
    要把内容正确的显示在数码管上,首先要明确数码管的类型与段码结构。在CT107D单片机综合实训平台上使用的数码管是F3461BH。为什么要看这个型号呢?因为它能告诉你数码管的类型。倒数第2个字母是“B”,说明这个数码管是共阳类型的,如果该字母为“A”则为共阴类型。不同类型的数据管,其段码数组是截然不同的。
在明确数码管类型之后,就可以确定段码数组了,也就是显示内容所对应的值,例如,要在F3461BH上显示数值“7”,那么就要输出的数值为“0xf8”。怎么样才能得到这个段码数组呢?你可以从网上或其他参考资料上获取,也可以自己对于电路图或者测试段码得到。

2、数码管的电路连接
    F3461BH是一个4位8段的数码管,其中a、b、c、d、e、f、g、dp引脚分别对应8个段码,该8个引脚通过74HC573锁存器与单片机的P0端口相连。另外有com1~com4四个公共控制脚,该应用为高电平则使能对应位的数码管。两个F3461BH一共有8个com控制引脚,也是通过74HC573锁存器与单片机的P0端口相连的。因此,在操控数码管显示的过程中也离不开74HC138译码器和74HC573锁存器,关于这部分的内容可以参考“【蓝桥杯单片机02】LED的基本控制

3、单元实训题目

4、实现源码参考

#include "reg52.h"  

sbit HC138_A = P2^5;    
sbit HC138_B = P2^6;    
sbit HC138_C = P2^7;    

//数码管的段码数组
unsigned char code SMG_Duanma[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

void Delay(unsigned int time)
{
    while(time--);
    while(time--);
}

void Init74HC138(unsigned char n)
{
    switch(n)
    {
        case 4:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 5:
            HC138_A = 1;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 6:
            HC138_A = 0;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 7:
            HC138_A = 1;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 8:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 0;
            break;
    }
}

void DispaySMG_Bit(unsigned char value, unsigned char pos)
{
    char i;
    Init74HC138(6);
    P0 = (0x01 << pos);
    Init74HC138(7);
    P0 = value;
}

void DispaySMG_Static()
{
    char i,j;
    for(i = 0; i < 8; i++)
    {
        for(j = 0; j < 10; j++)
        {
            DispaySMG_Bit(SMG_Duanma[j],i);
            Delay(60000);
        }
    }
    
    Init74HC138(6);
    P0 = 0xff;
    for(i = 0; i < 16; i++)
    {
        Init74HC138(7);
        P0 = SMG_Duanma[i];
        Delay(60000);
    }
}

main()
{
        while(1)
        {
            DispaySMG_Static();
        }
}

 

posted on 2018-01-27 12:00  小蜜蜂老师  阅读(6037)  评论(0编辑  收藏  举报