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; //锁存低电平
} 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;
}
你的时序怎么和我的不一样,试试我的。 AHTY 发表于 2015-9-3 09:18
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;
移位寄存器输出先低后高,存储器锁存也是 时序没问题,可能是主频太快了,降低下速度试试 gaolf_2012 发表于 2015-9-3 10:45
时序没问题,可能是主频太快了,降低下速度试试
系统时钟1MHz 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的 检查一下硬件。另外,上升沿不该是0->1么? SET_HC595_latch; //锁存高电平 CLR_HC595_latch; //锁存低电平,这不是下降沿么? 出错现象是什么?也有可能是受到干扰啊。 s20120907 发表于 2015-9-3 09:31
移位寄存器输出先低后高,存储器锁存也是
可是我见你是先高后低。 chengyang79 发表于 2015-9-3 14:59
出错现象是什么?也有可能是受到干扰啊。
输出全是高电平或者全是低电平
你查查你位选的和动态显示的频率 Ideal-007 发表于 2015-9-4 11:12
你查查你位选的和动态显示的频率
暂时只选通一个数码管,测试HC595
页:
[1]