标题: 单片机想实现两位数码管00-FF,两个数字好像不能同时显示似的,请大神帮忙看看程序 [打印本页]

作者: zhujiangzhang    时间: 2020-9-21 08:13
标题: 单片机想实现两位数码管00-FF,两个数字好像不能同时显示似的,请大神帮忙看看程序
本人初学51单片机(用的慧静电子HL-1 89C52开发板),只会数码管0-9显示,两位,三位显示不会玩,自己写数码管00-FF程序如下,D0-D7对应单片机P0^0-P0^7,这个程序功能是可以实现,但是数码管变成先显示10位,消失,再显示个位,两个数字好像不能同时显示似的,希望高人指点,帮忙看看程序那里不对,谢谢!

1.png (84.52 KB, 下载次数: 85)

1.png

B.png (13.26 KB, 下载次数: 77)

B.png

作者: wulin    时间: 2020-9-21 08:13
楼主这样写个位只能显示10毫秒,十位显示约1秒,视觉只能看的十位,个位微亮或看不到。改一下:
  1. #include<reg52.h>

  2. #define uint  unsigned int
  3. #define uchar unsigned char

  4. sbit dula=P2^6;
  5. sbit wela=P2^7;

  6. unsigned char code table[]={//共阴数码管段码"0~f-."
  7.                 0x3f,0x06,0x5b,0x4f,
  8.                 0x66,0x6d,0x7d,0x07,
  9.                 0x7f,0x6f,0x77,0x7c,
  10.                 0x39,0x5e,0x79,0x71,0x40,0x80};

  11. void delayms(uint xms)
  12. {
  13.         uint i,j;
  14.         for(i=xms;i>0;i--)
  15.                 for(j=110;j>0;j--);
  16. }

  17. void main()
  18. {
  19.         unsigned char i,j,k[2];
  20.         dula=0;
  21.         wela=0;
  22.         while(1)
  23.         {
  24.                 k[0]=table[j/16];
  25.                 k[1]=table[j%16];
  26.                 P0=0x00;dula=1;dula=0;//消隐
  27.                 if(i%2==0)// i=偶数显示十位
  28.                 {
  29.                         P0=0xef;wela=1;wela=0;
  30.                         P0=k[0];dula=1;dula=0;               
  31.                 }
  32.                 else                // i=奇数数显示个位
  33.                 {
  34.                         P0=0xdf;wela=1;wela=0;
  35.                         P0=k[1];dula=1;dula=0;               
  36.                 }
  37.                 i++;
  38.                 if(i>=200)//约1s
  39.                 {
  40.                         i=0;                       
  41.                         if(++j>=255)
  42.                                 j=0;
  43.                 }
  44.                 delayms(5);
  45.         }
  46. }

复制代码

作者: zhujiangzhang    时间: 2020-9-21 21:36
本帖最后由 zhujiangzhang 于 2020-9-21 21:45 编辑
wulin 发表于 2020-9-21 14:51
楼主这样写个位只能显示10毫秒,十位显示约1秒,视觉只能看的十位,个位微亮或看不到。改一下:

太棒了,真可以实现了,大概思路是什么?
              
作者: wulin    时间: 2020-9-22 05:58
zhujiangzhang 发表于 2020-9-21 21:36
太棒了,真可以实现了,大概思路是什么?

所谓动态显示就是逐位分时显示。受delayms(5)限制,主循环周期被约束在约5ms,也就是前5ms显示十位,后5ms显示个位,如此反复。由于速度很块,人眼视觉残留效应感觉是同时显示。如果显示的位数多,每位显示的时间要缩短,只要掌握 位数*每位显示的时间<20ms,就不会感到闪烁。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1