找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1793|回复: 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级联
主机驱动595.png

接下来撸个丛机的程序:
采用的中断方法,利用上升沿中断。
/***********************************************************
函数结果: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路数据。
丛机和74HC595显示一致.png

附件是主机的源程序:
Program_Master.X.zip (98.53 KB, 下载次数: 11)

评分

参与人数 1黑币 +70 收起 理由
admin + 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 单片机教程网

快速回复 返回顶部 返回列表