;*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: ;
;* 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 7 ;遥控接收输入脚位地址(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位数据暂存寄存器
;**************************************************
R1 EQU 40H ;
R2 EQU 41H ;
R3 EQU 42H ;
R4 EQU 43H ;
R5 EQU 44H ;
R6 EQU 45H ;
R7 EQU 46H ;
R8 EQU 47H ;
R9 EQU 48H ;
R10 EQU 49H ;
R11 EQU 4AH ;
R12 EQU 4BH ;
R13 EQU 4CH ;
R14 EQU 4DH ;
R15 EQU 4EH ;
R16 EQU 4FH ;
;-------------------------------
FLAG1 EQU 50H ;
B_LED0 EQU 0 ;
B_LED1 EQU 1 ;
B_LED2 EQU 2 ;
B_LED3 EQU 3 ;
B_LED4 EQU 4 ;
B_LED5 EQU 5 ;
B_LED6 EQU 6 ;
B_LED7 EQU 7 ;
;**************************************************
CONT1 EQU 7FH ;
;**************************************************
ORG 0000H ;
GOTO MAIN ;
ORG 0004H ;
; GOTO SEVTMR0 ;
RETFIE ;
ORG 0008H ;
TABLE:
ADDWF PCL,1 ;
RETLW 0C0H ; 0
RETLW 0F9H ; 1
RETLW 0A4H ; 2
RETLW 0B0H ; 3
RETLW 99H ; 4
RETLW 92H ; 5
RETLW 82H ; 6
RETLW 0F8H ; 7
RETLW 80H ; 8
RETLW 90H ; 9
;************************************************
SEVTMR0:
MOVWF W_TEMP ;现场保护
SWAPF STATUS,W ;用SWAPF才不会影响标志位
MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器
CALL DISP ;
MOVLW 100 ;
MOVWF TMR0 ;
BCF INTCON,T0IF ;清定时器0溢出中断标志位
SWAPF STATUS_TEMP,W ;恢复中断前STATUS,W的值
MOVWF STATUS ;
SWAPF W_TEMP,F ;
SWAPF W_TEMP,W ;(用SWAPF才不会影响STATUS的值)
RETFIE ;
;************************************
;************************************************
MAIN:
CALL RESET_ ;BANK0--BANK1清0
; CLRF STATUS ;清状态寄存器口
BSF STATUS,RP0 ;BANK-1
;------------------------------------------------
MOVLW 02H ;00001111设定:RB口不用上拉,分频器配给WDT
MOVWF OPTION_ ;分频比设为1:256
MOVLW 07H ;RA0/AN0,RA1,RA3,RA4,RA5=D
MOVWF ADCON1 ;
;------------------------------------------------
MOVLW 0C0H ;
MOVWF TRISC ;PORTC所有管脚设为输出
MOVLW 00H ;
MOVWF TRISB ;RB0=输入
MOVLW 00H ;
MOVWF TRISA ;
;------------------------------------------------
BCF STATUS,RP0 ;BANK-0
;------------------------------------------------
MOVLW 00000000B ;01001001选择:时钟时钟源为FOSC/8,允许ADC工作
MOVWF ADCON0 ;通道AN1,暂时不启动转换过程
; BCF INTCON,T0IF ;
; BSF INTCON,PEIE ;开外围功能部件中断
; BSF INTCON,GIE ;开放总中断
; BSF INTCON,T0IE ;
;------------------------------------------------
MOVLW 0C0H ;
MOVWF PORTC ;
MOVLW 00H ;
MOVWF PORTB ;
MOVLW 0FFH ;
MOVWF PORTA ;
; MOVLW 100 ;
; MOVWF TMR0 ;定时器送初值(255-155)*32US=3.2MS,每3.2MS一次中断
;*****************************************************
LOOP:
CLRWDT ;
CALL KEY ;
; BTFSS INTCON,T0IF ;
; GOTO RCV ;
; BCF INTCON,T0IF ;
; MOVLW 06H ;
; MOVWF TMR0 ;
CALL DISP ;
;*****************************************************
RCV:
BTFSC PORTC,RMT
GOTO LOOP ;是干扰退出
;-----------------------------------------------------
MOVLW 4
MOVWF CNT1 ;4*256*10us
CLRF CNT2
CLRF CNT0
RCV1: ;先检测引导码的9MS低电平
GOTO $+1 ;每一个循环10US
NOP ;
BTFSC PORTC,RMT ;
INCF CNT2,1 ;
BTFSS PORTC,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 PORTC,RMT
INCF CNT2,1
BTFSC PORTC,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 PORTC,RMT
INCF CNT3,1
BTFSS PORTC,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 PORTC,RMT
INCF CNT3,1
BTFSC PORTC,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 ;
;************************************
;*************************************
DISP:
BSF STATUS,RP0 ;BANK-1
MOVLW 00H ;
MOVWF TRISB ;RB0=输出
BCF STATUS,RP0 ;BANK-1
BSF PORTA,0 ;
BSF PORTA,1 ;
;-----------------------------------
CLRW ;
CALL TABLE ;
MOVWF PORTB ;
BCF PORTA,0 ;
CALL DELAY1MS ;
BSF PORTA,0 ;
;-----------------------------------
;-----------------------------------
BTFSS FLAG1,B_LED0 ;
GOTO DISP1 ;
BCF PORTB,0 ;
GOTO DISP11 ;
DISP1:
BSF PORTB,0 ;
DISP11:
BTFSS FLAG1,B_LED1 ;
GOTO DISP2 ;
BCF PORTB,1 ;
GOTO DISP12 ;
DISP2:
BSF PORTB,1 ;
DISP12:
BTFSS FLAG1,B_LED2 ;
GOTO DISP3 ;
BCF PORTB,2 ;
GOTO DISP13 ;
DISP3:
BSF PORTB,2 ;
DISP13:
BTFSS FLAG1,B_LED3 ;
GOTO DISP4 ;
BCF PORTB,3 ;
GOTO DISP14 ;
DISP4:
BSF PORTB,3 ;
DISP14:
BTFSS FLAG1,B_LED4 ;
GOTO DISP5 ;
BCF PORTB,4 ;
GOTO DISP15 ;
DISP5:
BSF PORTB,4 ;
DISP15:
BTFSS FLAG1,B_LED5 ;
GOTO DISP6 ;
BCF PORTB,5 ;
GOTO DISP16 ;
DISP6:
BSF PORTB,5 ;
DISP16:
BTFSS FLAG1,B_LED6 ;
GOTO DISP7 ;
BCF PORTB,6 ;
GOTO DISP17 ;
DISP7:
BSF PORTB,6 ;
DISP17:
BTFSS FLAG1,B_LED7 ;
GOTO DISP18 ;
BCF PORTB,7 ;
GOTO DISP_EXIT ;
DISP18:
BSF PORTB,7 ;
;-----------------------------------
DISP_EXIT:
BCF PORTA,1 ;
CALL DELAY1MS ;
BSF PORTA,1 ;
BSF STATUS,RP0 ;BANK-1
MOVLW 0FFH ;
MOVWF TRISB ;RB0=输出
BCF STATUS,RP0 ;BANK-1
MOVLW 0FFH ;按键子程序
MOVWF PORTB ;
RETLW 0 ;
;************************************
;************************************
KEY:
BSF STATUS,RP0 ;BANK-1
MOVLW 0FFH ;
MOVWF TRISB ;RB0=输出
BCF STATUS,RP0 ;BANK-1
MOVLW 0FFH ;按键子程序
MOVWF PORTB ;
NOP ;
NOP ;
;-----------------------------------
MOVF PORTB, W ;
ANDLW 0FFH ;
XORLW 0FFH ;
BTFSC STATUS,Z ;
GOTO KEYOUT ;
CALL DS10MS ;
BTFSS PORTB,0 ;
GOTO KEY0 ;
BTFSS PORTB,1 ;
GOTO KEY1 ;
BTFSS PORTB,2 ;
GOTO KEY2 ;
BTFSS PORTB,3 ;
GOTO KEY3 ;
BTFSS PORTB,4 ;
GOTO KEY4 ;
BTFSS PORTB,5 ;
GOTO KEY5 ;
BTFSS PORTB,6 ;
GOTO KEY6 ;
BTFSS PORTB,7 ;
GOTO KEY7 ;
GOTO KEYOUT ;
;----------------------------------
KEY0:
MOVLW 00000001B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY1:
MOVLW 00000010B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY2:
MOVLW 00000100B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY3:
MOVLW 00001000B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY4:
MOVLW 00010000B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY5:
MOVLW 00100000B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY6:
MOVLW 01000000B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
GOTO KEYOUT ;
KEY7:
MOVLW 10000000B ;
XORWF FLAG1 ;
CALL KEYWAIT ;
;-------------------------------------
KEYOUT:
BSF STATUS,RP0 ;BANK-1
MOVLW 00H ;
MOVWF TRISB ;RB0=输出
BCF STATUS,RP0 ;BANK-1
RETLW 0
;*************************************
KEYWAIT:
CALL DISP ;
MOVF PORTB, W ;
ANDLW 0FFH ;
XORLW 0FFH ;
BTFSS STATUS,Z ;
GOTO KEYWAIT ;
RETLW 0 ;
;*************************************
;*************************************
DS10MS:
MOVLW 10 ;
MOVWF R15 ;
MOVLW 20 ;
MOVWF R16 ;
; CALL DISP ;
NOP ;
CLRWDT ;
DECFSZ R16,F ;
GOTO $-3 ;
DECFSZ R15,F ;
GOTO $-7 ;
RETLW 0 ;
;**************************************
;**************************************
DELAY1MS:
CLRWDT ;
MOVLW 5 ;延时1.008MS 16
MOVWF R12 ; 20
DEL1: MOVLW 10 ;
MOVWF R13 ;
DEL2: ;
DECFSZ R13 ;
GOTO DEL2 ;
DECFSZ R12 ;
GOTO DEL1 ;
RETLW 0 ;
;**************************************
;**************************************
;****** 这是清零子程式 *******
;**************************************
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 ;
;*************************************************************