英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
多个74HC595级联+并联驱动电路方案 zhuan
[打印本页]
作者:
star
时间:
2012-8-21 18:52
标题:
多个74HC595级联+并联驱动电路方案 zhuan
资料下载:
多个74HC595级联+并联驱动电路方案
在做一个项目应用时,使用的I/O较多,应用到了74595来做扩展,但是若要挂接多片74595,势必也要多用到I/O口,为了解决这个问题,我将每2片74595做级联,然后再将级联之后的所有时钟线与数据再并联在一起(即所有的74595共用时钟与数据线,故只占用2个I/O口线),最后对每一组的锁存控制线做单独控制(在这里也相当于片选了),这样一来硬件电路得到了很大程度的简化,同时在程序上也可以共用一个74595的驱动子程序,控制不同的锁存控制线,串行数据也就送到了不同74595级联模组端口。故此对硬件与软件都有很大程度的优化。
//************文件说明************//
//项目名称:74HC595级联驱动.
//版本: v1.0
//硬件:MCU
IC16F877A, 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]);
}
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2