标题: 单片机实现74HC595功能,实现扩展IO 附程序 [打印本页]

作者: 涛qq623942603    时间: 2023-2-11 13:39
标题: 单片机实现74HC595功能,实现扩展IO 附程序
       最近做了个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, 下载次数: 14)
丛机的源程序:
Program_Slave.X.zip (118.61 KB, 下载次数: 12)
仿真文件:
PIC_HC595.zip (18.44 KB, 下载次数: 14)

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












作者: hhdsdy    时间: 2023-4-22 08:48
只能算是一个学习单片机的范例,真要是IO口不够又要驱动多位数码管,TM16XX系列就是一个很好的选择,还可以附带键盘输入
作者: jihji    时间: 2023-7-1 09:38
太好了。只能算是一个学习单片机的范例,真要是IO口不够又要驱动多位数码管,TM16XX系列就是一个很好的选择,还可以附带键盘输入




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1