zoukankan      html  css  js  c++  java
  • 【蓝桥杯单片机04】数码管的动态显示

    【蓝桥杯单片机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;    
    
    //共阳4位数码管的段码数组
    unsigned char code SMG_NoDot[18] = 
        {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[2],0);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[0],1);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[1],2);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[8],3);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[16],4);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[16],5);
        DelaySMG(500);
        
        DispaySMG_Bit(SMG_NoDot[num/10],6);
        DelaySMG(500);
        DispaySMG_Bit(SMG_NoDot[num%10],7);
        DelaySMG(500);
    }
    
    main()
    {
        while(1)
        {
            DisplaySMG_Dynamic();
            num++;
            if(num > 12)
            {
                num = 1;
            }
            Delay(100);
        }
    }
  • 相关阅读:
    德阳机场大巴
    “以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。”的解决办法
    Web程序中网页间数据传递方法小结
    转向姚BLOG
    用ASP.NET在IIS中创建虚拟目录
    TreeView 点击Nodes属性出现“指定的转换无效”错误
    该页正在访问其控制范围之外的数据。这有些危险。是否继续?
    JS的Trim
    JS简明中文教程
    电子数据交换
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/8370496.html
Copyright © 2011-2022 走看看