s20120907 发表于 2015-9-3 08:54:57

AVR单片机HC595芯片驱动数码管显示出错

程序中一部分用了一片ARRATMEL48和一片HC595驱动数码管,下面是显示的程序。
问题是:不管输入数据是多少,位选通后数码管全亮,不受控制,各位坛友帮分析分析。
//存储器锁存
#define SET_HC595_latch(PORTD |= (1 << PD1))
#define CLR_HC595_latch(PORTD &= ~(1 << PD1))
//寄存器移位
#define SET_HC595_sclk   (PORTD |= (1 << PD2))
#define CLR_HC595_sclk   (PORTD &= ~(1 << PD2))
//串行数据
#define SET_HC595_data   (PORTD |= (1 << PD3))
#define CLR_HC595_oe     (PORTD&= ~(1 << PD3))

void HC595_Send_Data(unsigned char byte)
{   
   unsigned char i;   
   CLR_HC595_latch;//锁存低电平
   CLR_HC595_sclk;   //移位低电平
   for(i = 0;i < 8;i++)
    {   
      if(byte & 0x80)   
      {   
          SET_HC595_data;    //数据位输出1
         }   
   else   
      {   
          CLR_HC595_data;   //数据位输出0
      }    byte <<=1;      
      SET_HC595_sclk;   //移位高电平   
       //上升沿数据移位   
       CLR_HC595_sclk;   //移位低电平
    }      
    SET_HC595_latch;   //锁存高电平
    CLR_HC595_latch;    //锁存低电平
}

AHTY 发表于 2015-9-3 09:18:13

sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;
/*******************************************************************************
函数功能:向一片595发送数据输入
参数:数据的地址输出参数:无
*******************************************************************************/
void Send595(UCHAR * pdat)
{           
    unsigned char i,j;           
    j=0x80;           
    for (i=0;i<8;i++)           
    {              
      if((*pdat)&j) _DATA = 1;                    
      else          _DATA = 0;              
      _SCLK = 0;              
       _SCLK = 1;              
      j>>=1;   
    }
}

/*******************************************************************************
函数功能:串行静态显示函数输入
参数:显存的地址输出参数:无
*******************************************************************************/
code UCHAR DisplayHex[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,                        
                                       0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,                        };
void DisplayBy595(UCHAR * pdat)
{           
    UCHAR i;           
    for(i=0;i<4;i++)          
    {              
      Send595(&DisplayHex[*(pdat+i)]);   
    }      
    _LCLK=0;      
    _LCLK=1;
}

你的时序怎么和我的不一样,试试我的。

s20120907 发表于 2015-9-3 09:31:56

AHTY 发表于 2015-9-3 09:18
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;


移位寄存器输出先低后高,存储器锁存也是

gaolf_2012 发表于 2015-9-3 10:45:00

时序没问题,可能是主频太快了,降低下速度试试

s20120907 发表于 2015-9-3 12:21:52

gaolf_2012 发表于 2015-9-3 10:45
时序没问题,可能是主频太快了,降低下速度试试

系统时钟1MHz

gaolf_2012 发表于 2015-9-3 14:30:02

void delayus(unsigned int n)
{
        unsigned int wI,wJ;

        for(wI=0;wI<n;wI++)
        {
                for(wJ=0;wJ<4;wJ++);
        }
}

void InitSpi(void)
{
        SPI_CS = 1;
        SPI_CLK = 0;
        SPI_MOSI = 0;
       
        SPI_MOSI_TRIS = 0;
        SPI_CLK_TRIS = 0;
        SPI_CS_TRIS = 0;
}

void writeSpi( unsigned char bData)
{
        unsigned char bI, bTemp;

        bTemp = 0x80;
        for(bI=0; bI<8; bI++)
        {
                SPI_CLK = 0;
                delayus(1);
                if(bData & bTemp)
                        SPI_MOSI = 1;
                else
                        SPI_MOSI = 0;
                delayus(1);
                bTemp >>= 1;
                SPI_CLK = 1;
                delayus(1);
        }
        SPI_CLK = 0;
}


void WritePort(void)
{
        InitSpi();
        SPI_CS = 0;
        delayus(5);
        writeSpi(gbCtrl);
        writeSpi(gbRelay);
        delayus(5);
        SPI_CS = 1;
        OUT_ENABLE = 0;

}
给你8M,pic16的

xingjianpeng 发表于 2015-9-3 14:55:18

检查一下硬件。另外,上升沿不该是0->1么?   SET_HC595_latch;   //锁存高电平   CLR_HC595_latch;    //锁存低电平,这不是下降沿么?

chengyang79 发表于 2015-9-3 14:59:15

出错现象是什么?也有可能是受到干扰啊。

AHTY 发表于 2015-9-3 15:59:26

s20120907 发表于 2015-9-3 09:31
移位寄存器输出先低后高,存储器锁存也是

可是我见你是先高后低。

s20120907 发表于 2015-9-4 11:07:06

chengyang79 发表于 2015-9-3 14:59
出错现象是什么?也有可能是受到干扰啊。

输出全是高电平或者全是低电平

Ideal-007 发表于 2015-9-4 11:12:56

你查查你位选的和动态显示的频率

s20120907 发表于 2015-9-4 11:17:38

Ideal-007 发表于 2015-9-4 11:12
你查查你位选的和动态显示的频率

暂时只选通一个数码管,测试HC595
页: [1]
查看完整版本: AVR单片机HC595芯片驱动数码管显示出错