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

📄 rw_2401.asm

📁 关于PIC16F877A单片机的一些源代码,比较丰富.初学者认真看看应该有收获的.
💻 ASM
字号:
;
;	READ/WRITE DATA FROM/TO 24LC01 
;
	LIST P=16F877, R=DEC
	#INCLUDE P16F877.INC
	CBLOCK 0X20
	ENDC
;
;	DEFINE RAM
;
	CBLOCK
	 ADDR_I2C, DATA_I2C, R0
	ENDC
;
;
	ORG 0
	NOP
	GOTO MAIN
;
;---------------------------------------------------------------;
								;
#INCLUDE <putLINE.INC>						;
								;
								;
;	ASCII table must be 16 characters in one line		;
; !!!	tables must be located at the front end of every page	;
								;
putLINE_TBL:							;
	ADDWF PCL						;
	DT "24LC01 DATA(0~5)"	; (16 chracters in one line)	;
;	DT "   00:00:00     "	; (16 chracters in one line)	;
;								;
;===============================================================;
;---------------------------------------------------------------;
								;
#INCLUDE <LCD.INC>						;
								;
; Defines for I/O ports that provide LCD data & control		;
								;
LCD_DATA	equ	PORTB					;
LCD_CNTL	equ	PORTB					;
								;
RS	equ	5	; RS=PORTB,5				;
E	equ	4						;
								;
;===============================================================;
;
;***************************************************************;
MAIN:								;
								;
	BANKSEL SSPADD						;
	MOVLW 9			; Fosc/(4*(SSPADD+1))		;
	MOVWF SSPADD		; 4MHz/(4*(9+1))=100K		;
	BANKSEL SSPCON						;
	MOVLW B'00101000'	; xx1xxxxx SSPEN		;
				; xxxx1000 I2C master mode	;
				; ck=Fosc/(4*(SSPADD+1))	;
	MOVWF SSPCON		; enable I2C			;
;								;
;***************************************************************;
;
	call	InitLCD
	call	clrLCD
	call	L1homeLCD
;	MOVLW	0
;	CALL putLINE		; put "24LC01 DATA(0~5)" in line 1
;
;	call	L2homeLCD
;	MOVLW 6
;	CALL movcurLCD		; move cursor right 6 positions

	MOVLW	'O'
	CALL	putcLCD
	MOVLW	'L'
	CALL	putcLCD
	MOVLW	'D'
	CALL	putcLCD
	MOVLW	':'
	CALL	putcLCD

;
	CLRF ADDR_I2C		; start to read data in addr:000h
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
	INCF ADDR_I2C
	CALL READ_BYTE
	CALL putDIGIT
;
;
	call	L2homeLCD

	MOVLW	'N'
	CALL	putcLCD
	MOVLW	'E'
	CALL	putcLCD
	MOVLW	'W'
	CALL	putcLCD
	MOVLW	':'
	CALL	putcLCD


	CLRF ADDR_I2C		; start to save data in addr:000h

	MOVLW	8
	MOVWF	R0
	
KEYIN1:
	CALL	KB4X4
	BTFSC	KYBUF,4		; KEY PRESSED?
	GOTO	KEYIN1
	MOVF	KYBUF,W
	CALL	putDIGIT
	MOVF	KYBUF,W
	MOVWF DATA_I2C
	CALL WRITE_BYTE
	INCF ADDR_I2C

KEYIN1A:
	CALL	KB4X4
	BTFSS	KYBUF,4		; KEY RELEASED?
	GOTO	KEYIN1A

	DECFSZ	R0
	GOTO	KEYIN1

	MOVLW	' '
	CALL	putcLCD
	MOVLW	'O'
	CALL	putcLCD
	MOVLW	'K'
	CALL	putcLCD
	MOVLW	'!'
	CALL	putcLCD
	
	GOTO $			; stop here!	
;
;
READ_BYTE:
;
	BANKSEL SSPCON2
	BSF SSPCON2,SEN		; START here !
;
	BANKSEL PIR1
READ_BYTE1:
	BTFSS PIR1,SSPIF	; wait for START finished	
	GOTO READ_BYTE1
;
	MOVLW B'10100000'	; 1010xxx0 = WRITE data into 24lc01
				; xxxx000x = data block 0 (for 24lc08/16/...)
	MOVWF SSPBUF		; output now !
	BCF PIR1,SSPIF
;
READ_BYTE2:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO READ_BYTE2
;
	MOVF ADDR_I2C,W		; write address here !
	MOVWF SSPBUF
	BCF PIR1,SSPIF
;
READ_BYTE3:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO READ_BYTE3
;
	BANKSEL SSPCON2
	BSF SSPCON2,RSEN	; repeated start condition
READ_BYTE4:
	BTFSC SSPCON2,RSEN
	GOTO READ_BYTE4
;
	BSF SSPCON2,ACKDT	; NOT ACK !
	BANKSEL SSPBUF
	MOVLW B'10100001'	; 1010xxx1 = read data from 24lc01
				; xxxx000x = data block 0 (for 24lc08/16/...)
	MOVWF SSPBUF		; output now !
	BCF PIR1,SSPIF
;
READ_BYTE5:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO READ_BYTE5
;
	BANKSEL SSPCON2
	BSF SSPCON2,RCEN	; enable recive
READ_BYTE6:
	BTFSC SSPCON2,RCEN
	GOTO READ_BYTE6
;
	BSF SSPCON2,ACKEN	; enable ACK
READ_BYTE7:
	BTFSC SSPCON2,ACKEN
	GOTO READ_BYTE7
;
	BSF SSPCON2,PEN		; STOP here !
;
	BANKSEL PIR1
	BCF PIR1,SSPIF
READ_BYTE8:
	BTFSS PIR1,SSPIF	; wait for STOP finished	
	GOTO READ_BYTE8
	BCF PIR1,SSPIF
;
	MOVF SSPBUF,W		; store data in w
	RETURN
;
;
WRITE_BYTE:
;
	BANKSEL SSPCON2
	BSF SSPCON2,SEN		; START here !
;
	BANKSEL PIR1
WRITE_BYTE1:
	BTFSS PIR1,SSPIF	; wait for START finished	
	GOTO WRITE_BYTE1
;
	MOVLW B'10100000'	; 1010xxx0 = write data into 24lc01
				; xxxx000x = data block 0 (for 24lc08/16/...)
	MOVWF SSPBUF		; data to be write into 24lc01
	BCF PIR1,SSPIF
;
WRITE_BYTE2:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO WRITE_BYTE2
;
	MOVF ADDR_I2C,W		; write address
	MOVWF SSPBUF
	BCF PIR1,SSPIF
;
WRITE_BYTE3:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO WRITE_BYTE3
;
	MOVF DATA_I2C,W		; write data
	MOVWF SSPBUF
	BCF PIR1,SSPIF
;
WRITE_BYTE4:
	BTFSS PIR1,SSPIF	; wait for data shift out	
	GOTO WRITE_BYTE4
;
	BANKSEL SSPCON2
	BSF SSPCON2,PEN		; STOP here !
;
	BANKSEL PIR1
	BCF PIR1,SSPIF
WRITE_BYTE5:
	BTFSS PIR1,SSPIF	; wait for STOP finished	
	GOTO WRITE_BYTE5
	BCF PIR1,SSPIF
;
	CALL DLY2_5mS		; wait for data writing ( < 5mS )
	CALL DLY2_5mS	
	RETURN
;
;
;
;---------------------------------------------------------------;
;								;
	#INCLUDE <KB4X4.INC>					;
;								;
;;	externally defined pins (in main program)		;
;								;
PORT4X4	EQU PORTD	; 0~3=I/P, 4~7=O/P			;
TRIS4X4	EQU TRISD	; set direction of port			;
;								;
;===============================================================;
;;								;
;;	result is stored in KYBUF (defined in main program)	;		
;;	KYBUF=0x10 if there is no key pressed			;
;;								;
;...............................................................;
	INCLUDE	<DLY2_5mS.INC>
;
;
;
	END
	




⌨️ 快捷键说明

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