📄 rwe2.asm
字号:
LIST p=16F877A
#include "P16F877A.INC"
RXDATA EQU 24H ;定义接收数据单元
TXDATA EQU 25H ;定义发送数据单元
temp_1 EQU 26H
temp_2 EQU 27H
HIBYTE EQU 29H ;命令高字节暂存单元
LOBYTE EQU 2AH ;命令低字节暂存单元
DATBYT EQU 2BH ;数据暂存单元
STATUR EQU 40H ;
DATAVAL EQU 33H ;定义数据常数值
CS EQU 0 ;片选引脚信号
SDI EQU 4 ;发送引脚信号
ORG 0H
nop
goto START
nop
nop
ORG 0004H
START
bcf STATUS,RP0
bsf STATUS,RP0
movlw 10H ;设置C口
movwf TRISC
movlw 00H
movwf FSR
xxx
bcf STATUS,RP0
movlw B'00100001' ;发送使能位
movwf SSPCON
call EWEN
movlw B'00000010' ;命令位“010”写命令
movwf HIBYTE
movlw DATAVAL ;数据
movwf DATBYT
call WRITE
; goto $
call delay_20ms
WRNEXT
bcf STATUS,RP0
call EWEN
movlw B'00000010'
movwf HIBYTE
movlw 20h
movwf FSR
movlw 99h
movwf DATBYT
call WRITE
; call delay_20ms
; call WRITE
; call delay_20ms
; call WRITE
nop
nop
GOTO $
btfsc FSR,4
goto WRNEXT
;读回数据
movlw 30H
movwf FSR
movlw 10H
movwf LOBYTE
movlw B'00000011' ;命令位“011”读命令
movwf HIBYTE
RDNEXT
bcf STATUS,RP0
movlw B'00100001'
movwf SSPCON
call EWEN
nop
nop
nop
nop
; call delay_20ms
call READ
nop
btfsc FSR,4
goto RDNEXT
LIMBO
nop
goto LIMBO
;/*********************
;写使能
;/**********************
EWEN
bcf STATUS,RP0
bcf PORTC,CS
movlw B'00000110'
call OUTPUT
nop
; call delay_20ms
bsf PORTC,CS
return
;/**********************
;读状态寄存器
;入口:无
;出口:读出的状态在STATUR中
;/**********************
RDSR
bcf STATUS,RP0
bcf PORTC,CS
movlw B'00000101'
call OUTPUT
bsf PORTC,CS
movf RXDATA,0
movwf STATUR
return
;/***********************
;写一字节
;入口:"写命令码"在HIBYTE中,EEPROM地址指针在FSR中
;待写数据字节在DATBYT中
;出口:FSR指向下一地址
;/***********************
WRITE
bcf STATUS,RP0
bcf PORTC,CS ;片选
movf HIBYTE,0 ;写命令
call OUTPUT
movf FSR,0 ;送地址
call OUTPUT
movf DATBYT,0 ;送数据
call OUTPUT
; call delay_20ms
bsf PORTC,CS
incf FSR
return
;******************************************
;读一字节
;入口:读命令在HIBYTE,EEPROM地址在LOBYTE,
;单片机RAM地址在FSR
;出口:RAM单元放入一数据,LOBYTE加1,FSR加1
;******************************************
READ
bcf STATUS,RP0
bcf PORTC,CS
; bsf SSPCON,CKP
movf HIBYTE,0
call OUTPUT
movf LOBYTE,0
call OUTPUT
bcf SSPCON,CKP
movlw 0
call OUTPUT
bsf PORTC,CS
movf RXDATA,0
movwf INDF
incf FSR
incf LOBYTE
return
;/**********************
;同时发送和接收一字节
;入口:待发送数据在W中
;出口:收到数据在RXDATA
;/***********************
OUTPUT
movwf SSPBUF
LOOP1
bcf STATUS,RP1
bsf STATUS,RP0
btfss SSPSTAT,BF
goto LOOP1
bcf STATUS,RP0
movf SSPBUF,0
movwf RXDATA
return
delay_20ms
banksel temp_1
movlw 0xff
movwf temp_1
movlw 0x7
movwf temp_2
decfsz temp_1,f
goto $-1
decfsz temp_2,f
goto $-3
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -