英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 5281|回复: 4
打印 上一主题 下一主题

多个74HC595级联+并联驱动电路方案 zhuan

[复制链接]
跳转到指定楼层
1#
发表于 2012-8-21 18:52:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
资料下载:多个74HC595级联+并联驱动电路方案
在做一个项目应用时,使用的I/O较多,应用到了74595来做扩展,但是若要挂接多片74595,势必也要多用到I/O口,为了解决这个问题,我将每2片74595做级联,然后再将级联之后的所有时钟线与数据再并联在一起(即所有的74595共用时钟与数据线,故只占用2个I/O口线),最后对每一组的锁存控制线做单独控制(在这里也相当于片选了),这样一来硬件电路得到了很大程度的简化,同时在程序上也可以共用一个74595的驱动子程序,控制不同的锁存控制线,串行数据也就送到了不同74595级联模组端口。故此对硬件与软件都有很大程度的优化。
//************文件说明************//
//项目名称:74HC595级联驱动.
//版本: v1.0
//硬件:MCUIC16F877A, OSC:4M
////内容描述:演示74HC595多个级联且并联驱动.
//修订记录:
//********************************//
#include<pic.h>
__CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡.
#define clock1 RD0 //74HC595驱动引脚.时钟.
#define data1  RD1 //数据.
#define st1  RD2 //模组1锁存控制.
#define st2  RD3 //模组2锁存控制.
#define st3  RD4 //模组3锁存控制.
//LED显示笔段字型码,放置在CODE ROM中.
const unsigned char led_code[]={
                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0xff   //关闭显示.
        };    //共阳不带小数点.
void port_init(void);     //端口初始化子程序.
void send_data(unsigned char channel,unsigned char first,unsigned char second); //串行数据发送子程序.
void display(unsigned char disp_data); //显示子程序.
void main(void)
{
port_init();  //端口初始化.

while(1)
{
  display(0x02);  //调用显示子程序,在第2模组显示"02".
  send_data(0x01,led_code[0],led_code[1]); //直接发送数据在第1模组显示"01".
  send_data(0x03,led_code[0],led_code[3]); //直接发送数据在第3模组显示"03".
}
}
void port_init(void) //端口初始化子函数.
{
PORTA=0xff;
PORTB=0xff;
PORTC=0xff;
PORTD=0xff;
    PORTE=0x07;
TRISA=0xff;
TRISB=0xff;
    TRISC=0x00;
    TRISD=0x00;
    TRISE=0x07;

   //ADCON1=0x8E;         //转换结果左对齐,RA0做模拟输入口,其它做普通I/O.
   //ADCON0=0x41;         //系统时钟Fosc/8,选择RA0通道,允许ADC工作.
}
//channel:通道选择(0x01:模组1,0x02:模组2,0x03:模组3),first:第一个数据,second:第二个数据.
void send_data(unsigned char channel,unsigned char first,unsigned char second) //串行数据发送子程序.
{
static volatile unsigned int tmp_data;
unsigned char i;
tmp_data=(((unsigned int)first)<<8)+second; //将两个8位数据合成一个16位数据.
//传送串行数据前,先将74595输出状态锁定.(74595的12脚)
switch(channel)
{
  case 0x01: st1=0; //各类控制模组74HC595准备锁存数据.
     break;
  case 0x02: st2=0; //显示模组74HC595准备锁存数据.
     break;
  case 0x03: st3=0; //SCP,OVP模组74HC595准备锁存数据.     
     break;
}

//传送16位数据.
for(i=16;i>0;--i)
{
  clock1=0;
  if((tmp_data&0x8000)==0x8000) //PICC中对(bit)与标准C编译器在位类型强制转换时有差异.
   data1=1;
  else
   data1=0;
  clock1=1;
  tmp_data<<=1;
}

//传送结束后,产生一个"↑",将串行数据输出.
switch(channel)
{
  case 0x01: st1=1; //各类控制模组74HC595锁存数据.
     break;
  case 0x02: st2=1; //显示模组74HC595锁存数据.
     break;
  case 0x03: st3=1; //SCP,OVP模组74HC595锁存数据.     
     break;
}
}
void display(unsigned char disp_data) //显示子程序.
{
//发送显示数据LED笔段码,十位在前,个位在后.
send_data(0x02,led_code[disp_data/10],led_code[disp_data%10]);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-4-26 08:57 , Processed in 0.051988 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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