⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 解码.asm

📁 基于PIC16F73的HS2240滚动码解码程序(ASM)
💻 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 + -