51单片机数码管的动态显示

/*******************************************

*   本节实验,需要加深理解锁存器,位选线,

* 段选线等,以及防止重影的方法;和keil中数

* 组的定义;

*另外想让8个数码管同时显示不同的数字,

*靠的是程序的快速运行,和人眼的短时间缓冲原理实现的

*本例的延时设定是1ms,可以分别用100ms

*等尝试一下

******************************************/

#include <reg52.h>

#define uchar   unsigned char

#define uint    unsigned int

sbit dula = P2^6; //锁存器的段选线

sbit wela = P2^7;//锁存器位选线

uchar code table[]={

    0x3f,0x06,0x5b,0x4f,

    0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,

    0x39,0x5e,0x79,0x71,  //定义一个数组,每一个元素分别是0-f;

};

void delayms(uint);

void main()

{

    while(1){

        dula = 1;//打开端选线

        P0 = table[0];//写入数组的第一个元素,即数字0

        dula = 0;//关闭端选线,防止打开位选线时混乱

        P0 = 0xff;//将数码管重置清楚,防止有重影发生,所以这步操作也叫做消影

        wela = 1;//打开位选线

        P0 = 0xfe;//选择位,需要点亮的数码管,当前选择的是第一个数码管

        wela = 0;//关闭位选线

       delayms(1);1ms的延迟。防止读写速率太快出现重影

        dula = 1;

        P0 = table[1];

        dula = 0;

        P0 = 0xff;

        wela = 1;

        P0 = 0xfd;

        wela = 0;

       delayms(1);

        dula = 1;

        P0 = table[2];

        dula = 0;

        P0 = 0xff;

        wela = 1;

        P0 = 0xfb;

        wela = 0;

       delayms(1);

       dula = 1;

        P0 = table[3];

        dula = 0;

        P0 = 0xff;

        wela = 1;

        P0 = 0xf7;

        wela = 0;

       delayms(1);

       

   

    }

}

void delayms(i)

{

    uint j,k;

    for(j = i;j > 0;j--){

        for(k = 110;k > 0;k--);

    }

}

猜你喜欢

转载自blog.csdn.net/Xiao_peng117/article/details/78620413