51单片机--8 位数码管动态显示 12 位数字

51单片机,要求用 8 位数码管动态显示 12 位学号。


还要用按键调整走动速度,C语言的。


题目链接:http://zhidao.baidu.com/question/1754521247451476108.html



2014-07-08 23:22 做而论道回答如下:


//-------------------------------------------

#include <reg52.h>

#include <intrins.h>


sbit  k_add = P3^1;

sbit  k_sub = P3^4;

//-------------------------------------------

unsigned char code SEG7[] = {

    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};

unsigned char DISP_BUFF[] = {

    10, 10, 10, 10, 10, 10, 10, 10, 

    1, 3, 9, 2, 5, 8, 0, 7, 4, 6, 3, 2,

    10, 10, 10, 10, 10, 10, 10, 10};


unsigned char  j = 0, k = 1;

//-------------------------------------------

void DelayMS(unsigned int x)

{

    unsigned char  i;

    while(x--)  for(i = 200; i > 0; i--);

}

//-------------------------------------------

void  display(unsigned char x)

{

    unsigned char i, w = 128;


    for(i = 0; i < 8; i++)  {  //显示八位数码

      P0 = SEG7[DISP_BUFF[i + k]];

      P2 = w;  DelayMS(1);   P2 = 0;

      w = _cror_(w, 1);

    }


    j++;

    if (j > x) {       //显示遍数达到了预置数

      j = 0;

      k++;             //那么从下一位开始显示

      if (k == 20) k = 0;

    }

}

//-------------------------------------------

void main()

{

    unsigned char d = 30;//显示30遍,移动一位

    while(1)  {

      if  (!k_add) {

        display(d);      //延时

        if  (!k_add) {   //消抖

          d += 2;  if (d > 50)  d = 50;//遍数增加,移位就变慢

          while (!k_add)  display(d);

      } }

      if  (!k_sub) {

        display(d);

        if  (!k_sub) {

          d -= 2;  if (d < 10)  d = 10;

          while (!k_sub)  display(d);

      } }

      display(d);

P1 = d;                  //显示当前遍数

    }

}

//-------------------------------------------


程序仿真运行时的截图:

51单片机--8 位数码管动态显示 12 位数字 - 非著名博主 - 电子信息角落


http://xiangce.baidu.com/picture/detail/9f5a51be23f1f1641233c74aa74185593a227585


说明:


程序中的显示部分,也是轮流显示八位数,也是属于常见的动态显示。


但是,稍有不同的是:做而论道给它增加了一个参数 k。


k = 0 时,就和一般的显示程序相同,显示 DISP_BUFF[] 的第 0~7 个元素。


调用显示程序 x 遍后(x 预设值为 30),再令 k 加一。


k = 1 时,就要显示 DISP_BUFF[] 的第 1~8 个元素。


这样就可以在数码管上看到数据移动了一位。


以此类推,k 不断的加一,就会使得 DISP_BUFF[] 中各个元素,依照先后顺序,每次都取出 8 个元素,显示在数码管上。


当 k + 8 为 DISP_BUFF[] 中最末尾的元素时,再令 k = 0,这时就又会从头开始移位显示。


利用按键,对变量 x (在主函数中的变量是 d)的大小进行修改,即可控制数码滚动显示的速度。


d 的范围设定为 10~50,数值越大则滚动越慢。


d 的当前值,可以在 P1 口看到。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值