📄 iicmrr.asm
字号:
;********************IICMRR********************
;本程序实现IIC主控方式从EEPROM的指定地址读取N个字节。
;入口参数:从机地址在SADR中,数据字地址在SADRH中,读取数据字节数在CNT中,
; 接收数据存放的首地址在DADR中。
;出口参数:接收到的数据在指定RAM中。
;占用资源:W,STATUS,FSR,020H~023H,028H,029H,07FH,07EH,17FH,SSP模块,1重堆栈。
;说明: 1.使用该程序需在中断入口程序中填入如下两条指令
; BTFSC PIR1,SSPIF
; GOTO MRRINT
; 2.同步时钟频率为100KHZ
IFNDEF IICMRR1
#DEFINE IICMRR1
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
INCLUDE "INITIICM.ASM"
IICMRR MOVF DADR,W
MOVWF FSR
GOTO INITIICM ;初始化配置
RETURN
;*****************中断服务程序***************
MRRINT MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
BCF PIR1,SSPIF
BSF STATUS,C
RLF TEMP1,F
BTFSS TEMP1,1
GOTO PROG01 ;第一次进入中断
BTFSS TEMP1,2
GOTO PROG02 ;第二次进入中断
BTFSS TEMP1,3
GOTO PROG03 ;第三次进入中断
BTFSS TEMP1,4
GOTO PROG04 ;第四次进入中断
BTFSS TEMP1,5
GOTO PROG05 ;第五次进入中断
GOTO PROG06
PROG01 MOVF SADR,W
ANDLW 0FEH ;R/W=0,发送模式
MOVWF SSPBUF ;发送地址(控制字)
GOTO DONE18
PROG02 MOVF SADRH,W ;第二次中断
MOVWF SSPBUF
GOTO DONE18
PROG03 BSF STATUS,RP0
BSF SSPCON2,RSEN
BCF STATUS,RP0
GOTO DONE18
PROG04 MOVF SADR,W
IORLW 01H ;读控制字,R/W=1
MOVWF SSPBUF
GOTO DONE18
PROG05 MOVLW 0FH
MOVWF TEMP2 ;TEMP2用来区分接收完毕和应答结束中断
BSF STATUS,RP0
BSF TRISC,4
BSF SSPCON2,RCEN ;使能接受
BCF STATUS,RP0
GOTO DONE18
PROG06 SWAPF TEMP2,F
BTFSC TEMP2,0
GOTO ACKDONE1
MOVF SSPBUF,W
MOVWF INDF ;接收数据
INCF FSR,F
DECFSZ CNT,F
GOTO SENDACK1
BSF STATUS,RP0
BSF SSPCON2,ACKDT ;不应答
BSF SSPCON2,ACKEN ;应答位使能
BTFSC SSPCON2,ACKEN ;应答完成?
GOTO $-1
BSF SSPCON2,PEN ;停止位
BCF PIE1,SSPIE ;SSP中断禁止
BCF STATUS,RP0
BCF SSPCON,SSPEN ;释放总线
CLRF TEMP1
GOTO DONE18
SENDACK1 BSF STATUS,RP0
BCF SSPCON2,ACKDT ;应答
BSF SSPCON2,ACKEN ;应答位使能
BCF STATUS,RP0
GOTO DONE18
ACKDONE1 BSF STATUS,RP0
BSF SSPCON2,RCEN ;使能接受
BCF STATUS,RP0
DONE18 SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -