单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2091|回复:2
打印上一主题下一主题

单片机实现74HC595功能,实现扩展IO 附程序

[复制链接]
跳转到指定楼层
楼主
ID:78835发表于 2023-2-11 13:39|只看该作者|只看大图回帖奖励
     最近做了个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路数据。


附件是主机的源程序:
Program_Master.X.zip(98.53 KB, 下载次数: 11)
丛机的源程序:
Program_Slave.X.zip(118.61 KB, 下载次数: 11)
仿真文件:
PIC_HC595.zip(18.44 KB, 下载次数: 12)

仿真结束,是时候实际操作一下了,如果大家感兴趣,我可以分享下这个PCB源文件,大家可以换成自己熟悉的单片机(带上升沿中断即可):











评分

黑币 +70
收起理由
+ 70
共享资料的黑币奖励!

查看全部评分

沙发
ID:88256发表于 2023-4-22 08:48|只看该作者
只能算是一个学习单片机的范例,真要是IO口不够又要驱动多位数码管,TM16XX系列就是一个很好的选择,还可以附带键盘输入
板凳
ID:1086732发表于 2023-7-1 09:38|只看该作者
太好了。只能算是一个学习单片机的范例,真要是IO口不够又要驱动多位数码管,TM16XX系列就是一个很好的选择,还可以附带键盘输入

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网