|
;*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 ; ;************************************************************* |