ohy3686 发表于 2018-1-27 13:18

【蓝桥杯单片机04】数码管的动态显示

本帖最后由 ohy3686 于 2018-1-28 12:47 编辑

【蓝桥杯单片机04】数码管的动态显示广东职业技术学院欧浩源
    在掌握数码管静态显示的基本技术之后,再学习数码管动态显示的技能并不会有太大的技术障碍,只要把动态显示技术的基本原理和程序设计思路弄清楚,就能够很轻松的实现各种相关的应用了。

1、动态显示的基本原理与实现思路
    动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流显示过程中,每位数码管点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
2、单元实训题目

3、实现源码参考#include "reg52.h"

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

//数码管不带小数点的段码
unsigned char code SMG_NoDot =
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
   0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
   0xbf,0x7f};
unsigned char num = 1;
void DisplaySMG_Dynamic();         
               
void Delay(unsigned int time)
{
      while(time--)
      {
                DisplaySMG_Dynamic();
      }
}

void DelaySMG(unsigned int 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)
{
      Init74HC138(6);
      P0 = (0x01 << pos);
      Init74HC138(7);
      P0 = value;
}

void DisplaySMG_Dynamic()
{
      DispaySMG_Bit(SMG_NoDot,0);      //在第0位数码管处显示数字“2”
      DelaySMG(500);
      DispaySMG_Bit(0xff,0);                        //消隐
      DispaySMG_Bit(SMG_NoDot,1);
      DelaySMG(500);
      DispaySMG_Bit(0xff,1);
      DispaySMG_Bit(SMG_NoDot,2);
      DelaySMG(500);
      DispaySMG_Bit(0xff,2);
      DispaySMG_Bit(SMG_NoDot,3);
      DelaySMG(500);
      DispaySMG_Bit(0xff,3);
      DispaySMG_Bit(SMG_NoDot,4);
      DelaySMG(500);
      DispaySMG_Bit(0xff,4);
      DispaySMG_Bit(SMG_NoDot,5);
      DelaySMG(500);
      DispaySMG_Bit(0xff,5);
      
      DispaySMG_Bit(SMG_NoDot,6);
      DelaySMG(500);
      DispaySMG_Bit(0xff,6);
      DispaySMG_Bit(SMG_NoDot,7);
      DelaySMG(500);
      DispaySMG_Bit(0xff,7);
}

main()
{
      while(1)
      {
                DisplaySMG_Dynamic();
                num++;
                if(num > 12)
                {
                        num = 1;
                }
                Delay(100);
      }
}

OMGde 发表于 2020-2-2 16:38

月份为神魔要那样显示
在最后主程序延时不行吗

AgZnV 发表于 2022-4-3 12:45

页: [1]
查看完整版本: 【蓝桥杯单片机04】数码管的动态显示