📄 解码.asm
字号:
; Generated by WinDis84, (c) Nigel Goodwin 1998.
; LIST P=16F84, F=INHX8M
include "P16FXX.inc"
BUF_W EQU 20H
BUF_S EQU 21H
DEL_T EQU 22H
XS_PC EQU 23H
WM_PC EQU 24H
COUNT EQU 25H
TIMER EQU 26H
TIMER_1 EQU 28H
SYS_REG EQU 27H
KEY_L EQU 47H
KEY_M EQU 48H
KEY_H EQU 49H
BAK_KEY_L EQU 50H
BAK_KEY_M EQU 51H
BAK_KEY_H EQU 52H
#DEFINE BEL 01H
#DEFINE TRS 02H
ORG 0x0000
BCF INTCON , GIE
CLRWDT
BCF PCLATH , 03
GOTO MAIN
MOVWF BUF_W
SWAPF STATUS , W
BCF STATUS , RP0
BCF STATUS , RP1
MOVWF BUF_S
GOTO INTZ
BM_TAB ADDWF PCL , F
RETLW B'11010111'
RETLW B'00010100'
RETLW B'11001101'
RETLW B'01011101'
RETLW B'00011110'
RETLW B'01011011'
RETLW B'11011011'
RETLW B'00010101'
RETLW B'11011111'
RETLW B'01011111'
RETLW B'10011111'
RETLW B'11011010'
RETLW B'11001000'
RETLW B'11011100'
RETLW B'11001011'
RETLW B'10001011'
MAIN BCF STATUS , RP1
CALL INIT
CALL BELL
LOOOP BTFSS 0x32 , 03
GOTO LOOOP
BCF 0x32 , 03
CLRF COUNT
CALL BELL
BCF PORTA , 05
CLRWDT
MOVLW 61H
MOVWF FSR
MOVF KEY_L , W
MOVWF BAK_KEY_L
ANDLW 0FH
MOVWF INDF
INCF FSR , F
SWAPF KEY_L , W
ANDLW 0FH
MOVWF INDF
INCF FSR , F
MOVF KEY_M , W
MOVWF BAK_KEY_M
ANDLW 0FH
MOVWF INDF
INCF FSR , F
SWAPF KEY_M , W
ANDLW 0FH
MOVWF INDF
INCF FSR , F
MOVF KEY_H , W
MOVWF BAK_KEY_H
ANDLW 0FH
MOVWF INDF
INCF FSR , F
SWAPF KEY_H , W
ANDLW 0FH
MOVWF INDF
MOVLW 01H
MOVWF XS_PC
XS_DATA BTFSS PORTA , 00
GOTO XS_FW
CLRWDT
CLRF PORTC
MOVLW 60H
ADDWF XS_PC ,W
MOVWF FSR
MOVF INDF ,W
CALL BM_TAB
MOVWF PORTB
MOVLW 01H
MOVWF WM_PC
MOVF XS_PC , W
MOVWF COUNT
LOOP DECFSZ COUNT , F
GOTO LOOP1
GOTO XS_SJ
LOOP1 BCF STATUS , C
RLF WM_PC , F
GOTO LOOP
XS_SJ MOVF WM_PC , W
MOVWF PORTC
CALL DELAY
INCF XS_PC , F
MOVF XS_PC , W
SUBLW 07H
BTFSC STATUS , C
GOTO XS_DATA
MOVLW 01H
MOVWF XS_PC
GOTO XS_DATA
XS_FW CLRF PORTC
BSF STATUS , RP0
BSF TRISC , 07
BCF TRISC , 06
MOVLW D'25' ;9600BPS
MOVWF SPBRG
MOVLW 0A0H
MOVWF TXSTA
BCF STATUS , RP0
MOVLW 0B0H
MOVWF RCSTA
BCF PIR1 , TXIF
MOVLW D'10'
MOVWF COUNT
BSF SYS_REG , TRS
BCF 0x32 , 03
TRAN_S CLRWDT
MOVLW 0XAA
MOVWF TXREG
TRAN_B BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_B
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVF BAK_KEY_L , W
MOVWF TXREG
TRAN_L BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_L
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVLW 0XAA
MOVWF TXREG
TRAN_B0 BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_B0
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVF BAK_KEY_M , W
MOVWF TXREG
TRAN_M BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_M
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVLW 0XAA
MOVWF TXREG
TRAN_B1 BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_B1
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVF BAK_KEY_H , W
MOVWF TXREG
TRAN_H BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_H
BCF STATUS , RP0
BCF PIR1 , TXIF
MOVLW 0XAA
MOVWF TXREG
TRAN_B2 BSF STATUS , RP0
BTFSS TXSTA , TRMT
GOTO TRAN_B2
BCF STATUS , RP0
BCF PIR1 , TXIF
DECFSZ COUNT , 1
GOTO TRAN_S
MOVLW D'30'
MOVWF COUNT
RECE BTFSC PIR1 , RCIF
GOTO RECE_Y
MOVF TIMER , W
BTFSS STATUS , Z
GOTO RECE
DECFSZ DEL_T , F
GOTO RECE
DECFSZ COUNT , F
GOTO RECE
GOTO ERR_CL
RECE_Y MOVF RCREG , W
BCF
MOVWF COUNT
MOVF BAK_KEY_L , W
XORWF BAK_KEY_M , W
XORWF BAK_KEY_H , W
XORWF COUNT , W
BTFSS STATUS , Z
GOTO ERR_CL
CALL BELL
BCF SYS_REG , TRS
GOTO LOOOP
ERR_CL ;CALL BELL
;MOVLW 0X10
;MOVWF TIMER_1
;WAIT1 ;MOVF TIMER_1 , W
; BTFSS STATUS , Z
; GOTO WAIT1
; CALL BELL
BCF SYS_REG , TRS
GOTO XS_DATA
INTZ BTFSC INTCON , T0IF
CALL T0_INT
SWAPF BUF_S , W
MOVWF STATUS
SWAPF BUF_W , f
SWAPF BUF_W , W
RETFIE
INIT BSF STATUS , RP0
MOVLW 0x17
MOVWF TRISA
MOVLW 0x07
MOVWF ADCON1 ;PA全部为数字口
MOVLW 0x00
MOVWF TRISB
MOVWF TRISC
MOVLW 0x00
MOVWF OPTION_REG
BCF STATUS , RP0
MOVLW 0x00
MOVWF PORTB
MOVWF PORTC
CLRF TMR0
MOVLW 0x20
MOVWF INTCON
MOVLW 0x4C
MOVWF 0x30
MOVLW 0x20
MOVWF FSR
Label_A088 CLRF INDF
INCF FSR , f
BTFSS FSR , 07
GOTO Label_A088 ;请B1H--FDH==0
BSF INTCON , GIE
RETURN
DELAY CLRWDT
NOP
DECFSZ DEL_T
GOTO DELAY
RETURN
BELL BSF SYS_REG ,BEL
MOVF TIMER ,F
BTFSS STATUS ,Z
GOTO BELL
DECFSZ COUNT ,F
GOTO BELL
BCF SYS_REG ,BEL
BCF PORTA , 05
RETURN
T0_INT BCF INTCON , T0IF
INCF TIMER , F
BTFSC STATUS , Z
DECF TIMER_1 , F
CLRWDT
BTFSC SYS_REG , TRS
GOTO Label_A018
MOVF PORTA , W
ANDLW 0x10
MOVWF 0x46 ;取RA4状态-->46H(BANK1)
Label_A015 BSF STATUS , C ;数据接收
BTFSS 0x46 , 04
BCF STATUS , C
RLF 0x41 , f
CLRF 0x42
BTFSC 0x41 , 00
INCF 0x42 , f
BTFSC 0x41 , 01
INCF 0x42 , f
BTFSC 0x41 , 02
INCF 0x42 , f
BTFSS 0x42 , 01 ;电平滤波,连续2个相同信号才改变输入状态
GOTO Label_A019
BTFSS 0x33 , 04 ;如果上一个状态是1,则直接累加,否则判别是否是毛刺
GOTO Label_A01A
INCF 0x40 , f ;1电平时间长,则1电平累加器+1
GOTO Label_A018
Label_A01A BSF 0x33 , 04 ;置当前信号标志
BTFSS 0x33 , 03 ;判别同步头是否已经到
GOTO Label_A01B
MOVLW 0x01
SUBWF 0x40 , W
BTFSS STATUS , C
GOTO Label_A01C ;如果是小毛刺,则退出
MOVF 0x3F , W
ADDWF 0x40 , W
MOVWF 0x42
MOVLW 0x1E
SUBWF 0x42 , W
BTFSC STATUS , C
GOTO Label_A01C ;如果高低电平的时间大于数据宽度,则返回
MOVLW 0x06
SUBWF 0x42 , W
BTFSS STATUS , C
GOTO Label_A01C ;如果数据宽度过窄,则返回
MOVF 0x3F , W
SUBWF 0x40 , W ;判别高低电平时间差,H<L,C=0,H>L,C=1
RLF 0x43 , f
RLF 0x44 , f
RLF 0x45 , f ;移位
CLRF 0x3F
CLRF 0x40
INCF 0x40 , f
DECFSZ 0x3E , f
GOTO Label_A018
BSF 0x32 , 03 ;置解码有效标志
MOVF 0x43 , W
MOVWF KEY_L ;47H低4位存放按键数据
MOVF 0x44 , W
MOVWF KEY_M
MOVF 0x45 , W
MOVWF KEY_H ;解码后的数据存放于:47H,48H,49H
BCF 0x33 , 03
GOTO Label_A018
Label_A019 BTFSC 0x33 , 04 ;如果上一个状态是0,则直接累加,否则判别是否过长
GOTO Label_A01D
INCF 0x3F , f ;1电平时间长,则0电平累加器+1
GOTO Label_A018
Label_A01D MOVLW 0x14
SUBWF 0x40 , W
BTFSC STATUS , C ;如果0电平时间过长,则返回
GOTO Label_A01C
BCF 0x33 , 04 ;置当前信号标志
INCF 0x3F , f
GOTO Label_A018
Label_A01B MOVLW 0x32
SUBWF 0x3F , W
BTFSS STATUS , C
GOTO Label_A01C ;检测同步头
MOVLW 0xC8
SUBWF 0x3F , W
BTFSC STATUS , C
GOTO Label_A01C ;0x3f>时间>0x20,则有效
BSF 0x33 , 03 ;置同步头有效标志
CLRF 0x3F
CLRF 0x40
INCF 0x40 , f
MOVLW 0x18
MOVWF 0x3E
GOTO Label_A018
Label_A01C BCF 0x33 , 03 ;出错,清同步头有效标志
CLRF 0x3F
CLRF 0x40
Label_A018 BTFSS SYS_REG ,TRS
GOTO LED_S
BTFSS TIMER_1 ,02
BCF PORTA ,03
BTFSC TIMER_1 ,02
BSF PORTA ,03
GOTO BUZ_S
LED_S BTFSS TIMER_1 ,04
BCF PORTA ,03
BTFSC TIMER_1 ,04
BSF PORTA ,03
BUZ_S BTFSS SYS_REG , BEL
RETURN
BTFSS TIMER ,01
BCF PORTA ,05
BTFSC TIMER ,01
BSF PORTA ,05
RETURN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -