📄 iicmrc.asm
字号:
;********************IICMRC********************
;本程序实现IIC主控方式接收N个字节数据。
;入口参数:从机地址在SADR中,接收数据存放的首地址在DADR中,读取数据字节数在CNT中。
;出口参数:接收到的数据在指定RAM中。
;占用资源:W,STATUS,FSR,020H,022H,023H,028H,029H,07FH,07EH,17FH,SSP模块,1重堆栈。
;说明: 1.使用该程序需在中断入口程序中填入如下两条指令
; BTFSC PIR1,SSPIF
; GOTO MRCINT
; 2.本程序可以从EEPROM的当前地址读取N个字节,EEPROM控制字在SADR中。
IFNDEF IICMRC1
#DEFINE IICMRC1
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
INCLUDE "INITIICM.ASM"
IICMRC MOVF DADR,W
MOVWF FSR
GOTO INITIICM ;初始化配置
RETURN
;*****************中断服务程序***************
MRCINT MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
BCF PIR1,SSPIF
BSF STATUS,C
RLF TEMP1,F
BTFSS TEMP1,1
GOTO PROG111 ;第一次进入中断
BTFSS TEMP1,2
GOTO PROG222 ;第二次进入中断
GOTO PROG333 ;第三次以后的中断
PROG111 MOVF SADR,W
IORLW 01H ;R/W=1,接收模式
MOVWF SSPBUF ;发送地址(控制字)
GOTO DONE17
PROG222 MOVLW 0FH
MOVWF TEMP2 ;TEMP2用来区分接收完毕和应答结束中断
BSF STATUS,RP0
BSF TRISC,4
BSF SSPCON2,RCEN ;使能接受
BCF STATUS,RP0
GOTO DONE17 ;第二次中断
PROG333 SWAPF TEMP2,F
BTFSC TEMP2,0
GOTO ACKDONE
MOVF SSPBUF,W
MOVWF INDF ;接收数据
INCF FSR,F
DECFSZ CNT,F
GOTO SENDACK
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 DONE17
SENDACK BSF STATUS,RP0
BCF SSPCON2,ACKDT ;应答
BSF SSPCON2,ACKEN ;应答位使能
BCF STATUS,RP0
GOTO DONE17
ACKDONE BSF STATUS,RP0
BSF SSPCON2,RCEN ;使能接受
BCF STATUS,RP0
DONE17 SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -