最近在做2片74hc595的级联 动态显示5位数码管电路图如下:
其中主要的数据传输函数是这样的:
/****************发送位码和段码给HC595******************* /
void HC595_In(uint8_t data)
{
uint8_t i;
for(i = 0; i < 8; i++) // 循环8次,刚好移完8位
{
LPC_GPIO1->FIOCLR = HC595_SCLK; // 先将移位寄存器时钟控制引脚置0
if(((data << i) & 0x80))
LPC_GPIO1->FIOSET = HC595_SI; // 最高位与data左移的最高位进行逻辑运算,为1则发送1,否则发送0
else
LPC_GPIO1->FIOCLR = HC595_SI;
LPC_GPIO1->FIOSET = HC595_SCLK; // 再将时钟置为1,产生移位时钟上升沿,使移位寄存器的数据移位(左移)
NOP();
}
}
/****************HC595的并行输出***************/
void HC595_Out(void)
{
LPC_GPIO1->FIOCLR = HC595_PD;
LPC_GPIO1->FIOCLR = HC595_CS;
NOP();
LPC_GPIO1->FIOSET = HC595_PD;
LPC_GPIO1->FIOSET = HC595_CS;
NOP();
}
/****************数据显示*******************************************/
void HC595_Display(uint8_t num) //只显示两位
{
uint8_t shi,ge;
shi = num /10;
ge = num % 10;
HC595_In(wei[0]); //对应的位选码
HC595_In(duan[shi]); //对应的段选码
HC595_Out();
Delay_ms(5);
HC595_In(wei[1]);
HC595_In(duan[ge]);
HC595_Out();
Delay_ms(5);
}
问题是:数字显示没问题,也就是段选都是对的。然而,位选是明显的错误。显示的位置根本不对应啊。
第一次发帖求助,希望大家多多帮忙。
|