找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3652|回复: 7
收起左侧

单片机控制74hc595数码管静态显示会闪?

[复制链接]
ID:164604 发表于 2019-3-18 07:51 | 显示全部楼层 |阅读模式
1.jpg

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,second,min;
sbit lclk=P1^0;
sbit sclk=P1^1;
sbit Data=P1^2;
uchar dis[4];
uchar code displayhex[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delay(uint z)
{
         uint x,y;
         for(x=z;x>0;x--)
            for(y=100;y>0;y--);
}
void send595(uchar *pdat)
{
        uchar i,j;
        j=0x80;
        for(i=0;i<8;i++)
        {
                if((*pdat)&j) Data=1;
    else Data=0;
    sclk=0;
    sclk=1;        
                j>>=1;        
    sclk=0;               
        }
}
void display595( uchar *pdat)
{
        uchar i;
        for(i=0;i<4;i++)
        {
                lclk=0;
          send595(&displayhex[*(pdat+i)]);
                lclk=0;
                lclk=1;
        }
}
void init()
{
        TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void main()
{
        init();
        while(1)
        {
         if(count==20)
         {
                 count=0;
                 second++;
                 if(second==60)
                 {
                         second=0;
                         min++;
                         if(min==24)
                         {
                                 min=0;
                         }
                        
     }
                 
         }
           dis[0]=second%10;
           dis[1]=second/10;
           dis[2]=min%10;
           dis[3]=min/10;
           display595(dis);
           delay(50);
        }
}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
}


回复

使用道具 举报

ID:96682 发表于 2019-3-18 22:12 | 显示全部楼层
楼主是不是发错了?
回复

使用道具 举报

ID:213173 发表于 2019-3-19 09:53 | 显示全部楼层
程序没有大毛病,是语句排序错误导致闪烁和乱码。你对比一下就知道哪里错了。
无标题.jpg


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar count,second,min;
  5. sbit lclk=P1^0;
  6. sbit sclk=P1^1;
  7. sbit Data=P1^2;
  8. uchar dis[4];
  9. uchar code displayhex[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  10.                  0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  11. /*
  12. void delay(uint z)
  13. {
  14.    uint x,y;
  15.    for(x=z;x>0;x--)
  16.       for(y=100;y>0;y--);
  17. }*/
  18. void send595(uchar *pdat)
  19. {
  20.         uchar i,j;
  21.         j=0x80;
  22.         for(i=0;i<8;i++)
  23.         {
  24.                 if((*pdat)&j) Data=1;
  25.                 else Data=0;
  26. //                sclk=0;
  27.                 sclk=1;
  28.                 sclk=0;
  29.                 j>>=1;
  30.         }
  31. }
  32. void display595( uchar *pdat)
  33. {
  34.         uchar i;
  35.         for(i=0;i<4;i++)
  36.         {
  37. //                lclk=0;
  38.                 send595(&displayhex[*(pdat+i)]);
  39.         }
  40.         lclk=0;
  41.         lclk=1;
  42. }
  43. void init()
  44. {
  45.         TMOD=0X01;
  46.         TH0=(65536-50000)/256;
  47.         TL0=(65536-50000)%256;
  48.         EA=1;
  49.         ET0=1;
  50.         TR0=1;
  51. }
  52. void main()
  53. {
  54.         init();
  55.         while(1)
  56.         {
  57.                 if(count==20)
  58.                 {
  59.                         count=0;
  60.                         second++;
  61.                         if(second==60)
  62.                         {
  63.                                 second=0;
  64.                                 min++;
  65.                                 if(min==24)
  66.                                 {
  67.                                         min=0;
  68.                                 }
  69.                         }
  70.                         dis[0]=second%10;
  71.                         dis[1]=second/10;
  72.                         dis[2]=min%10;
  73.                         dis[3]=min/10;
  74. //                        display595(dis);
  75. //                        delay(50);
  76.                 }
  77.                 display595(dis);
  78.         }
  79. }

  80. void timer0() interrupt 1
  81. {
  82.         TH0=(65536-50000)/256;
  83.         TL0=(65536-50000)%256;
  84.         count++;
  85. }
复制代码



回复

使用道具 举报

ID:424598 发表于 2019-3-19 16:12 来自手机 | 显示全部楼层
闪烁的话,调整下延时,我之前有遇到同样的问题
回复

使用道具 举报

ID:485458 发表于 2019-3-19 21:20 | 显示全部楼层
延时调小一点
回复

使用道具 举报

ID:164604 发表于 2019-4-4 20:30 | 显示全部楼层
wulin 发表于 2019-3-19 09:53
程序没有大毛病,是语句排序错误导致闪烁和乱码。你对比一下就知道哪里错了。

谢谢,非常感谢!
回复

使用道具 举报

ID:366559 发表于 2019-4-5 10:36 | 显示全部楼层
有时候proteus因为仿真速度的问题会把实际情况下不会闪烁的动态扫描显示成闪烁的
回复

使用道具 举报

ID:476644 发表于 2019-4-5 14:58 | 显示全部楼层
延时函数可以调到100微秒
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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