由于在使用時,找了很久也沒找到相關的程序,因此把自己后來編寫的程序貼出來,希望能給后來者借鑒參考!;實驗目的:熟悉SPI總線以及9346EEPROM的讀寫
;RBO鍵按下時把DATA和DATA2寫入到EEPROM中以EE—ADDR為地址的單元內(nèi),
;完成后,單個數(shù)碼觀顯示“9”做為完成標志
;RB1鍵按下時,讀取EEPROM中以EE—ADDR為地址的單元,并送數(shù)碼管顯示
;硬件要求:S3、S5、S6撥碼管置ON,S1第7、8位置ON。
LIST P=16F877A, R=DEC
include “P16F877A.inc” ;包含頭文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
#DEFINE CS PORTC,2 ;片選信號
#DEFINE CLK PORTC,3 ;時鐘信號輸入
#DEFINE DI PORTC,5 ;數(shù)據(jù)輸入腳
#DEFINE D0 PORTC,4 ;數(shù)據(jù)輸出腳EE_ADDR EQU 05H ;待寫EEPROM單元地址EE_DATA EQU 56H ;待寫入的數(shù)據(jù)
EE_DATA2 EQU 78HTEMP1 EQU 30H ;讀EEPROM結果存放單元
TEMP2 EQU 31H
DL1 EQU 77H ;延時用
DL2 EQU 78H ;延時用
;******************************************************
ORG 000H ;復位地址
NOP ;放置一條ICD必需的空操作指令
GOTO MAIN
ORG 0008H
TABLE
ADDWF PCL,1 ;PC值加上偏移地址
RETLW 0C0H ;0
RETLW 0F9H ;1的編碼
RETLW 0A4H ;2的編碼
RETLW 0B0H ;3的編碼
RETLW 99H ;4的編碼
RETLW 92H ;5的編碼
RETLW 082H ;6
RETLW 0F8H ;7
RETLW 080H ;8
RETLW 090H ;9
RETLW 88H ;A
RETLW 083H ;b
RETLW 0C6H ;c
RETLW 0A1H ;d
RETLW 086H ;E
RETLW 08EH ;F
RETLW 0FFH
;********************主程序***************************
MAIN
MOVLW 0FFH
MOVWF PORTD
CLRF TEMP1
BANKSEL SSPSTAT
MOVLW b‘10000000’
MOVWF SSPSTAT ;SMP=1,CKE=0
MOVLW B‘11010000’
MOVWF TRISC ;D0輸入,DI輸出,CLK輸出
MOVLW 0FFH
MOVWF TRISB
CLRF TRISD
CLRF TRISA
MOVLW 06H
MOVWF ADCON1
CLRF STATUS
CLRF INTCON ;清除所有中斷使能位
CLRF PIR1 ;清除SSP中斷標志位
BCF CS ;片選禁止
MOVLW B‘00110001’
MOVWF SSPCON ;CKP=1,SSPEN=1,SPI主模式Fosc/16LOOP
CLRF STATUS
BTFSC PORTB,0
GOTO EE_READ
CALL WRITE_EE
MOVLW 90H
MOVWF PORTD
MOVLW 0FEH
MOVWF PORTA
GOTO $
EE_READ
BTFSC PORTB,1
GOTO MAIN
CALL READ_EE
CALL DISPLAY
GOTO $-1
;**********************寫使能*********************************
WRITE_EE
BSF CS ;片選使能
MOVLW B‘00000001’ ;發(fā)送起始位
; MOVLW
CALL SPI_COMM ;發(fā)送
MOVLW B‘00110000’ ;寫使能命令代碼
CALL SPI_COMM ;發(fā)送
BCF CS ;片選禁止
NOP
NOP ;延時一定時間;*********************寫數(shù)據(jù)**********************************
;入口參數(shù):EE_ADDR,EE_DATA,EE_DATA2
;出口參數(shù):無
;*************************************************************
BSF CS ;片選使能
MOVLW B‘00000001’ ;發(fā)送起始位
CALL SPI_COMM ;發(fā)送
MOVLW EE_ADDR ;發(fā)送待寫單元的地址
IORLW B‘01000000’ ;地址加上寫命令代碼
CALL SPI_COMM
MOVLW EE_DATA ;發(fā)送待寫入的數(shù)據(jù)
CALL SPI_COMM
MOVLW EE_DATA2
CALL SPI_COMM ;再次發(fā)送8位數(shù)據(jù),組成16位數(shù)據(jù)
BCF CS ;片選禁止
NOP
NOP
NOP ;延時一定時間
BSF CS ;片選使能
NOP
NOP
BTFSS D0 ;判斷內(nèi)部寫操作是否完成
GOTO $-1 ;正在操作,等待完成
BCF CS ;片選禁止
NOP
NOP ;延時一定時間
RETURN;*********************讀數(shù)據(jù)***********************************
;入口參數(shù):EE_ADDR
;出口參數(shù):TEMP1,TEMP2
;**************************************************************
READ_EE
BSF CS ;片選使能
NOP
NOP ;延時一定時間
MOVLW B‘00000001’ ;發(fā)送起始位
CALL SPI_COMM
MOVLW EE_ADDR ;發(fā)送待讀單元地址
IORLW B‘10000000’ ;地址加上讀命令代碼
CALL SPI_COMM
MOVLW 00H
CALL SPI_COMM ;讀取EEPROM中指定單元高8位數(shù)據(jù)
MOVWF TEMP1 ;保存到結果存放單元
MOVLW 00H
CALL SPI_COMM ;讀取EEPROM中指定單元低8位數(shù)據(jù)
MOVWF TEMP2
NOP
BCF CS ;片選禁止
NOP
NOP
MOVLW 0FH
ANDWF TEMP1,0
MOVWF 61H
SWAPF TEMP1,0
ANDLW 0FH
MOVWF 60H
MOVLW 0FH
ANDWF TEMP2,0
MOVWF 63H
SWAPF TEMP2,0
ANDLW 0FH
MOVWF 62H
RETURN
;*****************發(fā)送命令/數(shù)據(jù)和讀取數(shù)據(jù)子程序*************
SPI_COMM
MOVWF SSPBUF ;SSPBUF中寫入數(shù)據(jù),啟動發(fā)送接收過程
BTFSS PIR1,SSPIF ;判斷是否發(fā)送/接收完成
GOTO $-1 ;等待完成
BCF PIR1,SSPIF ;清除中斷標志位
MOVF SSPBUF,W ;清空SSPBUF,以便下一次通信
RETURN ;子程序返回;**********************延時程序******************************
DELAY10MS
MOVLW 0CH
MOVWF DL1
DELAY2
MOVLW 0FFH
MOVWF DL2
DELAY1
DECFSZ DL2,1
GOTO DELAY1
DECFSZ DL1,1
GOTO DELAY2
RETURN
;**********************顯示程序******************************
;入口參數(shù):60H-63H
;無
;***********************************************************DISPLAY
MOVFW 60H
CALL TABLE
MOVWF PORTD
BCF PORTA,0
CALL DELAY10MS
BSF PORTA,0 MOVFW 61H
CALL TABLE
MOVWF PORTD
BCF PORTA,1
CALL DELAY10MS
BSF PORTA,1 MOVFW 62H
CALL TABLE
MOVWF PORTD
BCF PORTA,2
CALL DELAY10MS
BSF PORTA,2 MOVFW 63H
CALL TABLE
MOVWF PORTD
BCF PORTA,3
CALL DELAY10MS
BSF PORTA,3
RETURN;********************************************
end ;源程序結束
評論
查看更多