找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3506|回复: 5
收起左侧

8个数码管同时以间隔500ms显示0~F

[复制链接]
ID:233997 发表于 2017-11-5 22:11 | 显示全部楼层 |阅读模式
求助大神
我可以在单个数码管上实现,或多个数码管间隔显示。但多次验证无法实现8个数码管“同时”以间隔500ms显示0~F。我理解的不够透彻,请大神费心帮帮忙做个示例出来
非常感谢。
附件原理图,再次感谢~~~

HC6800-ES V2.0 新版.pdf

759.71 KB, 下载次数: 14

回复

使用道具 举报

ID:213173 发表于 2017-11-6 08:35 | 显示全部楼层
你能控制多个数码管间隔轮流显示,应该已明白38译码器工作原理,当你把轮流显示的速度提高到2ms显示1位时就看到你想得到的视觉效果。
回复

使用道具 举报

ID:155507 发表于 2017-11-6 21:47 | 显示全部楼层
本帖最后由 angmall 于 2017-11-6 21:57 编辑
  1. // 实现8个数码管“同时”以间隔500ms显示0~F。
  2. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;

  8. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  10. u8 d=0;
  11. /*******************************************************************************
  12. * 函 数 名         : delay
  13. * 函数功能                   : 延时函数,i=1时,大约延时10us
  14. *******************************************************************************/
  15. void delay(u16 i)
  16. {
  17.         while(i--);        
  18. }

  19. void delayms(void)   //延时 ms
  20. {      
  21.         unsigned char a,b,c;     
  22.         for(c=1;c>0;c--)         
  23.         for(b=142;b>0;b--)            
  24.         for(a=2;a>0;a--);
  25. }

  26. /*******************************************************************************
  27. * 函 数 名       : DigDisplay
  28. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  29. *******************************************************************************/
  30. void DigDisplay()
  31. {
  32.         u8 i;
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 switch(i)         //位选,选择点亮的数码管,
  36.                 {
  37.                         case(0):
  38.                         LSA=0;LSB=0;LSC=0; break;//显示第0位
  39.                         case(1):
  40.                         LSA=1;LSB=0;LSC=0; break;//显示第1位
  41.                         case(2):
  42.                         LSA=0;LSB=1;LSC=0; break;//显示第2位
  43.                         case(3):
  44.                         LSA=1;LSB=1;LSC=0; break;//显示第3位
  45.                         case(4):
  46.                         LSA=0;LSB=0;LSC=1; break;//显示第4位
  47.                         case(5):
  48.                         LSA=1;LSB=0;LSC=1; break;//显示第5位
  49.                         case(6):
  50.                         LSA=0;LSB=1;LSC=1; break;//显示第6位
  51.                         case(7):
  52.                         LSA=1;LSB=1;LSC=1; break;//显示第7位        
  53.                 }
  54.                 P0=smgduan[d];//发送段码
  55.                 delay(100); //间隔一段时间扫描        
  56.                 P0=0x00;//消隐
  57.         }
  58. }

  59. /*******************************************************************************
  60. * 函 数 名       : main
  61. * 函数功能                    : 主函数
  62. * 输    入       : 无
  63. * 输    出            : 无
  64. *******************************************************************************/
  65. void main()
  66. {        
  67.         u16 y=0;
  68.         while(1)
  69.         {        
  70.                 DigDisplay();  //数码管显示函数        
  71.                 delayms();
  72.                 y++;
  73.                 if (y>=125)
  74.                 {
  75.                         d++; //段码显示函数
  76.                         y=0;
  77.                         if(d >15) //显示0~F。
  78.                           d=0;
  79.                 }
  80.         }               
  81. }
复制代码
回复

使用道具 举报

ID:246767 发表于 2017-11-6 23:13 | 显示全部楼层
一秒其他的正常显示,需要闪动的那一位关闭即可。至于怎么关闭,要看你的数码管的类型。就是全灭。
回复

使用道具 举报

ID:233997 发表于 2017-11-8 19:26 | 显示全部楼层
谢谢,各位大神!
以下是我试着写的,实现了想要的功能。不足请指点
#include<reg52.h>

#define uchar unsigned char //无符号字符型 8位 0~255.所占空间小
#define uint unsigned int //无符号整星 16位 0~65535

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar num,num1;



uchar code smgdisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delayms(uint z);
void display(uchar num);

void main()
{
        TMOD=0x10;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        TR1=1;
        ET1=1;
        while(1)
   {
        display(num);
   }

        }
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;   //重装初值
TL1=(65536-50000)%256;
num1++;
if(num1==20)           //如果到了20次,说明1秒刷新时间到
{
    num1=0;            //然后把num2清0重新再计4次
    num++;
    if(num==16)       //这个数用来送数码管显示,到60后归0
    {
        num=0;
        }

}
}


void display(num)  //显示子函数
{

        LSA=0;
        LSB=0;
        LSC=0;
        P0=smgdisplay[num];
       delayms(5);    //延时

        LSA=1;
        LSB=0;
        LSC=0;
        P0=smgdisplay[num];
        delayms(5);    //延时
}

void delayms(uint z)
{
        uint i,j;
        for(i=z;i>0;i--)     //i=xms即延时约xms毫秒
    for(j=110;j>0;j--);
}                                                                               
回复

使用道具 举报

ID:233997 发表于 2017-11-8 19:28 | 显示全部楼层

谢谢,非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表