| 
 
| 本帖最后由 虹涛犹珷 于 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。
 附件资料:
 
 
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |