打印
[国产单片机]

74HC595驱动8位数码管有闪烁感该怎么办

[复制链接]
5584|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rong1990528|  楼主 | 2013-6-12 18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dtmcp| | 2013-6-13 10:32 | 只看该作者
延长数据保存时间,减慢数据刷新时间

使用特权

评论回复
板凳
airwill| | 2013-6-13 11:53 | 只看该作者
ST_CP(12脚)要在完成数据传输后再给脉冲, 就不会闪烁了

使用特权

评论回复
地板
rong1990528|  楼主 | 2013-6-14 15:58 | 只看该作者
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
unsigned char code taba[]={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0x41,0x07,0x8d,0x43,0x0d,0x1d,0x85,0x13,0x23};
unsigned char code tabb[]={0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01};
#define uchar unsigned char
#define uint unsigned int
//uchar num,num1
sbit SHCP=P1^6;         //移位时钟
sbit STCP=P1^5;         //并行输出时钟
sbit DS=P1^4;           //串行数据输入
void delay1ms()
{
           unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
void delaynms(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
           delay1ms();
}


//====控制595数据并行输出=============
void outchar()
{
        STCP=0;     //拉低锁存器控制时钟脉冲
        STCP=1;     //上升沿将数据送到输出锁存器
}
//====向595中写入一个字节的数据======
void putchar(uchar dat)
{
        uchar m;
        for(m=0;m<8;m++)
        {
                SHCP=0;           //拉低移位时钟脉冲       
                DS=dat&0x80;      //将数据送到串行数据输入端上
                SHCP=1;           //上升沿发生移位(移入一个数据)
                dat=dat<<1;          //数据移位      
        }

}
//=============主程序================
void main()
{
        uchar i,j;

while(1){
for(i=0;i<8;i++)
putchar(tabb[i]);

putchar(taba[i]);

outchar();
delaynms(100);
}
}



怎么修改呢、我是新手请大神们帮帮忙

使用特权

评论回复
5
rong1990528|  楼主 | 2013-6-14 16:07 | 只看该作者
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
unsigned char code taba[]={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0x41,0x07,0x8d,0x43,0x0d,0x1d,0x85,0x13,0x23};
unsigned char code tabb[]={0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01};
#define uchar unsigned char
#define uint unsigned int
//uchar num,num1
sbit SHCP=P1^6;         //移位时钟
sbit STCP=P1^5;         //并行输出时钟
sbit DS=P1^4;           //串行数据输入
void delay1ms()
{
           unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
void delaynms(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
           delay1ms();
}


//====控制595数据并行输出=============
void outchar()
{
        STCP=0;     //拉低锁存器控制时钟脉冲
        STCP=1;     //上升沿将数据送到输出锁存器
}
//====向595中写入一个字节的数据======
void putchar(uchar dat)
{
        uchar m;
        for(m=0;m<8;m++)
        {
                SHCP=0;           //拉低移位时钟脉冲       
                DS=dat&0x80;      //将数据送到串行数据输入端上
                SHCP=1;           //上升沿发生移位(移入一个数据)
                dat=dat<<1;          //数据移位      
        }

}
//=============主程序================
void main()
{
unsigned char i,j;
while(1){
for(i=0;i<8;i++)
{
putchar(tabb[i]);

putchar(taba[i]);

outchar();
delaynms(100);
}
   }  }
修改了刚才的程序,不知道这程序怎么修改?

使用特权

评论回复
6
rong1990528|  楼主 | 2013-6-14 16:15 | 只看该作者
dtmcp 发表于 2013-6-13 10:32
延长数据保存时间,减慢数据刷新时间

您的意思死所在完成数据传输后延时,在让它输出?

使用特权

评论回复
7
rong1990528|  楼主 | 2013-6-14 16:17 | 只看该作者
airwill 发表于 2013-6-13 11:53
ST_CP(12脚)要在完成数据传输后再给脉冲, 就不会闪烁了

您的意思是说在完成数据传输后延时,再让它输出?

使用特权

评论回复
8
rong1990528|  楼主 | 2013-6-14 17:18 | 只看该作者
//====向595中写入一个字节的数据======
void putchar(uchar dat)
{
        uchar m;
        for(m=0;m<8;m++)
        {
                SHCP=0;           //拉低移位时钟脉冲
                 delaynms(1000);
                DS=dat&0x80;      //将数据送到串行数据输入端上
                 
                SHCP=1;           //上升沿发生移位(移入一个数据)
                       
                dat=dat<<1;          //数据移位   
                  
        }

}

我把延时加入数据输入时,发现数码管在数据移位是也会输出显示乱码,但是不会8位数码管都会闪烁了,这是为什么呢?数据移位时怎么会输出呢?

使用特权

评论回复
9
谈的元| | 2013-6-14 23:25 | 只看该作者
595的使用是:准备好数据,送脉冲,循环,然后输出使能

使用特权

评论回复
10
谈的元| | 2013-6-14 23:28 | 只看该作者
看3楼回复,输出使能你需要控制

使用特权

评论回复
11
rong1990528|  楼主 | 2013-6-14 23:48 | 只看该作者
谈的元 发表于 2013-6-14 23:28
看3楼回复,输出使能你需要控制

能说的详细点嘛?

使用特权

评论回复
12
rong1990528|  楼主 | 2013-6-15 00:01 | 只看该作者
谈的元 发表于 2013-6-14 23:28
看3楼回复,输出使能你需要控制

最新实验我把输出模块删除既然它还是能显示不知道怎么回事,请高手指点!!!!

这样都能显示我真服了

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
unsigned char code taba[]={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0x41,0x07,0x8d,0x43,0x0d,0x1d,0x85,0x13,0x23};
unsigned char code tabb[]={0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01};
#define uchar unsigned char
#define uint unsigned int
//uchar num,num1
sbit SHCP=P1^6;         //移位时钟
sbit STCP=P1^5;         //并行输出时钟
sbit DS=P1^4;           //串行数据输入
void delay1ms()
{
           unsigned char i,j;        
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
void delaynms(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
           delay1ms();
}


//====控制595数据并行输出=============
/*void outchar()
{
        STCP=0;     //拉低锁存器控制时钟脉冲
        STCP=1;     //上升沿将数据送到输出锁存器
}*/
//====向595中写入一个字节的数据======
void putchar(uchar dat)
{
        uchar m;
        for(m=0;m<8;m++)
        {
                SHCP=0;           //拉低移位时钟脉冲        
                DS=dat&0x80;      //将数据送到串行数据输入端上
                SHCP=1;           //上升沿发生移位(移入一个数据)
                dat=dat<<1;          //数据移位      
        }

}
//=============主程序================
void main()
{
unsigned char i,j;
while(1){
for(i=0;i<8;i++)
{
putchar(tabb);

putchar(taba);

//outchar();
delaynms(100);
}
   }  }

使用特权

评论回复
13
rong1990528|  楼主 | 2013-6-15 11:34 | 只看该作者
自己顶下。。。

使用特权

评论回复
14
study1234| | 2013-6-15 12:56 | 只看该作者
DS=dat&0x80;      //将数据送到串行数据输入端上

这句咋解?
写法不正规啊,或许结果不可测

使用特权

评论回复
15
rong1990528|  楼主 | 2013-6-15 17:45 | 只看该作者
study1234 发表于 2013-6-15 12:56
DS=dat&0x80;      //将数据送到串行数据输入端上

这句咋解?

取最高位送入595啊!!!   正规的该怎么写呢?

使用特权

评论回复
16
rong1990528|  楼主 | 2013-6-15 18:07 | 只看该作者
问题已经解决!!!
void outchar()
{
        STCP=0;     //拉低锁存器控制时钟脉冲
        STCP=1;     //上升沿将数据送到输出锁存器
}

把它拉低,拉高之后,还有在拉低。
void outchar()
{
        STCP=0;     //拉低锁存器控制时钟脉冲
        STCP=1;     //上升沿将数据送到输出锁存器
STCP=0;            //拉低锁存器控制时钟脉冲
}
再次拉低之后问题解决。不过还是谢谢!!!

使用特权

评论回复
17
FOSVOSSH| | 2013-6-15 22:31 | 只看该作者
减慢数据刷新时间

使用特权

评论回复
18
wanghx70| | 2014-3-25 14:01 | 只看该作者
一定要先送段数据,然后开位选,延时后关位选,再修改端数据给下一个数码管
掌握好延时很重要,多试试就出来了

使用特权

评论回复
19
导航发烧| | 2014-4-4 16:46 | 只看该作者
学习了

使用特权

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

本版积分规则

6

主题

26

帖子

0

粉丝