本帖最后由 虹涛犹珷 于 2023-2-13 12:04 编辑
#申请原创#
最近想做个4位数码管显示的DIY制作,主控单片机IO太少,无法直接驱动,想用74HC595扩展IO,手头上又没有现成的芯片,单片机到时一大把,闲着没事就想用单片机模拟一个74HC595,还要实现主机的程序无需更改。(就是程序不改,把单片机换成74HC595芯片,一样能工作) 为了减少出错次数,首先仿真一下。
第一步撸个主机驱动595的驱动程序先:
/***********************************************************
函数结果:74HC595驱动
备 注:
***********************************************************/
void HC595_Master_COM1_WR_NByte(uint8_t Len, uint8_t *GPIOValue)
{
uint8_t i=0,Byte=0;
HC595_Master_COM1_STCP_RESET();
while(Len--)
{
Byte=*GPIOValue;
for(i=0;i<8;i++)
{
HC595_Master_COM1_SHCP_RESET();
if(Byte & 0x80)
{
HC595_Master_COM1_DS_SET();
}
else
{
HC595_Master_COM1_DS_RESET();
}
HC595_Master_COM1_SHCP_SET();
Byte <<= 1;
}
GPIOValue++;
}
HC595_Master_COM1_STCP_SET();
}
主函数里面每隔100ms就发9个数据:
//**************************主函数**********************//
void main(void)
{
uint8_t Buf[9];
System_Init();
while (1)
{
__delay_ms(100);
Buf[3]=0x0F;
Buf[4]=0xF0;
Buf[8]++;
HC595_Master_COM1_WR_NByte(9,(uint8_t *)&Buf[0]);
}
}
仿真通过,数据都能正常显示,偷下懒,只画了6个74HC595级联
接下来撸个丛机的程序:
采用的中断方法,利用上升沿中断。
/***********************************************************
函数结果:HC595_Slave_COM1_ISR
备 注:
***********************************************************/
void HC595_Slave_COM1_ISR(void)
{
if((!HC595_Slave_COM1_STCP)&&(MyHC595.Cnt < MyHC595.SlaveRx_INTCnt))
{
if(MyHC595.Cnt >= MyHC595.SlaveTx_Q7SCnt)
{
if(MyHC595.BitBuf[MyHC595.i] & 0x01)
{
HC595_Slave_COM1_Q7S=1;
}
else
{
HC595_Slave_COM1_Q7S=0;
}
MyHC595.i++;
}
MyHC595.Buf[MyHC595.Len] <<= 1;
MyHC595.Buf[MyHC595.Len] |= (uint8_t) HC595_Slave_COM1_DS; //数据通过按位“或“运算存入
MyHC595.BitBuf[MyHC595.Cnt] = (uint8_t) HC595_Slave_COM1_DS;
MyHC595.Cnt++;
MyHC595.Len = (uint8_t) (MyHC595.Cnt / 8UL);
}
}
接收完解析数据:
/***********************************************************
函数结果:HC595_Slave_COM1_AnalysisData
备 注:
***********************************************************/
void HC595_Slave_COM1_AnalysisData(void)
{
if((HC595_Slave_COM1_STCP)&&(MyHC595.Cnt >= MyHC595.SlaveRx_INTCnt))//接收完成
{
HC595_Slave_COM1_WR_NByte();
MyHC595.Cnt = 0;
MyHC595.Len = 0;
MyHC595.i=0;
}
}
丛机的主函数啥都不干,就一直等待解析:
//**************************主函数**********************//
void main(void)
{
System_Init();
while (1)
{
HC595_Slave_COM1_AnalysisData();
}
}
这样就OK了,可以看出主机程序一样,丛机和74HC595的显示一样。每个丛机显示了3路数据,3个丛机刚好9路数据。
仿真结束,是时候实际操作一下了,画个PCB验证下。如果大家感兴趣,我可以分享下这个PCB源文件,大家可以换成自己熟悉的单片机(带上升沿中断即可)仿真我用的时候PIC的单片机,PCB验证用的是辉芒微的单片机:
可以成功驱动,主机的程序完全兼容74HC595。
附件资料:
PIC_HC595.zip
(18.44 KB)
Program_Master.X.zip
(98.53 KB)
Program_Slave.X.zip
(118.61 KB)
|