求那位大神帮我解答解答74595

2019-07-15 08:36发布

就是一个74595和P0口控制矩阵LED(51单片机)。当575最高位制高时,必须调用两次595函数,才能正常显示矩阵,这么说呢,74595控制矩阵阳极。P0控制阴极。但是写P0=0x00;595函数=0x80;按理第一排LED灯亮。可是都没有亮;但是写成P0=0x00;595函数=0x80;595函数=0x80;对就是595函数调用,两次第一排LED灯才亮,其他的只要最高位不等于1.函数只调用一次就亮。打个比方P0=0x00;595函数=0xEF;按理应该亮1234678排,其实全不亮;P0=0x00;595函数=0xEF;595函数=0xEF;这样就行;还有就是P0=0x00;595函数=0xFF,按理全亮,实际全不亮,写几道都不亮;下面是程序:/**************************************************************************************
*                              8*8LED点阵———点亮一个点实验                                                                                                  *
实现现象:下载程序后点阵左上角第一个点点亮
                       
注意事项:一定要将74HC595模块上的JP595短接片短接,并且将JOE短接片短接到GND端。                                                                                                                                                                  
***************************************************************************************/


#include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>


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


sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
void delay()
{
        u16 i=10000;
        while(i--);
}




/*******************************************************************************
* 函数名         : Hc595SendByte(u8 dat)
* 函数功能                   : 向74HC595发送一个字节的数据
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
        u8 a;
        SRCLK=0;
        RCLK=0;
        for(a=0;a<8;a++)
        {
                SER=dat>>7;
                dat<<=1;


                SRCLK=1;
                _nop_();
                _nop_();
                SRCLK=0;       
        }


        RCLK=1;
        _nop_();
        _nop_();
        RCLK=0;
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{               
        P0=0x00;
        Hc595SendByte(0xEF);
        Hc595SendByte(0xEF);
        while(1);       
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
人中狼
1楼-- · 2019-07-15 19:06
试试把
SER=dat>>7;
                dat<<=1;
改为
if(dat & 0x80) SER = 1;
else SER = 0;
dat<<=1;
灬今何在灬
2楼-- · 2019-07-15 20:54
  RCLK=1;
        _nop_();
        _nop_();
        RCLK=0;
这里错了,上升沿锁存显示,下降沿数据保持。把最上面的  RCLK=0;去掉,改成  RCLK=0;
        _nop_();
        _nop_();
        RCLK=1;时序就对了。
灬今何在灬
3楼-- · 2019-07-16 00:40
 精彩回答 2  元偷偷看……

一周热门 更多>