📄 rw_2401.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 + -