//該程序用于開關量的輸入,并顯示在與D口相連的LED上,S1~S8分別控制Q1~Q8
//開關量采用SPI方式通過74HC165輸入,在調試程序時必須把8位的
//拔碼開關拔向相應的位置,即把8個LED接到PORTD口上
#include "p18f458.h"
volatile unsigned char data;
/*系統初始化子程序*/
void initial()
{
PIR1=0; /*清除SSPIF標志*/
SSPCON1=0x30; /* SSPEN=1;CKP=0,FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x10; /*SDI引腳為輸入,SCK引腳為輸出*/
TRISA=0x00; /*A口為輸出方式,用RA4作控制信號*/
TRISD=0x00; /*D口為輸出方式*/
INTCON=0x00; /*關閉所有中斷*/
}
/*SPI接收子程序*/
char SPIIN()
{
PORTAbits.RA4=0; /*74HC165并行置數使能,將8位開關量置入器件*/
/*(LOAD為低電平時8位并行數據置入74HC165)*/
PORTAbits.RA4=1; /*74HC165移位置數使能(LOAD為高電平時芯*/
/*片才能串行工作)*/
SSPBUF=0; /*啟動SPI,此操作只用于清除SSPSTAT的*/
/*BF位,因此W中的實際數據無關緊要*/
do{
;
}while(PIR1bits.SSPIF==0); /*查詢數據接收完畢否?*/
PIR1bits.SSPIF=0; /*清除SSPIF標志*/
data=SSPBUF;
return(data); /*返回接收到的數據*/
}
/*把SPI接收的數據通過D口顯示在8個發光二極管上的子程序*/
void SPIOUT(char data)
{
PORTD=~data; /*因為LED與D口連接方式的要求,需把D口的*/
/*輸入量取反后才送出*/
}
/*pic單片機主程序*/
main( )
{
initial(); /*系統初始化*/
while(1)
{
SPIIN(); /*SPI接收外部數據*/
SPIOUT(data); /*送出數據顯示*/
}
}
------------------匯編語言版本的SPI總線單片機開關量的輸入程序設計------------------
;該程序用于開關量的輸入,并顯示在與D口相連的LED上,S1~S8分別控制Q1~Q8
;該代碼由http://www.zg4o1577.cn 單片機網調試并運行成功
;開關量采用SPI方式通過74HC165輸入,在調試程序時必須把8位的
;拔碼開關拔向相應的位置,即把8個LED接到PORTD口上
LIST P=18F458
INCLUDE "P18F458.INC"
ORG 0X00
GOTO MAIN
ORG 0X30
;*****************單片機初始化子程序*****************
INITIAL
BCF TRISA,4 ;置RA4為輸出方式,以輸出開關量輸入的鎖存信號
BSF TRISC,4 ;設置SDI引腳為輸入
BCF TRISC,3 ;設置SCK引腳為輸出
CLRF TRISD ;設置D口為輸出方式
BCF INTCON,GIE ;關閉所有中斷
MOVLW 0XC0
MOVWF SSPSTAT ;設置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;設置SPI的控制方式,允許SSP方式,
RETURN ;返回
;*********該子程序將通過SPI方式接收外部的一組串行信號********
SPIIN
BCF PORTA,4 ;74HC165并行置數使能,將8位開關量置入器件
;(LOAD為低電平時8位并行數據置入74HC165)
NOP
NOP
BSF PORTA,4 ;74HC165移位使能(LOAD為高時芯片才能串行工作)
NOP
NOP
MOVWF SSPBUF ;啟動SPI,此操作只用于清除SSPSTAT的BF位,因
;此W中的實際數據無關緊要
LOOP15 BTFSS SSPSTAT,BF ;查詢數據接收完畢否?
GOTO LOOP15
BCF PIR1,SSPIF ;清SPI中斷標志
MOVF SSPBUF,0 ;SSPBUF中內容送W單元
RETURN ;子程序返回
;****************************************
MAIN NOP
CALL INITIAL ;初始化
LOOP CALL SPIIN ;通過SPI方式把開關量存入W寄存器
XORLW 0XFF ;因為LED與D口連接方式的要求,需把D口的
;輸入量取反后才送出
MOVWF PORTD ;送D口顯示在LED上
NOP
GOTO LOOP ;反復輸入開關量
END