打印
[其它应用]

0~99以一秒递进的动态扫描

[复制链接]
599|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
androidbus|  楼主 | 2016-10-8 20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
书本上的0~99显示程序都是用74LS593锁存器控制显示电路。我们的单片机可以直接驱动数码管,可以不用锁存器。
我想只用89C52单片机与四位共阳数码管写一个以一秒为递进的0~99数字显示程序。P0口控制数码管的位选,P2口控制数码管的段选。
以下是我的程序思路,运行起来一直动态显示01两个数字。我不知道问题出在哪里,恳求各位坛友给个修改思路,不胜感激!!!


# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char

uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,     //四位共阳数码管0~9显示代码
                       0x92, 0x82, 0xF8, 0x80, 0x90 };
uchar wei[2] = { 0xef, 0xdf };  //个位与十位选通代码
     
uchar duan[2];     //用于存储个位与十位值的数组

void delay(uchar m)
{
    uchar i, j;
    for (i=0; i<m; ++i)
    for (j=110; j>0; --j);
}

void display(uchar n, uchar k) //数码管显示函数
{
     P0 = 0xff;    //个位显示
     P2 = wei[n];
     P0 = duan[n];
     delay(5);
     P2 = 0xff;

     P0 = 0xff;     //十位显示
     P2 = wei[k];
     P0 = duan[k];
     delay(5);
     P2 = 0xff;
}

void main(void)
{
     uchar i=0, n=0, k=1, d=0;
     while (1)
   {
      ++d;
      if (d==100)
          d = 0;

      duan[0] = a[d%10];  //个位显示的值
      duan[1] = a[d/10];  //十位显示的值

      display(n, k);

      TMOD = 0X01;
      TH0 = (65536-50000)/256;
      TL0 = (65536-50000)%256;
      EA = 1;
      ET0 = 1;
      TR0 = 1;
      while(1);
     }
}

void T0_time() interrupt 1
{
     uchar num=0, n=0, k=1;

     TH0 = (65536-50000)/256;
     TL0 = (65536-50000)%256;
     num++;

     display(n, k);    //定时过程中数码管显示
   
     if (num==20)
         num = 0;   
}
沙发
litengg| | 2016-10-8 20:22 | 只看该作者
中断进入了变量num都清零了,怎么可能加到20啊。

使用特权

评论回复
板凳
qiangweii| | 2016-10-8 20:26 | 只看该作者
是啊,中断进入了变量num都清零了,怎么可能加到20啊。
把相关变量定义在函数外试试。

使用特权

评论回复
地板
shashaa| | 2016-10-8 20:31 | 只看该作者
楼主,593是计数器,595才是锁存器。

使用特权

评论回复
5
xia00| | 2016-10-8 20:35 | 只看该作者
显示与0~99递进无关;0~99只有2位,不需用动态扫描显示;

使用特权

评论回复
6
hfdy01| | 2016-10-8 20:46 | 只看该作者
若I/O端口没有他用,P0、P2口可直接控制2位显示。

使用特权

评论回复
7
evan_20| | 2016-10-14 21:50 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

1597

帖子

3

粉丝