×
单片机 > 单片机程序设计 > 详情

SC1621摇控器-PIC单片机解码程序(已测试OK)

发布时间:2020-06-06 发布时间:
|

;*APPLICATION NOTE  E6000 ICEXPLORER ******************
;* Title:                                             ;

;SC6121的遥控器发射码依次为:同步头(引导码)+32位数据码 ;
;(用户码低8位+用户码高8位+键码+键码的反码)            ;
;引导码是由9MS的高电平加4.5MS的低电平构成,            ;
;我们接收到的刚好反相为9MS的低电平加4.5MS的高电平.    ;
;数据码'0'是由560US的高电平加560US的低电平构成        ;
;接收时反相为560US的低电平加560US的高电平构成=1.125mS ;
;数据码'1'是由560US的高电平加1.69MS的高电平构成       ;
;接收时反相为560US的低电平加1.69MS的高电平构成=2.25mS ;
;* Version:         00                                ;
;* Last Updated:    2006.06.09                        ;
;* MCU:             PIC16C74                          ;
;* FOR:             www.picavr.com                     ;
;******************************************************
;***ROM  PCLATH.D3=0  000H-7FFH                       ;
;  PCLATH.D3=1  800H-FFFH                       ;
;******************************************************
;** RAM    BANK0=20H---7FH STATUS RP0=0,RP1=0    ;
;**        BANK1=A0H---FFH STATUS RP0=1,RP1=0    ;
;**        BANK2=100H--17FH     STATUS RP1=1,RP0=0    ;
;**        BANK3=180H--1FFH     STATUS RP1=1,RP0=1    ;
;******************************************************
;               ________________
;    MCLR/VPP/TH-| 1           40 |-RB7/PGD
;        RA0/AN0-| 2           39 |-RB6/PGC
;        RA1/AN1-| 3           38 |-RB5
; RA2/AN2/VRref--| 4           37 |-RB4
; RA3/AN3/VRref+-| 5           36 |-RB3/PGM
;      RA4/TOCKI-| 6           35 |-RB2
;     RA5/AN4/SS-| 7           34 |-RB1
;     RE0/RD/AN5-| 8           33 |-RB0/INT
;     RE1/WR.AN6-| 9           32 |-VDD
;     RE2/CS/AN7-| 10          31 |-VSS
;            VDD-| 11          30 |-RD7/PSP7
;            VSS-| 12          29 |-RD6/PSP6
;     OSC1/CLKIN-| 13          28 |-RD5/PSP5
;    OSC2/CLKOUT-| 14          27 |-RD4/PSP4
; RC0/TISO/TICKI-| 15          26 |-RC7/RX/DT
; RC1/T1OSI/CCP2-| 16          25 |-RC6/TX/CK
;       RC2/CCP1-| 17          24 |-RC5/SDO
;    RC3/SCK/SCL-| 18          23 |-RC4/SDA
;       RD0/PSP0-| 19          22 |-RD3/PSP3
;       RD1/PSP1-| 20          21 |-RD2/PSP2
;                 ~~~~~~~~~~~~~~~
;         16F74A
;****************************************************
RMT          EQU  0          ;遥控接收输入脚位地址(RB。0)
;-------------------------------------------------
BITIN        EQU  7          ;遥控接收数据位位标志
;-------------------------------------------------
CNT0         EQU 20H         ;用户临时寄存器1
CNT1         EQU 21H         ;用户临时寄存器2
CNT2         EQU 22H         ;用户临时寄存器3
CNT3         EQU 23H         ;用户临时寄存器4
TABADD       EQU 24H         ;数码管显示码取码用寄存器
FLAGS        EQU 25H         ;显示位选标志位
DISPBUF_H    EQU 26H         ;显示器高位
DISPBUF_L    EQU 27H         ;显示器低位


FLAGS2       EQU 28H         ;临时寄存器

W_TEMP       EQU 2AH         ;W现场保护寄存器
STATUS_TEMP  EQU 2BH         ;STATUS现场保护寄存器

CSR0         EQU 2CH         ;遥控键码反码寄存器
CSR1         EQU 2DH         ;遥控器键码寄存器
CSR2         EQU 2EH         ;遥控器用户码高8位寄存器
CSR3         EQU 2FH         ;遥控器用户码低8位寄存器

CSR0A        EQU 30H         ;遥控接收32位数据暂存寄存器
CSR1A        EQU 31H         ;遥控接收32位数据暂存寄存器
CSR2A        EQU 32H         ;遥控接收32位数据暂存寄存器
CSR3A        EQU 33H         ;遥控接收32位数据暂存寄存器
;**************************************************
CONT1        EQU 7FH         ;
;**************************************************
            ORG 0000H
            GOTO MAIN
            ORG  0004H
            RETFIE           ;
            ORG  0008H
;************************************************
MAIN:
 CALL    RESET_       ;BANK0--BANK1清0

 CLRF STATUS       ;清状态寄存器口
        BSF     STATUS,RP0   ;BANK-1
;------------------------------------------------
        MOVLW   0FH          ;00001111设定:RB口不用上拉,分频器配给WDT
        MOVWF   OPTION_      ;分频比设为1:256
        MOVLW   02H          ;00000010转换结果左对齐,只选3个A/D通道RA0/AN0,RA1,RA3
        MOVWF   ADCON1       ;选择VDD和VSS作参考源
;------------------------------------------------
        MOVLW   00H
        MOVWF   TRISC        ;PORTC所有管脚设为输出
        MOVLW   01H          ;
        MOVWF   TRISB        ;RB0=输入
        MOVLW   0FFH         ;
        MOVWF   TRISA        ;
;------------------------------------------------
        BCF     STATUS,RP0   ;BANK-0
;------------------------------------------------
        MOVLW   01001001B    ;01001001选择:时钟时钟源为FOSC/8,允许ADC工作
        MOVWF   ADCON0       ;通道AN1,暂时不启动转换过程
        BCF     PIR1,  ADIF  ;清除A/D中断标志位
;------------------------------------------------
        MOVLW   00H          ;
        MOVWF   PORTC        ;
        MOVLW   0FFH         ;
        MOVWF   PORTB        ;
;*****************************************************
LOOP:
        NOP                  ;
        NOP                  ;
;*****************************************************
RCV:
        BTFSC      PORTB,RMT
        GOTO       LOOP           ;是干扰退出
        MOVLW      4
        MOVWF      CNT1           ;4*256*10us
        CLRF       CNT2
        CLRF       CNT0
RCV1:                             ;先检测引导码的9MS低电平
        GOTO       $+1            ;每一个循环10US
        NOP                       ;
        BTFSC      PORTB,RMT      ;
        INCF       CNT2,1         ;
        BTFSS      PORTB,RMT      ;
        CLRF       CNT2           ;
        BTFSC      CNT2,3         ;高电平大于8*10US=80US则为有效高电平,否则是一些干扰信号
        GOTO       RCV2           ;

        DECFSZ     CNT0,1         ;
        GOTO       RCV1           ;
        DECFSZ     CNT1,1         ;
        GOTO       RCV1           ;
        GOTO       LOOP           ;低电平大于4*256*10US=10.24MS则是错误脉冲
RCV2:
        MOVLW      3
        SUBWF      CNT1,0         ;低电平小于2*256*10US=5.12MS则是错误脉冲
        BTFSC      STATUS,C       ;
        GOTO       LOOP           ;

        MOVLW       3             ;
        MOVWF      CNT1           ;3*256*10us
        CLRF       CNT2           ;
        CLRF       CNT0           ;
;*************************************************
RCV3:
        GOTO       $+1            ;每一个循环10US
        NOP
        BTFSS      PORTB,RMT
        INCF       CNT2,1
        BTFSC      PORTB,RMT
        CLRF       CNT2
        BTFSC      CNT2,3          ; 低电平大于8*10US=80US则为有效低电平,否则是一些干扰信号
        GOTO       RCV4
        DECFSZ     CNT0,1
        GOTO       RCV3
        DECFSZ     CNT1,1
        GOTO       RCV3
        GOTO       LOOP            ;高电平大于3*256*10US=7.68MS则是错误的
;**************************************************
RCV4:
        MOVLW      3
        SUBWF      CNT1,0          ;高电平小于1*256*10US=2.56MS则是错误的
        BTFSC      STATUS,C        ;
        GOTO       LOOP

        MOVLW      32
        MOVWF      CNT2            ;接收数据共32位,16位用户码,8位控制码加8位控制码的反码
RCV5:
        CLRF       CNT3
        MOVLW      170             ;低电平大于256-170=86*10US=860US错误
        MOVWF      CNT0
        MOVLW      56
        MOVWF      CNT1            ;高电平大于256-56=200*10US=2MS错误
RCV5_HI:
        GOTO       $+1
        NOP
        BTFSC      PORTB,RMT
        INCF       CNT3,1
        BTFSS      PORTB,RMT
        CLRF       CNT3
        BTFSC      CNT3,2          ;高电平大于8*10US=80US则为有效高电平
        GOTO       RCV6
        INCFSZ     CNT0,1
        GOTO       RCV5_HI         ;低电平大于860US则是错误的
        GOTO       LOOP
RCV6:
        CLRF       CNT3
RCV6_LO:
        GOTO       $+1
        NOP
        BTFSS      PORTB,RMT
        INCF       CNT3,1
        BTFSC      PORTB,RMT
        CLRF       CNT3
        BTFSC      CNT3,3          ;低电平大于10*8US=80US则是有效低电平
        GOTO       COMPARE
        INCFSZ     CNT1,1
        GOTO       RCV6_LO         ;高电平大于256-56=200*10US=2MS错误
        GOTO       LOOP
COMPARE:
        MOVLW      170
        SUBWF      CNT0,1          ;CNT0的值减初始值等于实际低电平计数值
        MOVLW      56
        SUBWF      CNT1,1          ;CNT1的值减初始值等于实际高电平计数值
        MOVFW      CNT1
        ADDWF      CNT0,1          ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0
        BTFSC      STATUS,C        ;
        GOTO       LOOP            ;总的值大于255(即时间大于255*10US=2.55MS)则错误
        MOVLW      70
        SUBWF      CNT0,0
        BTFSS      STATUS,C        ;
        GOTO       LOOP            ;总的时间小于70*10US=700US则是错误的
        MOVLW      130             ;130*10=1.3MS
        SUBWF      CNT0,0
        BTFSC      STATUS,C        ;
        GOTO       COMPARE_H       ;时间大于1.3MS转去确定是否1
        BCF        FLAGS2,BITIN    ;时间在700US-1.3MS之间则是0
        GOTO       MOVDATA         ;送数
COMPARE_H:
        MOVLW      160
        SUBWF      CNT0,0
        BTFSS      STATUS,C        ;
        GOTO       LOOP            ;小于160*10US=1.6MS,则错误
        MOVLW      230
        SUBWF      CNT0,0
        BTFSC      STATUS,C        ;
        GOTO       LOOP            ;大于230*10US=2.3MS,则错误
        BSF        FLAGS2,BITIN    ;时间在1.6MS-2.3MS之间则是1
MOVDATA:
        RRF        CSR0A,1         ;将每一位移入相应寄存器
        RRF        CSR1A,1
        RRF        CSR2A,1
        RRF        CSR3A,1
        BCF        CSR0A,7
        BTFSC      FLAGS2,BITIN    ;接收当前位送入CSR0.7
        BSF        CSR0A,7
        DECFSZ     CNT2,1          ;是否接收完32位
        GOTO       RCV5


        MOVFW      CSR0A           ;将临时寄存器中的数存回相应寄存器
        MOVWF      CSR0
        MOVFW      CSR1A
        MOVWF      CSR1
        MOVFW      CSR2A
        MOVWF      CSR2
        MOVFW      CSR3A
        MOVWF      CSR3

        COMF       CSR0,0          ;比较键码的反码取反后是否等于键码
        XORWF      CSR1,0
        BTFSS      STATUS,2        ;
        GOTO       LOOP            ;不等于则接收到的是错误的信息
                                   ;将键码送显示
;**********************************************
        MOVLW      03H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S2              ;
        
        MOVLW      02H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S3              ;
        
        MOVLW      01H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S4              ;
        
        MOVLW      00H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S5              ;
        
        MOVLW      07H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S6              ;
        
        MOVLW      06H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S7              ;
        
        MOVLW      05H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S8              ;

        MOVLW      04H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S9              ;

        MOVLW      08H             ;
        SUBWF      CSR1,W          ;
        BTFSC      STATUS,Z        ;
        GOTO       S10             ;                   
        
        GOTO       LOOP            ;
S2:     BSF        PORTC,0         ;
        GOTO       LOOP            ;
S3:     BSF        PORTC,1         ;
        GOTO       LOOP            ;
S4:     BSF        PORTC,2         ;
        GOTO       LOOP            ;
S5:     BSF        PORTC,3         ;
        GOTO       LOOP            ;
S6:     BSF        PORTC,4         ;
        GOTO       LOOP            ;
S7:     BSF        PORTC,5         ;
        GOTO       LOOP            ;
S8:     BSF        PORTC,6         ;
        GOTO       LOOP            ;
S9:     BSF        PORTC,7         ;
        GOTO       LOOP            ;
S10:    CLRF       PORTC           ;
        GOTO       LOOP            ;                                       
;---------------------------------------------                                        
;        SWAPF      CSR1,W          ;显示值高低位交换,先处理高位
;        ANDLW      0FH             ;屏蔽掉高位
;        MOVWF      DISPBUF_H       ;存入寄存器
;        MOVFW      CSR1            ;显示值低位处理
;        ANDLW      0FH             ;屏蔽掉高位
;        MOVWF      DISPBUF_L       ;存入寄存器
;        GOTO       LOOP            ;
;*********************************************
;******        这是清零子程式 **************
;*********************************************
RESET_:
         BCF     STATUS,RP0        ;
         MOVLW   90                ;
         MOVWF   CONT1             ;
         MOVLW   20H               ;
         MOVWF   FSR               ;
PORTBM0: CLRF    INDF              ;
         CLRWDT                    ;
         INCF    FSR,F             ;
         DECFSZ  CONT1,F           ;
         GOTO    PORTBM0           ;

         MOVLW   90                ;
         MOVWF   CONT1             ;
         MOVLW   0A0H              ;
         MOVWF   FSR               ;
PORTBM1: BSF     STATUS,RP0        ;
         CLRF    INDF              ;
         CLRWDT                    ;
         INCF    FSR,F             ;
         BCF     STATUS,RP0        ;
         DECFSZ  CONT1,F           ;
         GOTO    PORTBM1           ;
         RETLW   0                 ;
;-----------------------------------------------
         END                       ;
;*************************************************************
;S2=FC03 0000  S3=FD02 0000  S4=FE01 0000  S5=FF00 0000     ;CSR0=FC CSR1=03 CSR2=00 CSR3=00 (S2)
;S6=F807 0000  S7=F906 0000  S8=FA05 0000  S9=FB04 0000     ;
;S10=F40B 0000  S11=F50A 0000  S12=F609 0000  S13=F708 0000 ;
;S14=F00F 0000  S15=F10E 0000  S16=F20D 0000  S17=F30C 0000 ;
;S18=EC13 0000  S19=ED12 0000  S20=EE11 0000  S21=EF10 0000 ;
;S22=E817 0000  S23=E916 0000  S24=EA15 0000  S25=EB14 0000 ;
;S26=E41B 0000  S27=E51A 0000  S28=E619 0000  S29=E718 0000 ;
;S30=E01F 0000  S31=E11E 0000  S32=E21D 0000  S33=E31C 0000 ;
;*************************************************************





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析