⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.asm

📁 模拟SPI程序(C语言)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		CLR SSCCS
		MOV A,#RST
		LCALL HOSTWR
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_WR_TH:
;-----------------------------------------------
	HOST_WR_TH:
		JB WR_SUCC,HOST_WR_TH01
		RET
	HOST_WR_TH01:
		JB T_NEW_TH,HOST_WR_TH0
		RET
	HOST_WR_TH0:
		CLR WR_BUS_SUCC
		JB SINT,HOST_WR_TH1
		RET
	HOST_WR_TH1:
		CLR SSCCS
		MOV A,#WTH
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_TH10
		SJMP HOST_WR_TH4
	HOST_WR_TH10:
		MOV A,#09H
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_TH11
		SJMP HOST_WR_TH4
	HOST_WR_TH11:
		MOV A,CNTRL_FIELD
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_TH12
		SJMP HOST_WR_TH4
	HOST_WR_TH12:
		MOV DATA_CNT,#04H
		MOV R1,#D_DEV_ADR_LSB
	HOST_WR_TH15:
		MOV A,@R1
		INC R1
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_TH13
		SJMP HOST_WR_TH4
	HOST_WR_TH13:
		DJNZ DATA_CNT,HOST_WR_TH15

		MOV DATA_CNT,#04H
		MOV R1,#S_DEV_ADR_LSB
	HOST_WR_TH03:
		MOV A,@R1
		INC R1
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_TH14
		AJMP HOST_WR_TH4
	HOST_WR_TH14:
		DJNZ DATA_CNT,HOST_WR_TH03

		CLR T_NEW_TH
	HOST_WR_TH4:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_WR_WR46:
;-----------------------------------------------
	HOST_WR_WR46:
		CLR WR_BUS_SUCC
		JB SINT,HOST_WR_WR461
		RET
	HOST_WR_WR461:
		CLR SSCCS
		MOV A,#WR46
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_WR462
		AJMP HOST_WR_WR464
	HOST_WR_WR462:
		MOV A,#01H                      ;LENGTH
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_WR463
		AJMP HOST_WR_WR464
	HOST_WR_WR463:
		MOV A,#0CFH                      ;DLL_ACCESS_CONTROL=11001111
		LCALL HOSTWR
	HOST_WR_WR464:
		SETB SSCCS
		RET
;-----------------------------------------------
;CHECK_LS_EQU:
;-----------------------------------------------
	CHECK_LS_EQU:
		MOV DATA_CNT,#07H
		MOV R1,#MODE_CNTRL
		MOV R0,#R_TH_BUF
	C_LS_EQU0:
		MOV A,@R0
		XRL A,@R1
		INC R0
		JZ C_LS_EQU1
		RET
	C_LS_EQU1:
		INC R1
		DJNZ DATA_CNT,C_LS_EQU0
		RET
;-----------------------------------------------
;HOST_RD_LR:
;-----------------------------------------------
	HOST_RD_LR:
		CLR WR_BUS_SUCC
		JB SINT,HOST_RD_LR1
		RET
	HOST_RD_LR1:
		MOV R1,#R_TH_BUF
		CLR SSCCS
		MOV A,#LR
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_RD_LR2
		AJMP HOST_RD_LR4
	HOST_RD_LR2:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_RD_LR21
		AJMP HOST_RD_LR4
	HOST_RD_LR21:
		MOV RR_DATA_LENGTH,A
		MOV DATA_CNT,#07H
	HOST_RD_LR3:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_RD_LR31
		AJMP HOST_RD_LR4
	HOST_RD_LR31:
		MOV @R1,A
		INC R1
		DJNZ DATA_CNT,HOST_RD_LR3
		AJMP HOST_RD_LR41
	HOST_RD_LR4:
		CLR WR_BUS_SUCC
	HOST_RD_LR41:
		SETB SSCCS
		RET
;-----------------------------------------------
;HOST_READ_IR:
;-----------------------------------------------
	HOST_READ_IR:
		CLR WR_BUS_SUCC
		JB SINT,HOST_RD_IR1
		RET
	HOST_RD_IR1:
		MOV IR_REG,#00H
		CLR SSCCS
		MOV A,#IR
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_RD_IR10
		AJMP HOST_RD_IR13
	HOST_RD_IR10:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_RD_IR11
		AJMP HOST_RD_IR13
	HOST_RD_IR11:
		MOV RR_DATA_LENGTH,SPI_TMP
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_RD_IR12
		AJMP HOST_RD_IR13
	HOST_RD_IR12:
		MOV IR_REG,SPI_TMP
	HOST_RD_IR13:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_RD_IS:
;-----------------------------------------------
	HOST_RD_IS:
		SETB PDLLST
		LCALL HOST_RD_IR1
	;HOST_RD_IS1:
		ACALL RC_IS_TEST
		ACALL TR_IS_TEST

		JB INTER_ER,HOST_RD_IS2
		RET
	HOST_RD_IS2:
		SETB RC_SUCC
		RET

;-----------------------------------------------
;RC_IS_TEST:
;-----------------------------------------------
	RC_IS_TEST:
		JB RC_ATTN,RC_IS_TEST1
		JB RC_EXCEPT,RC_IS_TEST0
		RET
	RC_IS_TEST0:
		SETB RC_ERROR
		RET
	RC_IS_TEST1:
		JB RC_EXCEPT,RC_IS_TEST2
		SETB RC_SUCC
		RET
	RC_IS_TEST2:
		SETB RC_ERROR
		RET

;-----------------------------------------------
;TR_IS_TEST:
;-----------------------------------------------
	TR_IS_TEST:
		JB TR_ATTN,TR_IS_TEST1
		RET
	TR_IS_TEST1:
		JB TR_EXCEPT,TR_IS_TEST2
		SETB WR_SUCC
		MOV RE_TX_CNT,#0FFH
		RET
	TR_IS_TEST2:
		SETB WR_ERROR
		RET

;-----------------------------------------------
;HOST_READ_RR4:
;-----------------------------------------------
	HOST_READ_RR4:
		JB RC_ERROR,HOST_READ_RR40
		RET
	HOST_READ_RR40:
		JB SINT,HOST_READ_RR41
		RET
	HOST_READ_RR41:
		CLR SSCCS
		MOV A,#RR4
		LCALL HOSTWR

		JB WR_BUS_SUCC,HOST_READ_RR42
		SJMP HOST_READ_RR47
	HOST_READ_RR42:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_READ_RR43
		SJMP HOST_READ_RR47
	HOST_READ_RR43:
		MOV RR_DATA_LENGTH,A
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_READ_RR44
		SJMP HOST_READ_RR47
	HOST_READ_RR44:
		MOV RR4_REG,A
		CLR RC_ERROR
		JB RC_ADDR_DIFF,HOST_READ_RR46
		AJMP HOST_READ_RR47
	HOST_READ_RR46:
		SETB RC_SUCC
		SETB RC_H_SUCC
	HOST_READ_RR47:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_GET_DATA:
;-----------------------------------------------
	HOST_GET_DATA:
		JB RE_TR,HOST_GET_EXIT
		JB WR_SUCC,HOST_GET_DATA0
		RET
	HOST_GET_DATA0:
		JB EMP_TR,HOST_GET_DATA1
		RET
	HOST_GET_DATA1:
		JB KEYPRESSED,HOST_GET_DATA3
		RET
	HOST_GET_DATA3:
		CLR KEYPRESSED
		LCALL PREST
		MOV A,OUTTMP
		INC A
		MOV OUTTMP,A
		CLR EMP_TR
	;HOST_GET_DATA2:
		SETB T_NEW_TH
		MOV CNTRL_FIELD,#ADD_ACK_DATA

	HOST_GET_EXIT:
		RET

;-----------------------------------------------
;HOST_SEND_PKT:
;-----------------------------------------------
	HOST_SEND_PKT:
		JB RE_TR,HOST_SEND_PKT0
		JB EMP_TR,HOST_SEND_PKT3
		JB WR_SUCC,HOST_SEND_PKT0
		RET
	HOST_SEND_PKT0:
		JB SINT,HOST_SEND_PKT1
		RET
	HOST_SEND_PKT1:
		CLR SSCCS
		MOV A,#WTI
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_SD_PKT10
		SJMP HOST_SEND_PKT3
	HOST_SD_PKT10:
		MOV A,#10H
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_SD_PKT11
		SJMP HOST_SEND_PKT3
	HOST_SD_PKT11:
		MOV DATA_CNT,#10H
		MOV R1,#TRBUF
	HOST_SEND_PKT2:
		MOV A,@R1
		INC R1
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_SD_PKT21
		SJMP HOST_SEND_PKT3
	HOST_SD_PKT21:
		DJNZ DATA_CNT,HOST_SEND_PKT2

		SETB EMP_TR
		CLR WR_SUCC
		CLR RE_TR
	HOST_SEND_PKT3:
		SETB SSCCS
		RET

;------------------------------------------------------
;       HOSTWR: THE SEND DATA IN "A"              
;------------------------------------------------------
	HOSTWR: SETB WR_BUS_SUCC
		;MOV A,SPI_DATA
		LCALL WT_SPI

		MOV TIMER3,#04H
		CLR T3
	HOSTWRC:JB T3,HOSTWR1
		JB PDLLST,HOSTWRC

		MOV TIMER3,#00H
		SETB PDLLST
		RET
	HOSTWR1:CLR WR_BUS_SUCC         ;SET UNSUCCEESEFUL INDICATOR
		RET

;---------------------------------------------------------
;       HOSTRD: THE RECIEVED DATA IN "SPI_TMP, A "
;---------------------------------------------------------
	HOSTRD: SETB PDLLST
		SETB RD_BUS_SUCC
		;MOV A,#00H
		LCALL RD_SPI

		MOV TIMER3,#02H
		CLR T3
	HOSTRDC:JB T3,HOSTRD1
		JB PDLLST,HOSTRDC

		MOV TIMER3,#00H
		SETB PDLLST
		RET
	HOSTRD1:CLR RD_BUS_SUCC
		RET

;------------------------------------------------------------
;               WRITE TI VIRTUAL SPI PORT
;               IN:THE DATA YOU WANT SEND TO INCLUDED IN "A"
;------------------------------------------------------------
	WT_SPI: ;CLR EA
		CLR TR0
		CLR C
		MOV SPI_CNT,#08H
		MOV SPI_TMP,A
	SPI_CO: MOV A,SPI_TMP
		RLC A
		MOV CO,C
		MOV SPI_TMP,A

		CLR CCLK
		NOP
		NOP
		SETB CCLK

		DJNZ SPI_CNT,SPI_CO
		;SETB EA
		SETB TR0
		CLR CO
		RET
;-------------------------------------------------------
;               READ FORM VIRTUAL SPI PORT
;               OUT:RECIEVED DATA INCLUDED IN "SPI_TMP"
;--------------------------------------------------------
	RD_SPI: ;CLR EA
		CLR TR0
		MOV A,#00H
		MOV SPI_CNT,#08H
	SPI_CI: SETB CI_IND
		CLR CCLK
		NOP
		NOP
		NOP
		NOP
		SETB CCLK
		MOV C,CI
	;SPI_CI1:
		MOV A,SPI_TMP
		RLC A
		MOV SPI_TMP,A
		DJNZ SPI_CNT,SPI_CI
		;SETB EA
		SETB TR0
		RET

;-----------------------------------------------
;PTRSUB:
;-----------------------------------------------
	PTRSUB: MOV @R1,A
		MOV A,@R1
		INC R1
		MOV @R1,A
		RET
		
;----------------------------------------------------------
;EXTERNAL INTERRUPT0 SERVICE PROGRAM
;----------------------------------------------------------
	EXTINT0:PUSH ACC
		CLR PDLLST
		POP ACC
		RETI
;----------------------------------------------------------
;EXTERNAL INTERRUPT1 SERVICE PROGRAM
;----------------------------------------------------------
	EXTINT1:;PUSH ACC
		CLR CI_IND
		;POP ACC
		RETI
;----------------------------------------------------------
;TIMER0/COUNTER0 INTERRUPT
;----------------------------------------------------------
	T0INT:  CLR TR0                 ;TURN OFF T0
		PUSH ACC
		;MOV A,B
		;PUSH ACC
		MOV TH0,#0EFH
		MOV TL0,#069H

		SETB T5MS
		SETB KEYSCAN
		MOV A,T5CNT
		DEC A
		MOV T5CNT,A
		JNZ INTTM1
		SETB T500MS
		MOV T5CNT,#64H

	 INTTM1:MOV A,TIMER1
		JNZ INTTM01
		AJMP INTTM3
	INTTM01:DEC A
		MOV TIMER1,A
		JNZ INTTM3
		SETB T1

	 INTTM3:MOV A,TIMER3
		JNZ INTTM03
		AJMP INTTM4
	INTTM03:DEC A
		MOV TIMER3,A
		JNZ INTTM4
		SETB T3

	 INTTM4:DJNZ T1SCNT,INTTM2
		MOV T1SCNT,#0C8H
		SETB T1S

	 INTTM2:MOV A,TIMER2
		JNZ INTTM02
		SJMP RESTORE
	INTTM02:DEC A
		MOV TIMER2,A
		JNZ RESTORE
		SETB T2

	RESTORE:POP ACC
		;MOV B,A
		;POP ACC
		SETB TR0
		RETI
;-------------------------------------------------
;KEY_SCANING:
;-------------------------------------------------
	KEY_SCANING:
		JB KEYSCAN,KEY_SCAN0    ;KEYSCAN IS SET EVERY 5MS
		RET
	KEY_SCAN0:
		CLR KEYSCAN             ;CLEAR KEYSCAN FLAG
		JB KEY_PRESS,KEY_SCAN2  ;IF NO KEY IS PRESSED
					;OR KEY IS RELEASED

	;KEY_SCAN1:                     ;KEY IS PRESSED
		INC DEBOUNCE_COUNT      ;COUNT INC 1
		AJMP KEY_SCAN_EXIT
	KEY_SCAN2:
		MOV A,DEBOUNCE_COUNT
		JZ KEY_SCAN_EXIT        ;NO ANY KEY EVER PRESSED
		CLR C
		SUBB A,#DEBOUNCE_VALUE
		JNC KEY_SCAN4           ;IF A AVAILABLE KEY PRESSED
		AJMP KEY_SCAN5
	KEY_SCAN4:
		SETB KEYPRESSED         ;SET KEYPRESSED FLAG
	KEY_SCAN5:
		MOV DEBOUNCE_COUNT,#00H
	KEY_SCAN_EXIT:
		RET

;-------------------------------------------------------------
;LEDTSK:
;       LED ON/TOGGLE
;       ENTER:LEDONF INDICATE THE STAE OF LED
;             IF PROGRAM IS IN ACTIVE STATE, TURN THE LED ON
;-------------------------------------------------------------
	LEDTSK: JB T500MS,LEDTS2
		RET
	LEDTS2: CLR T500MS
	;TOGLED:
		JB LEDONF,OFFLED
	;ONLED:
		CLR LEDCS0
		SETB LEDONF
		RET

	OFFLED: SETB LEDCS0
		CLR LEDONF
		RET
;--------------------------------------------------------------------
;LIGHT LCD ON
;       ENTER:LCDBUF CONTAIN THE CONTENTS WANTED SHOW
;             LCDADD CONTAIN THE ADDRESS THERE THE LCDBUF WANTED SHOW
;--------------------------------------------------------------------
	LCDON:  ;CLR LCDCS
		MOV A,LCDBUF
		LCALL WT_SPI
		;SETB LCDCS
		SETB LCDCS
		NOP
		NOP
		CLR LCDCS

		RET
;-----------------------------------------------
;DELAY 30MS
;-----------------------------------------------
	DLY30MS:MOV TIMER1,#06H
		CLR T1
	DLY301: JB T1,DLY302
		AJMP DLY301
	DLY302: RET
;-------------------------------------------------
;DELAY 10MS
;-------------------------------------------------
	DLY10MS:MOV TIMER1,#02H
		CLR T1
	DLY101: JB T1,DLY102
		AJMP DLY101
	DLY102: RET

;------------------------------------------
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -