PIC MSSP_SPI_74HC595

2019-04-15 13:32发布

我觉得74HC595相当于是一个你看得见的寄存器,数据的输入只能是串行的8位输入,输出可以选择串行输出,也可以选择并行输出。
如果把两个74HC595连在一起,就会有译码器和扫描的结合的作用,夸张一点,如果时间允许,可以3接口扩展为16接口,虽然输入数据不同时,但是可以让输出数据同时。
#include       //调用头文件,可以去PICC18软件下去查找PIC18FXX2.H __CONFIG(1,XT) ;         //晶振为外部4M __CONFIG(2,WDTDIS) ;     //看门狗关闭 __CONFIG(4,LVPDIS) ;     //禁止低电压编程 #define rck RC2 #define sck RC3 #define si RC5
#define uchar unsigned char #define uint unsigned int #define nop NOP()
void delayms(uint x) { uint i,j; for(i=0;i<=110;i++) for(j=0;j<=x;j++); }
char shuma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char led[18]={ 0B10000000, 0B01000000, 0B00100000, 0B00010000, 0B00001000, 0B00000100, 0B00000010, 0B00000001, 0B00000000, 0B00000001, 0B00000010, 0B00000100, 0B00001000, 0B00010000, 0B00100000, 0B01000000, 0B10000000, 0B00000000 };
void write595(uchar dat1,uchar dat2) { rck=0; //rck为并行输出的控制时钟,当有上升沿的时候并行输出移位寄存器中的数 SSPBUF=dat1; //往移位寄存器里存数据 while(SSPIF==0) //往移位寄存器里存数据需要时间 { ;} SSPIF=0; //当移位寄存器里的8位数都存满的时候,会发生中断请求 SSPBUF=dat2; while(SSPIF==0) { ;} SSPIF=0; nop; rck=1; }
void main() { uchar i=0,j=0; ADCON1=0x06; TRISC=0xd3; PIR1=0x00; //PIR1寄存器里有关于SSP1IF的寄存器,即移位寄存器存满的中断标志位软件清零 SSPSTAT=0xc0; SSPCON1=0x20; while(1) { write595(led[j],shuma[i]); //用两个参数是因为我的开发板上把两个74HC595连在了一起,第一个74HC595的SO是第二个的SI,第一个595可以最快输出存入的数,但是第二个595的数据必须是从第一个595中移出来的数 delayms(800); i++; if(i>9) i=0; j++; if(j>17) j=0; } }
PIC <wbr>MSSP_SPI_74HC595