[其它应用] 0~99以一秒递进的动态扫描

[复制链接]
780|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才是锁存器。
xia00 发表于 2016-10-8 20:35 | 显示全部楼层
显示与0~99递进无关;0~99只有2位,不需用动态扫描显示;
hfdy01 发表于 2016-10-8 20:46 | 显示全部楼层
若I/O端口没有他用,P0、P2口可直接控制2位显示。
evan_20 发表于 2016-10-14 21:50 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

1597

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部