数码管动态显示

所谓的动态显示就是数码管不断变化,当变化速度超过人眼的识别范围时看起来就像数码管一直显示。

数码管动态显示时需要用到两个锁存器,一个是段锁存,一个是位锁存。一般开发板上使用的数码管动态显示,一组为八个数码管,这里可以称之为八位,每个数码管为一位,位锁存器就是决定哪一位亮起来,而位锁存器决定亮的那一位显示什么。动态显示一般先传段码,决定下一次显示什么内容,再传位码,使下一位亮起,段码和位码的内容都是事先定义一个全局数组,然后查表实现,一般位码数组内容是不做变化的,想改变显示内容只要改变相应位的段码就行。

定义段码

unsigned char regport[8] = {}; //显示内容自定义

定义位码

unsigned char bitport[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //因为位码的作用是让数码管一个一个按顺序亮,所以一般不做改变。

定义使用的I/O口

#define SEGPORT P0
sbit bit_select = P2^0;
sbit seg_select = P2^1;

延时函数

void delay_us(unsigned char t)

{

    while(--t);

}

主函数中

while(1)

{

    for(i = 0; i < 8; i ++)

    {

        SEGPORT = regdate[i];

        seg_select = 1;

        seg_select = 0;


        SEGPORT = regdata[i];

        bit_select = 1;

        bit_select = 0;

        delay_us(2);

    }

}

此时发现使用上述延时会有重影出现,这是因为段码先传入,位码后做变化,当每次变化延时足够长时,正确显示时间远大于位码变化时间,所以几乎看不出,延时越短重影越明显。想解决重影,只要先把数码管全关闭,之后操作段码和位码的变化,位码一变化完成就打开数码管,这样就能消除重影。

改进后程序如下

while(1)

{

    for(i = 0; i < 8; i ++)

    {

        SEGPORT = 0xff;

        bit_select = 1;

        bit_select = 0;


        SEGPORT = 0xff;

        seg_select = 1;

        seg_select = 0;


        SEGPORT = regdate[i];

        seg_select = 1;

        seg_select = 0;


        SEGPORT = regdata[i];

        bit_select = 1;

        bit_select = 0;

        delay_us(2);

    }

}

你可能感兴趣的:(单片机学习笔记)