打印
[STC单片机]

求助SN74HC595级联应用,急急急

[复制链接]
1892|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两个SN74HC595级联控制数码管的程序
SRCLK和Rclk上升沿需要延时吗?
/*******74HC595发送数据******/
void Send_595(uchar dat)        //发送一个字节
{               
        uchar        i,j;
        uchar   m;
       
        P_HC595_SRCLK = 0;       
        m = dat;
        for(i=0; i<8; i++)
        {
                P_HC595_SRCLK = 0;                                        //上升沿移位
                if(m&0x80==0x80) P_HC595_SER = 1;        //最高位D7开始直至最低位D0
                else  P_HC595_SER = 0;                                                               
                P_HC595_SRCLK = 1;
                m<<=1;                                               
        }       
       
}
void send_595out()                 //595数据并出
{
       
        P_HC595_RCLK = 0;       
        P_HC595_RCLK = 1;       
}
主程序while(1)里面嵌入
{
Send_595(0x0f);
delay_ms(1);       
Send_595(0xf0);
send_595out();
}
实际595发出的是0x01,程序哪里不对呢?

相关帖子

沙发
JY-DX-JY| | 2015-6-4 19:27 | 只看该作者
应该需要延时。你晶振多少兆?看看数据手册。

使用特权

评论回复
板凳
罄竹难书| | 2015-6-4 19:29 | 只看该作者
void    Send_595(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
            if(dat & 0x80)SER_595A = 1;
            else SER_595A = 0;
            
            dat <<= 1;
            SCLK_595 = 1;
            SCLK_595 = 0;
        }
}

void    DisplayScan(void)
{
        switch(display_index)
        {
            case 0:
                Send_595(~4);
                Send_595(display_code[sec%10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
            case 1:
                Send_595(~2);
                Send_595(display_code[sec/10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
            case 2:
                Send_595(~8);
                Send_595(display_code[min%10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
            case 3:
                Send_595(~16);
                Send_595(display_code[min/10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
            case 4:
                Send_595(~64);
                Send_595(display_code[hour%10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
            case 5:
                Send_595(~32);
                Send_595(display_code[hour/10]);
                RCLK_595 = 0;
                RCLK_595 = 1;
                break;
        }
        display_index++;
        if(display_index >= 6) display_index = 0;
}

使用特权

评论回复
地板
miaomiaozhuzhu|  楼主 | 2015-6-5 09:32 | 只看该作者
JY-DX-JY 发表于 2015-6-4 19:27
应该需要延时。你晶振多少兆?看看数据手册。

           晶振11.0592M

使用特权

评论回复
5
miaomiaozhuzhu|  楼主 | 2015-6-5 09:37 | 只看该作者
罄竹难书 发表于 2015-6-4 19:29
void    Send_595(unsigned char dat)
{
        unsigned char i;


数据手册写的是上升沿呢?麻烦大侠帮忙看看数据手册,是哪个地方延时不对吗?现在不管595输入什么,输出都是0。。。请教高手回答吗,万分感谢!!!

使用特权

评论回复
6
NE5532| | 2015-6-5 11:09 | 只看该作者
单步调试,万用表测数据口和CLK是否按你的设计在走。

使用特权

评论回复
7
罄竹难书| | 2015-6-6 22:01 | 只看该作者
74HC595速度很快,不需要延时.

使用特权

评论回复
8
罄竹难书| | 2015-6-6 22:07 | 只看该作者
应该是电路问题吧.

使用特权

评论回复
9
miaomiaozhuzhu|  楼主 | 2015-6-18 14:20 | 只看该作者
找到答案了,是必须连续发16位,而且是低位先发,最后一起并出就对了,试验验证了,看数据手册没有看出来是低位先发

使用特权

评论回复
10
ningling_21| | 2015-6-18 14:45 | 只看该作者
数据手册必须认真看反复看

使用特权

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

本版积分规则

5

主题

18

帖子

0

粉丝