3.3 数码管动态显示

题目:第一个数码管显示1,亮0.5s,关闭,第二个显示2,亮0.5s,关闭,第六个显示6,亮关;再第一个亮,循环。

//第一个亮1,0.5s,第二个亮2,0.5s,直到第六个
#include <reg52.h>
#include<intrins.h>
sbit dula=P2^6;      //申明U1锁存器的锁存端
sbit wela=P2^7;      //申明U2锁存器的锁存端

void delayms(uint x);
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar a,b;

void main()
{

   while(1)                             //主程序里面执行一个while语句,一直在循环,这个与书中一样
   {
    b=0xfe;                              // 给b赋的初值,位选第一位点亮: 1111 1110       
    for (a=1;a<7;a++)              //for循环里面,表达式2为真,执行语句,然后表达式3,然后继续表达式2,为真执行语句,表达式3……当a=6,<7,位选是6,段选是6,位选变为b=7,段选a=a+1=7, a<7不成立,则跳出for语句,不执行语句。 出来后while有2个语句,while一直为真,则while的2个语句重复执行,第一个语句赋值,第二个语句又开始使用。a=1,b=第一位,开始亮灯。
                 {
                 wela=1;                  //打开位选锁存端,书中是先段选,再位选
                  P0=b;                    //定位位选,第a个灯亮,第a端对应数据为0,其他为1.
                 wela=0;                  //关闭位选锁存端
                  P0=ff;                    //消影作用。
                  dula=1; 
                  P0=table[a];
                  dula=0;
                  delayms(500);
                  b=_crol_(b,1)          //这里跟书中不同,使用一个循环左移1位,这样就能让位选成为第二位,第三位……
                 } 
    }                    
                      
}
void delayms(uint x)
{
  uint i,j;
  for(i=x; i>0; i--)
     for (j=110; j>0; j--);
}

当把每个灯点亮的时间缩短至1ms,则这时候6个数码管上非常稳定,清晰地显示着123456字样了,所以,所谓动态扫描显示,是轮流向各位数码管送出字形码和相应的位选,因为时间特别的快,利用发光管的余辉和人眼视觉暂留作用,人眼睛感觉好像各个数码管同时都在显示,其实是一位一位轮流显示,特别快,肉眼无法分辨。

猜你喜欢

转载自blog.csdn.net/weixin_44386138/article/details/121560255