基于SPI總線單片機(jī)開關(guān)量的輸入程序設(shè)計(jì)
//該程序用于開關(guān)量的輸入,并顯示在與D口相連的LED上,S1~S8分別控制Q1~Q8
//開關(guān)量采用SPI方式通過74HC165輸入,在調(diào)試程序時(shí)必須把8位的
//拔碼開關(guān)拔向相應(yīng)的位置,即把8個(gè)LED接到PORTD口上
#include"p18f458.h"
volatile unsigned char data;
/*系統(tǒng)初始化子程序*/
voidinitial()
{
PIR1=0;/*清除SSPIF標(biāo)志*/
SSPCON1=0x30;/* SSPEN=1;CKP=0,F(xiàn)OSC/4 */
SSPSTAT=0xC0;
TRISC=0x10;/*SDI引腳為輸入,SCK引腳為輸出*/
TRISA=0x00;/*A口為輸出方式,用RA4作控制信號(hào)*/
TRISD=0x00;/*D口為輸出方式*/
INTCON=0x00;/*關(guān)閉所有中斷*/
}
/*SPI接收子程序*/
char SPIIN()
{
PORTAbits.RA4=0;/*74HC165并行置數(shù)使能,將8位開關(guān)量置入器件*/
/*(LOAD為低電平時(shí)8位并行數(shù)據(jù)置入74HC165)*/
PORTAbits.RA4=1;/*74HC165移位置數(shù)使能(LOAD為高電平時(shí)芯*/
/*片才能串行工作)*/
SSPBUF=0;/*啟動(dòng)SPI,此操作只用于清除SSPSTAT的*/
/*BF位,因此W中的實(shí)際數(shù)據(jù)無關(guān)緊要*/
do{
;
}while(PIR1bits.SSPIF==0);/*查詢數(shù)據(jù)接收完畢否?*/
PIR1bits.SSPIF=0;/*清除SSPIF標(biāo)志*/
data=SSPBUF;
return(data);/*返回接收到的數(shù)據(jù)*/
}
/*把SPI接收的數(shù)據(jù)通過D口顯示在8個(gè)發(fā)光二極管上的子程序*/
voidSPIOUT(char data)
{
PORTD=~data;/*因?yàn)長ED與D口連接方式的要求,需把D口的*/
/*輸入量取反后才送出*/
}
/*pic單片機(jī)主程序*/
main( )
{
initial();/*系統(tǒng)初始化*/
while(1)
{
SPIIN();/*SPI接收外部數(shù)據(jù)*/
SPIOUT(data);/*送出數(shù)據(jù)顯示*/
}
}
------------------匯編語言版本的SPI總線單片機(jī)開關(guān)量的輸入程序設(shè)計(jì)------------------
;該程序用于開關(guān)量的輸入,并顯示在與D口相連的LED上,S1~S8分別控制Q1~Q8
;該代碼由http://www.51hei.com 單片機(jī)網(wǎng)調(diào)試并運(yùn)行成功
;開關(guān)量采用SPI方式通過74HC165輸入,在調(diào)試程序時(shí)必須把8位的
;拔碼開關(guān)拔向相應(yīng)的位置,即把8個(gè)LED接到PORTD口上
LISTP=18F458
INCLUDE"P18F458.INC"
ORG0X00
GOTOMAIN
ORG0X30
;*****************單片機(jī)初始化子程序*****************
INITIAL
BCFTRISA,4 ;置RA4為輸出方式,以輸出開關(guān)量輸入的鎖存信號(hào)
BSFTRISC,4;設(shè)置SDI引腳為輸入
BCFTRISC,3;設(shè)置SCK引腳為輸出
CLRF TRISD ;設(shè)置D口為輸出方式
BCFINTCON,GIE;關(guān)閉所有中斷
MOVLW0XC0
MOVWFSSPSTAT;設(shè)置SSPSTAT寄存器
MOVLW0X30
MOVWFSSPCON1;設(shè)置SPI的控制方式,允許SSP方式,
RETURN;返回
;*********該子程序?qū)⑼ㄟ^SPI方式接收外部的一組串行信號(hào)********
SPIIN
BCFPORTA,4 ;74HC165并行置數(shù)使能,將8位開關(guān)量置入器件
;(LOAD為低電平時(shí)8位并行數(shù)據(jù)置入74HC165)
NOP
NOP
BSFPORTA,4;74HC165移位使能(LOAD為高時(shí)芯片才能串行工作)
NOP
NOP
MOVWFSSPBUF;啟動(dòng)SPI,此操作只用于清除SSPSTAT的BF位,因
;此W中的實(shí)際數(shù)據(jù)無關(guān)緊要
LOOP15BTFSSSSPSTAT,BF;查詢數(shù)據(jù)接收完畢否?
GOTOLOOP15
BCFPIR1,SSPIF;清SPI中斷標(biāo)志
MOVF SSPBUF,0;SSPBUF中內(nèi)容送W單元
RETURN;子程序返回
;****************************************
MAINNOP
CALLINITIAL ;初始化
LOOPCALLSPIIN;通過SPI方式把開關(guān)量存入W寄存器
XORLW0XFF;因?yàn)長ED與D口連接方式的要求,需把D口的
;輸入量取反后才送出
MOVWFPORTD;送D口顯示在LED上
NOP
GOTOLOOP;反復(fù)輸入開關(guān)量
END
評(píng)論