📄 ap0610-receive.asm
字号:
;***************************************KH-004*******************************************;
;MDT Ltd ;
; ;
;File: receive.ASM Editor: KEN KONG ;
; ;
;Date: 06 - 05 - 12 Ver: 1.0 ;
; ;
;Type: 53A1 int RC: 4MHz ;
; ;
;*******************************************************************************************;
; LIST P=12C509 ;
;-------------------FSR DEFINE--------------------;
;*************************************************;
INDF EQU 00H ;
TMR0 EQU 01H ;
STATUS EQU 03H ;
FSR EQU 04H ;
PORTB EQU 06H ;
PB EQU 06H ;
CODE1 EQU 10H
CODE2 EQU 11H
CODE3 EQU 12H
CODE4 EQU 13H
RF1 EQU 10H
RF2 EQU 11H
RF3 EQU 12H
RF4 EQU 13H
CODE11 EQU 0CH
CODE21 EQU 0DH
CODE31 EQU 0EH
CODE41 EQU 0FH
CODE5 EQU 1EH
COUNT EQU 9H
COUNT1 EQU 0AH
NUM EQU 0BH
DELAY1 EQU 8H
DELAY2 EQU 15H
DELAY3 EQU 16H
RF_BUFF EQU 17H
BUFF EQU 17H
ADDR_I2C EQU 18H
VALUE EQU 19H
R_STATUS EQU 1AH
COUNT_RF EQU 1BH
H_LEVEL EQU 1CH
L_LEVEL EQU 1DH
BIT_COUNT EQU 14H
PB_TEMP EQU 1AH
TIME0 EQU 1FH
;*************************************************;
;-----------------PORT DEFINE---------------------;
;*************************************************;
;*************************************************;
;----------------REGISTER DEFINE------------------;
#DEFINE CONTROL_OUT PB,0
#DEFINE SCL PB,1
#DEFINE SDA PB,2
#DEFINE RF_IN PB,3
#DEFINE S_LEARN PB,4
;*************************************************;
;--------------------PROGRAMME START------------------------;
;*************************************************
ORG 03FFH
GOTO START
;*************************************************
ORG 0000H
GOTO START
;*************************************************
;*************************************************;
;----------------------------- PORT INITIALIZATION ---------------------------------------------;
;*************************************************;
DELAY80US
MOVLW 0CH
GOTO $+3
DELAY20US ; 延时20uS(连调用时间)
GOTO $+1
DELAY18US
MOVLW 2H
NOP
MOVWF DELAY1
DELAY_USC
GOTO $+1
CLRWDT
DECFSZ DELAY1,F
GOTO DELAY_USC
RETLW 0H
;***************************************************************
;************************************************************************
;****************************I2C W/R*************************************
;************************************************************************
WR_EEPROM: ;主设备往I2C芯片写数据
CALL I2C_START ;起始位产生
MOVLW B'10100000' ;24c01地址标志为1010,A<2:0>=000,写数据
CALL I2C_DATAOUT ;发送操作命令到I2C芯片
MOVF ADDR_I2C,W ;24C01数据地址
CALL I2C_DATAOUT ;8bit数据发送
MOVF VALUE,W ;选择24c01,写数据
CALL I2C_DATAOUT ;8bit数据发送
CALL I2C_STOP ;停止位产生,I2C写交易结束
CALL DLY2 ;延时5ms(24C01数据Twr延时最大值为5ms)
RETLW 0H
;********************************************************
RD_EEPROM: ;主设备往I2C芯片读数据
CALL I2C_START ;起始位产生
MOVLW B'10100000' ;24c01地址标志为1010,A<2:0>=000,写数据
CALL I2C_DATAOUT ;8bit数据发送
MOVF ADDR_I2C,W ;24C01数据地址
CALL I2C_DATAOUT ;8bit数据发送
CALL I2C_RESTART ;重复起始位产生
MOVLW B'10100001' ;选择24c01,读数据
CALL I2C_DATAOUT ;8bit数据发送
CALL I2C_DATAIN ;8bit数据输入
CALL I2C_STOP ;停止位产生,I2C读交易结束
RETLW 0H
;********************************************************
;在I2C总线上产生起始位
I2C_START:
BSF SDA ;SDA=1
GOTO $+1
GOTO $+1
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BCF SDA ;SDA=0,起始位标志产生
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0
RETLW 0H ;返回
;********************************************************
;在I2C总线上产生停止位
I2C_STOP:
BCF SDA ;SDA=0
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BSF SDA ;SDA=1,停止位标志产生
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0
RETLW 0H ;返回
;********************************************************
;在I2C总线上产生重复起始位
I2C_RESTART:
BCF SCL ;SCL=0
BSF SDA ;SDA=1
GOTO $+1
GOTO $+1
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BCF SDA ;SDA=0,重复起始位标志产生
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0
RETLW 0H ;返回
;********************************************************
;主设备向从设备输出数据
I2C_DATAOUT:
MOVWF BUFF ;发送数据到移位寄存器
MOVLW .8 ;8 位输出
MOVWF NUM ;设置计数器初值
_I2CBITOUT:
BTFSS BUFF,7 ;高位先发,判断移位寄存器最高位
GOTO $+3 ;为0则跳转
BSF SDA ;为1则置位SDA
GOTO $+2 ;跳到时钟发送
BCF SDA ;为0则清零SDA
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0,1 位传输结束
RLF BUFF,F ;发送数据左移1位
DECFSZ NUM,F ;8 位全部输出?
GOTO _I2CBITOUT ;否,继续发送数据位
BSF SDA ;数据发送完成,释放SDA准备检测从设备应答
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0
RETLW 0H ;返回
;********************************************************
;主设备从I2C总线上读取数据,放入I2C_BUFF单元
I2C_DATAIN:
MOVLW .8 ;8 位数据输出
MOVWF NUM ;设置计数寄存器初值
MOVLW B'00011100' ;TRISB,SDA设为输入
TRIS PORTB
_I2CBITIN
RLF BUFF,F ;接收移位寄存器左移一位
BSF SCL ;SCL=1
BCF BUFF,0 ;接收移位寄存器最低位预清0
BTFSC SDA ;测试SDA电平
BSF BUFF,0 ;为1则移入数据为1
BCF SCL ;SCL=0
GOTO $+1
GOTO $+1
DECFSZ NUM,F ;8 位数据接收完成?
GOTO _I2CBITIN ;否,继续接收
MOVLW B'00011000' ;TRISB,SDA设为输出
TRIS PORTB
BSF SDA ;主设备发出非应答位,SDA=1
BSF SCL ;SCL=1
GOTO $+1
GOTO $+1
BCF SCL ;SCL=0
RETLW 0H ;返回
;***************************************************************
;延迟5.1ms子程序,为保证I2C写入有充分的缓冲时间Twr
DLY2:
MOVLW 0FFH ;内循环次数255
MOVWF DELAY1
DLY2_LP
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
CLRWDT
DECFSZ DELAY1,F
GOTO DLY2_LP
RETLW 0H
;************************************************************************
DLY1
CLRWDT
NOP
GOTO $+1
RETLW 0H
;*************************************************
;********************************************************************
DELAY500MS ;延时子程序,500ms
; MOVLW 02H
; MOVWF DELAY3
DELAY500MS_1
MOVLW 0F4H
MOVWF DELAY1
DELAY500MS_2
CLRWDT
MOVLW 0FFH
MOVWF DELAY2
DELAY500MS_3
; BTFSC RF_IN
; GOTO RF_RECEIVE
NOP
DECFSZ DELAY2,1
GOTO DELAY500MS_3
DECFSZ DELAY1,1
GOTO DELAY500MS_2
; DECFSZ DELAY3,1
; GOTO DELAY500MS_1
RETLW 0H
;*************************************************;
START
MOVLW B'00000011'
OPTION
MOVLW B'00011010' ;设置PB口
TRIS PORTB
CLRF PORTB
CLRF R_STATUS
CLRF CODE5
BTFSS PB,4
BSF CODE5,0
BSF PB,5
CLRF CODE41
GOTO READ_CODE
;*************************************************
MAIN
BTFSC TMR0,7
CALL TMR0_OUT
BTFSS S_LEARN
GOTO CHECK_LEARN
BTFSC RF_IN
GOTO RECEIVE
BCF R_STATUS,1
BCF R_STATUS,0
CLRWDT
GOTO MAIN
TMR0_OUT
BCF TMR0,7
INCF TIME0,F
BTFSS TIME0,7
RETLW 0H
BCF TIME0,7
BCF R_STATUS,6
MOVLW B'01010000'
XORWF CODE41,W
BZ TMR0_1
BSF R_STATUS,6
TMR0_1
BTFSS R_STATUS,6
GOTO TMR0_2
BTFSC R_STATUS,7
GOTO TMR0_2
BTFSC CODE5,0 ;加入测试模式
BCF PB,5
; BSF PB,5
BSF R_STATUS,7
RETLW 0H
TMR0_2
BSF PB,5
BCF R_STATUS,7
RETLW 0H
;SET_INIT
; BSF PB,5
; CALL DELAY500MS
; BCF PB,5
; CALL DELAY500MS
; BTFSC S_LEARN
; GOTO CHECK_LEARN
; GOTO MAIN
CHECK_LEARN
BTFSC R_STATUS,1
GOTO LEARN
CALL DELAY500MS
BTFSC S_LEARN
GOTO RECEIVE
BSF R_STATUS,1
GOTO LEARN
;*******************************************************
;*************************************************;
;*************************************************;
RECEIVE
; BTFSS RF_IN ;再判断一次接收信号
; GOTO MAIN
; **************************************************************************
; *************************** RF_IN射频接收程序 ****************************
; **************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -