我也在用AD7745,寄存器可写可读,包括0x07.程序如下,请参考:
;
;
LIST P=16F1823
INCLUDE "P16F1823.INC"
XORX EQU 74H ;异或校验码
;-----------------------------------主程序
ORG 0X00 ;
NOP ;
GOTO MAIN
;--------------------------------------
READ6
CALL JCKX ;检测空闲
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,SEN ;启动信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;启动信号结束
;FSQJ ;发送器件+写
MOVLW 90H ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送器件+写,结束
;FSDZ ;发送地址
MOVLW 07H ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送地址结束
CALL DELAY ;延时
;RESTART
CALL JCKX ;
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,RSEN ;重启动信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;重启动信号结束
;READ1
MOVLW 91H ;发送器件+读
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送器件+读,结束
CALL JSXH ;接收数据
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 75H ;接收寄存器1
CALL FSYD ;发送应答
CALL JSXH ;
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 76H ;接收寄存器2
CALL FSYD ;
CALL JSXH ;
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 77H ;接收寄存器3
CALL FSYD ;
CALL JSXH ;
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 78H ;接收寄存器4
CALL FSYD ;
CALL JSXH ;
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 79H ;接收寄存器5
CALL FSYD ;
CALL JSXH ;
BANKSEL SSP1BUF ;
MOVF SSP1BUF,W ;
MOVWF 7AH ;接收寄存器6
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,PEN ;停止信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;停止信号完成
BCF PIR1,SSP1IF ;
RETURN
;---------------------------------------
CHSHH ;初始化
BANKSEL ANSELA ;
CLRF ANSELA ;
CLRF ANSELC ;
BANKSEL TRISC ;
BSF TRISC,0 ;SLC
BSF TRISC,1 ;SDA
BSF TRISC,5 ;RX
BCF TRISC,4 ;TX
BANKSEL APFCON ;
BCF APFCON,7 ;RC5=RX
BCF APFCON,2 ;RC4=TX
BANKSEL TRISA ;
BCF TRISA,5 ;485发送
BCF TRISA,0 ;-识别器件工作
BCF TRISA,2 ;
BANKSEL PORTA ;
BSF PORTA,0 ;
BSF PORTA,2 ;-识别器件工作
BANKSEL SSP1ADD ;
MOVLW D'9' ;
MOVWF SSP1ADD ;100K波特率
BANKSEL SSP1STAT ;
BSF SSP1STAT,7 ;100KHZ
BCF SSP1STAT,6 ;IIC
BANKSEL SSP1CON1 ;
MOVLW B'00101000' ;使能IIC通讯主模式
MOVWF SSP1CON1 ;
BANKSEL OSCCON ;
MOVLW B'1101010' ;
MOVWF OSCCON ;内部晶振4MHZ
;T3
MOVLW 03H ;BANK3
MOVWF BSR ;
MOVLW D'12' ;19.2K(4M)
MOVWF SPBRGL ;低字节
MOVLW B'10010000' ;使能串口
MOVWF RCSTA ;使能接收,
MOVLW B'00100110' ;异步,高波特率
MOVWF TXSTA ;使能发送,
RETURN
;---------------------------------
JCYD ;检测应答
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;
RETURN
;----------------------------------
JCKX ;检测空闲
BANKSEL SSP1STAT ;
BTFSC SSP1STAT,2 ;正在发送?
GOTO $-1 ;
BANKSEL SSP1CON2 ;
MOVF SSP1CON2,W ;
ANDLW 1FH ;
BTFSS STATUS,Z ;空闲?
GOTO $-3 ;
RETURN
;----------------------------------------
FSYD
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BCF SSP1CON2,ACKDT ;
BSF SSP1CON2,ACKEN ;发送应答信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;发送应答信号完成
RETURN
;---------------------------------------------
JSXH
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,RCEN ;接收信号
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;接收信号完成
RETURN
;---------------------------------------------
DELAY MOVLW D'4' ;延时3.5MS
MOVWF 70H ;
DELAY2 MOVLW 0FFH ;
MOVWF 71H ;
DELAY1 DECFSZ 71H,F ;
GOTO DELAY1 ;
DECFSZ 70H,F ;
GOTO DELAY2 ;
RETURN
;--------------发送------------------
FSPLC
BANKSEL PORTA ;
BSF PORTA,5 ;置位发送
BANKSEL TXREG ;
MOVLW B'11111100' ;起始字符
MOVWF TXREG ;发送起始字符
CLRF XORX ;异或校验码清零
CALL DELAY ;为通信延时
MOVF 75H,W ;高字节1
XORWF XORX,1 ;异或
MOVWF TXREG ;发送高字节
MOVF 76H,W ;低字节1
XORWF XORX,1 ;异或
MOVWF TXREG ;发送低字节
CALL DELAY ;为通信延时
MOVF 77H,W ;高字节2
XORWF XORX,1 ;异或
MOVWF TXREG ;发送高字节
MOVF 78H,W ;低字节2
XORWF XORX,1 ;异或
MOVWF TXREG ;发送低字节
CALL DELAY ;为通信延时
MOVF 79H,W ;高字节3
XORWF XORX,1 ;异或
MOVWF TXREG ;发送高字节
MOVF 7AH,W ;低字节3
XORWF XORX,1 ;异或
MOVWF TXREG ;发送低字节
CALL DELAY ;为通信延时
MOVLW B'1111' ;高字节4
XORWF XORX,1 ;异或
MOVWF TXREG ;发送高字节
MOVLW B'1101' ;低字节4
XORWF XORX,1 ;异或
MOVWF TXREG ;发送低字节
CALL DELAY ;延时,为发送留出时间
MOVLW B'1110' ;高字节5
XORWF XORX,1 ;异或
MOVWF TXREG ;发送高字节
MOVLW B'1111' ;低字节5
XORWF XORX,1 ;异或
MOVWF TXREG ;发送低字节
CALL DELAY ;延时,为发送留出时间
MOVF XORX,W ;异或校验码
MOVWF TXREG ;
CALL DELAY ;
MOVLW B'11111011' ;终止字符
MOVWF TXREG ;发送终止字符
CALL DELAY ;为通信延时
RETURN
;-------------------------------------
WRITE6
CALL JCKX ;检测空闲
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,SEN ;启动信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;启动信号结束
;FSQJ ;发送器件+写
MOVLW 90H ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送器件+写,结束
BANKSEL SSP1STAT ;
BTFSC SSP1STAT,BF ;寄存器满?
GOTO $-1 ;
;FSDZ ;发送地址
MOVLW 07H ;应为7
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送地址结束
;FSSJ ;发送数据1
MOVLW B'10000000' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据1结束
MOVLW B'0' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据2结束
MOVLW B'1011' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据3结束
MOVLW B'100001' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据4结束
MOVLW B'11111111' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据5结束
MOVLW B'0' ;
BANKSEL SSP1BUF ;
MOVWF SSP1BUF ;
CALL JCYD ;发送数据6结束
BANKSEL PIR1 ;
BCF PIR1,SSP1IF ;
BANKSEL SSP1CON2 ;
BSF SSP1CON2,PEN ;停止信号
BANKSEL PIR1 ;
BTFSS PIR1,SSP1IF ;
GOTO $-1 ;停止信号完成
BCF PIR1,SSP1IF ;
RETURN
MAIN
CALL CHSHH
LOOP
CALL WRITE6 ;写
CALL READ6 ;读
CALL FSPLC ;
GOTO LOOP
END |