3.(03998)《数控电位器与PIC单片机的接口技术》P
程序清单如下:
. STATUS EQU 03H ;PIC16C72内部特殊
C EQU 0 ;功能寄存器及标志位 PORTC EQU 07H TRISC EQU 87H COMMAND EQU 24H ID EQU 25H ; 0 0 0 0 RB RA 0 P0 ADDR_BYTE EQU 26H; 0 1 0 1 A3 A2 A1 A0 DATA_BYTE EQU 27H ; D7D6 D5 D4 D3 D2 D1 D0 PULSES EQU 28H ; D7 D6D5 D4 D3 D2 D1 D0 CASE EQU 29H COUNT EQU 2BH TEMPP EQU 2CH CLOCK MACRO ;时钟
NOP ;LET SDA SET-UP BSF PORTC,6 ;SCL=1 NOP NOP NOP BCF STATUS,C ;0送C BTFSC PORTC,7 ;SDA=0? BSF STATUS,C ;NO,1送C BCF PORTC,6 ;SCL=0 ENDM
SEND_BIT MACRO BCF PORTC, 7 ;0送SDA BTFSC TEMPP, 7 ;TEMPP.7=0? BSF PORTC, 7 ;NO,1送C CLOCK ;时钟 ENDM
START_COND MACRO ;开始条件 BSF PORTC,7 ;SDA=1 BSF PORTC,6 ;SCL=1 NOP NOP NOP NOP
BCF PORTC,7 ;SDA=0
NOP NOP NOP NOP
BCF PORTC,6 ;SCL=0
ENDM
STOP_COND MACRO ;终止条件
BCF PORTC, 7 ;SDA=0 BSF PORTC, 6 ;SCL=1 NOP NOP NOP NOP
BSF PORTC, 7 ;SDA=1 ENDM
ORG 0
GOTO MAIN ;转主程序 INTERPRET: MOVF COMMAND,W; ADDWF 2 FIRST: CALL READ_WCR ;COMMAND ‘0’ RETURN ;读WCR CALL WRITE_WCR;COMMAND’2’ RETURN ;写WCR CALL READ_DR ;COMMAND’4’ RETURN ;读寄存器 CALL WRITE_DR ; COMMAND’6’ RETURN ;写寄存器 CALL XFR_DR ;COMMAND’8’ RETURN ;数据寄存器至WCR(单个) CALL XFR_WCR ; COMMAND’0AH’ RETURN ; WCR至数据寄存器(单个) CALL GXFR_DR ; COMMAND’0CH’ RETURN ;数据寄存器至WCR(全部) CALL GXFR_WCR ; COMMAND’0EH’ RETURN ; WCR至数据寄存器(全部) CALL INC_WIPER ; COMMAND’10H’ RETURN ;增加/减小指定的WCR INSTR_GEN:
START_COND ; 开始条件 MOVF ADDR_BYTE, W ;送地址字节
CALL SEND_BYTE
MOVF ID, W ;送命令字 CALL SEND_BYTE
MOVF CASE, W ;根据CASE值散转 ADDWF 2
GOTO CASE0
GOTO CASE1 GOTO CASE2 GOTO CASE3 GOTO CASE4 GOTO CASE5 READ_WCR:
MOVLW 90H ;高四位为命令与ID组 IORWF ID, 1 ;合成新ID,读WCR CLRF CASE ; CASE=0 CALL INSTR_GEN RETURN WRITE_WCR:
MOVLW 0A0H ;写WCR IORWF ID, 1 MOVLW 1
MOVWF CASE ;CASE=1 CALL INSTR_GEN RETURN
READ_DR: ;读寄存器 MOVLW 0B0H
IORWF ID, 1
MOVLW 0 ;CASE=0 MOVWF CASE
CALL INSTR_GEN RETURN
WRITE_DR: ;写寄存器 MOVLW 0C0H IORWF ID, 1 MOVLW 2
MOVWF CASE CALL INSTR_GEN RETURN XFR_DR: ;传输RB、RA、 P0、指
MOVLW 0D0H ;定的寄存器中的内容至 IORWF ID, 1 ;与之相关的WCR MOVLW 3 MOVWF CASE
CALL INSTR_GEN RETURN
XFR_WCR: ;传输由P0指定的
MOVLW 0E0H ;WCR中的内容至RB、 IORWF ID, 1 ;RA指定的寄存器中 MOVLW 4
MOVWF CASE
CALL INSTR_GEN RETURN GXFR_DR: ;传输由RB、RA指定的所
MOVLW 10H ;有的四个数据寄存器的内 IORWF ID, 1 ;容至与它们相应的WCR中 MOVLW 3
MOVWF CASE
CALL INSTR_GEN RETURN
GXFR_WCR: ;传输所有WCR中的内
MOVLW 80H ;容至与它们相应的由RB, IORWF ID, 1 ;RA指定的数据寄存器中 MOVLW 4
MOVWF CASE
CALL INSTR_GEN RETURN
INC_WIPER: ;使能增加/减小由
MOVLW 20H ;P0指定的WCR IORWF ID, 1 MOVLW 5
MOVWF CASE
CALL INSTR_GEN RETURN
CASE0:CALL GET_BYTE ; 接收一字节
GOTO CASE3
CASE1:MOVF DATA_BYTE, W
CALL SEND_BYTE ;发送数据字节 GOTO CASE3
CASE2:MOVF DATA_BYTE,W
CALL SEND_BYTE CASE4:STOP_COND
CALL POLLING ;轮询 CASE3:STOP_COND
RETURN
CASE5:RRF ID ;取出ID最低位到C上 RRF TEMPP ;C中内容放到TEMPP.7上 WIPER_LOOP:SEND_BIT ;发送TEMPP.7至SDA并
DECFSZ PULSES;产生PULSES个脉冲于SCL GOTO WIPER_LOOP STOP_COND ;停止条件
RETURN
SEN_BYTE: 将TEMPP的内容发送出去
MOVWF TEMPP; MOVLW 8 ; 共发送八位
MOVWF COUNT BIT_LOOP:SEND_BIT NEXT_BIT:RLF TEMPP
DECFSZ COUNT GOTO BIT_LOOP
BSF PORTC, 7 ;八位发送完毕 NOP ;释放SDA NOP NOP CLOCK RETURN GET_BYTE: ;接收一字节,SDA=1
BSF PORTC, 7 MOVLW 8
MOVWF COUNT GET_LOOP:
CLOCK ;SDA送C并在SCL上产生一脉冲 RLF DATA_BYTE ;C移位至DATA_BYTE DECFSZ COUNT GOTO GET_LOOP
BCF TEMPP, 7 ; 发应答位 SEND_BIT RETURN POLLING:
START_COND ;开始条件 MOVF ADDR_BYTE, W ;送地址 AGAIN: CALL SEND_BYTE
BTFSC STATUS,C ;SDA=0?(有应答吗?) GOTO POLLING ;NO RETURN ;YES
MAIN:CALL INI ;初始化子程序
MOVLW B’01010000’ ; 装载从器件地址字节 MOVWF ADDR_BYTE
MOVLW B’00000001’ ;装在识别字节,对 MOVWF ID ;EEPOT #2操作 MOVLW 2 ;写入WCR命令 MOVWF COMMAND
MOVLW B’00101000’;设置
;D7D6D5D4D3D2D1D0
MOVWF DATA_BYTE ;=0 01 0 1 0 0 0 B,即为40 CALL INTERPRET
MOVLW B’00000001’ ;重新装载识别字节
MOVWF ID
MOVLW B’00001111’ ;减少15个脉冲 MOVWF PULSES MOVLW 10H ;增加/减少滑动端 MOVWF COMMAND CALL INTERPRET etc ......
INI:CLRF PORTC ;使C口为输出
BSF STATUS ,5 CLRF TRISC etc ...... END
.
相关推荐: