005-数码管的使用

实现数码管的控制及使用方式

数码管的使用

  • 功能:实现数码管的控制及使用方式

方案一:控制数码管1显示数字5

#include<reg52.h>

sbit Ls1 = P2^2;    //74LS138&#x63A7;&#x5236;&#x7AEF;
sbit Ls2 = P2^3;
sbit Ls3 = P2^4;
void main()
{
    Ls1 = 0;    //&#x9009;&#x62E9;&#x6570;&#x7801;&#x7BA1;1
    Ls2 = 0;
    Ls3 = 0;
    //P0 = 0x6D;    //&#x6570;&#x5B57;5   (&#x6CE8;&#x610F;&#xFF1A;h,g,f,e,d,c,b,a,&#x663E;&#x793A;&#x8C01;&#x4E3A;1)
    P0 = 0x77;
    while(1);
}
</reg52.h>

方案二:数码管从0~F动态显示

#include<reg52.h>

//&#x6570;&#x7801;&#x7BA1;&#x4ECE;0~F&#x52A8;&#x6001;&#x663E;&#x793A;&#xFF1B;

sbit LS1 = P2^2;
sbit LS2 = P2^3;
sbit LS3 = P2^4;

void main()
{
    unsigned char shu_ma_guan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   //0~F&#x7684;&#x5BF9;&#x5E94;&#x503C;
    unsigned char i = 0;
    unsigned int cnt = 0;

    TMOD = 0x01;    //&#x5B9A;&#x65F6;&#x5668;,&#x4E00;&#x6B21;10ms
    TH0 = 0xD8;
    TL0 = 0xF0;
    TR0 = 1;

    LS1 = 0;    //74LS138&#x7247;&#x9009;&#x4E00;&#x53F7;&#x6570;&#x7801;&#x7BA1;
    LS2 = 0;
    LS3 = 0;

    while(1)
    {
        P0 = shu_ma_guan[i];
        if(TF0 == 1)
        {
            TF0 = 0;
            TH0 = 0xD8;
            TL0 = 0xF0;
            cnt++;
            if(cnt == 100)
            {
                cnt = 0;
                i++;
                if(i == 15)
                {
                i = 0;
                }
            }
        }
    }

}
</reg52.h>

方案三:八个数码管动态显示,实现每一秒数字加1的效果,从1显示至99999999

#include<reg52.h>   //&#x5934;&#x6587;&#x4EF6;

sbit LS1 = P2^2;    //74LS138&#x63A7;&#x5236;&#x7AEF;
sbit LS2 = P2^3;
sbit LS3 = P2^4;

unsigned char shu_ma_guan[16] = {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                    //0~F&#x7684;&#x5BF9;&#x5E94;&#x503C;
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char LedBuff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //&#x5B9A;&#x4E49;8&#x4E2A;&#x6570;&#x7801;&#x7BA1;&#x521D;&#x59CB;&#x72B6;&#x6001;&#x5747;&#x4E3A;00000000&#xFF0C;&#x5373;&#x90FD;&#x4E0D;&#x663E;&#x793A;

void main() //&#x4E3B;&#x51FD;&#x6570;
{
    unsigned int cnt = 0;
    unsigned long sec = 0;
    unsigned char i = 0;

    TMOD = 0x01;        //&#x5B9A;&#x65F6;&#x5668;&#x5B9A;&#x4E49;&#xFF0C;&#x6676;&#x632F;12Mhz,&#x6BCF;&#x6B21;1ms
    TH0 = 0xFC;
    TL0 = 0x18;
    TR0 = 1;        //&#x6253;&#x5F00;&#x5B9A;&#x65F6;&#x5668;
    while(1)
    {
        if(TF0 == 1)    //&#x6EA2;&#x51FA;&#x6807;&#x5FD7;
        {
            TF0 = 0;    //&#x6EA2;&#x51FA;&#x6807;&#x5FD7;&#x590D;&#x4F4D;
            TH0 = 0xFC; //&#x5B9A;&#x65F6;&#x5668;&#x5B9A;&#x4E49;&#x590D;&#x4F4D;
            TL0 = 0x18;
            cnt++;      //&#x5B9A;&#x65F6;&#x5668;&#x6EA2;&#x51FA;&#x8BA1;&#x6B21;
            if(cnt == 1000)     //&#x6EA2;&#x51FA;1000&#x6B21;&#xFF0C;&#x65F6;&#x957F;1000ms,&#x4E3A;1&#x79D2;
            {
                cnt = 0;    //&#x8BA1;&#x6B21;&#x6E05;&#x96F6;
                sec++;      //&#x65F6;&#x957F;&#x52A0;1.&#x5373;&#x8FC7;&#x4E86;&#x4E00;&#x79D2;&#x949F;
                LedBuff[0] = shu_ma_guan[sec%10];   //&#x786E;&#x5B9A;&#x6570;&#x7801;&#x7BA1;&#x5728;&#x67D0;&#x4E2A;&#x65F6;&#x95F4;&#x65F6;&#x5404;&#x4E2A;&#x4F4D;&#x7684;&#x663E;&#x793A;&#x6570;&#x5B57;
                LedBuff[1] = shu_ma_guan[sec/10%10];
                LedBuff[2] = shu_ma_guan[sec/100%10];
                LedBuff[3] = shu_ma_guan[sec/1000%10];
                LedBuff[4] = shu_ma_guan[sec/10000%10];
                LedBuff[5] = shu_ma_guan[sec/100000%10];
                LedBuff[6] = shu_ma_guan[sec/1000000%10];
                LedBuff[7] = shu_ma_guan[sec/10000000%10];
            }
            //&#x5907;&#x6CE8;&#xFF1A;&#x8FD9;&#x91CC;&#x7684;&#x7247;&#x9009;&#x4FE1;&#x53F7;&#x6392;&#x5E8F;LS3&#x4E3A;&#x9AD8;&#x4F4D;&#xFF0C;LS1&#x4E3A;&#x4F4E;&#x4F4D;,&#x5BF9;&#x5E94;74LS138&#x8BD1;&#x7801;&#x5668;&#x4E2D;C&#x4E3A;&#x9AD8;&#x4F4D;&#xFF0C;A&#x4E3A;&#x4F4E;&#x4F4D;
                        //&#x4E0B;&#x9762;&#x4E00;&#x6BB5;&#x4F5C;&#x7528;&#x4E3A;&#xFF1A;&#x6570;&#x7801;&#x7BA1;&#x5237;&#x65B0;
            if(i == 0)
            {LS1=0; LS2=0; LS3=0;i++;P0=LedBuff[0];}    //&#x7247;&#x9009;&#x4F7F;&#x5F97;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x7801;&#x7BA1;&#x663E;&#x793A;
            else if(i == 1)
            {LS1=1; LS2=0; LS3=0;i++;P0=LedBuff[1];}    //&#x7247;&#x9009;&#x4F7F;&#x5F97;&#x7B2C;&#x4E8C;&#x4E2A;&#x6570;&#x7801;&#x7BA1;&#x663E;&#x793A;
            else if(i == 2)
            {LS1=0; LS2=1; LS3=0;i++;P0=LedBuff[2];}
            else if(i == 3)
            {LS1=1; LS2=1; LS3=0;i++;P0=LedBuff[3];}
            else if(i == 4)
            {LS1=0; LS2=0; LS3=1;i++;P0=LedBuff[4];}
            else if(i == 5)
            {LS1=1; LS2=0; LS3=1;i++;P0=LedBuff[5];}
            else if(i == 6)
            {LS1=0; LS2=1; LS3=1;i++;P0=LedBuff[6];}
            else if(i == 7)
            {LS1=1; LS2=1; LS3=1;i=0;P0=LedBuff[7];}
        }
    }
}
</reg52.h>

备注:关于此方案中的数码管刷新有一种新的方法,替换上面的刷新代码即可实现,具体代码如下:

switch(i)
{
      case 0: LS3=0;LS2=0;LS1=0;i++;P0=LedBuff[0];break;
      case 1: LS3=0;LS2=0;LS1=1;i++;P0=LedBuff[1];break;
      case 2: LS3=0;LS2=1;LS1=0;i++;P0=LedBuff[2];break;
      case 3: LS3=0;LS2=1;LS1=1;i++;P0=LedBuff[3];break;
      case 4: LS3=1;LS2=0;LS1=0;i++;P0=LedBuff[4];break;
      case 5: LS3=1;LS2=0;LS1=1;i++;P0=LedBuff[5];break;
      case 6: LS3=1;LS2=1;LS1=0;i++;P0=LedBuff[6];break;
      case 7: LS3=1;LS2=1;LS1=1;i=0;P0=LedBuff[7];break;
      default: break;
}

_问题一:_鬼影
鬼影:在以上方式实现从1~99999999的过程中,数码管显示可能会出现鬼影,即在非显示段会出现暗红色的情况。(目前所用的普中A2开发板好像没出现此问题,但是会有开发板出现这样的情况,例如金沙滩工作室的开发板)
出现原因:瞬态误差。
鬼影的解决方法:目前有两种方式:

  • 每次刷新完后delay一下,即在break语句前添加delay,但是这样解决时,一方面delay时间难以确定,另外这样也会占用单片机CPU,一般不推荐使用。
  • 每次刷新之前先关闭一下 数码管所有的段,即可以在刷新代码前加上语句:
P0 = 0x00;            //&#x4F7F;&#x5F97;&#x6570;&#x7801;&#x7BA1;&#x7684;&#x6240;&#x6709;&#x6BB5;&#x5168;&#x706D;

_问题二:_数码管加1时其他数码管同一抖动一下
出现原因:确定数码管在某个时间时各个位的显示数字的计算占用了一定的时间,造成了刷新时间的不均衡,在加1时造成其他数码管抖动闪烁。
解决办法:中断机制——在计算的过程中,如果刷新时间到了,立马去执行刷新任务,刷新结束后再回头进行计算过程(具体方式见006-中断)。

Original: https://www.cnblogs.com/Yang-shihao/p/14352291.html
Author: shihao_Yang
Title: 005-数码管的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576733/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球