;*APPLICATION NOTE E6000 ICEXPLORER ******************
;* Title: ;
;M50462的遥控器发射码依次为:16位数据码(用户码8位+键码 ;
;+前后两个码的间隔为22.5ms) ;
;数据码'0'是由560US的高电平加560US的低电平构成 ;
;接收时反相为500US的低电平加500US的高电平构成=1.0mS ;
;数据码'1'是由500US的高电平加1.5MS的高电平构成 ;
;接收时反相为500US的低电平加1.5MS的高电平构成=2.0mS ;
;* Version: 00 ;
;* Last Updated: 2006.06.12 ;
;* 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 ;遥控用户码8位寄存器
CSR1 EQU 2DH ;遥控器键码8位寄存器
CSR0A EQU 30H ;遥控接收16位数据暂存寄存器
CSR1A EQU 31H ;遥控接收16位数据暂存寄存器
;**************************************************
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 10
MOVWF CNT1 ;10*256*10us
CLRF CNT2
CLRF CNT0
RCV1:
MOVLW 170 ;低电平大于256-170=86*10US=860US错误
MOVWF CNT0
RCV1_HI:
GOTO $+1
NOP
BTFSC PORTB,RMT
INCF CNT3,1
BTFSS PORTB,RMT
CLRF CNT3
BTFSC CNT3,2 ;高电平大于8*10US=80US则为有效高电平
GOTO RCV11
INCFSZ CNT0,1
GOTO RCV1_HI ;低电平大于700US则是错误的
GOTO LOOP
;*************************************************
RCV11:
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 RCV11
DECFSZ CNT1,1
GOTO RCV11
GOTO LOOP ;高电平大于10*256*10US=25.6MS则是错误的
;**************************************************
RCV4:
MOVLW 4
SUBWF CNT1,0 ;高电平小于6*256*10US=15.36MS则是错误的
BTFSC STATUS,C ;
GOTO LOOP
;-----------------------------------------
MOVLW 16
MOVWF CNT2 ;接收数据共16位,8位用户码,8位控制码
RCV5:
CLRF CNT3
MOVLW 170 ;低电平大于256-170=86*10US=860US错误
MOVWF CNT0
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
MOVLW 60
MOVWF CNT1 ;高电平大于256-60=196*10US=1.96MS错误
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-60=196*10US=1.96MS错误
GOTO LOOP
;-------------------------------------
COMPARE:
MOVLW 170
SUBWF CNT0,1 ;CNT0的值减初始值等于实际低电平计数值
MOVLW 60
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 ;时间在860US-1.3MS之间则是0
GOTO MOVDATA ;送数
;----------------------------------------
COMPARE_H:
MOVLW 150
SUBWF CNT0,0
BTFSS STATUS,C ;
GOTO LOOP ;小于150*10US=1.5MS,则错误
MOVLW 230
SUBWF CNT0,0
BTFSC STATUS,C ;
GOTO LOOP ;大于230*10US=2.3MS,则错误
BSF FLAGS2,BITIN ;时间在1.5MS-2.3MS之间则是1
;----------------------------------------
MOVDATA:
RLF CSR0A,1 ;将每一位移入相应寄存器
RLF CSR1A,1
BCF CSR0A,0
BTFSC FLAGS2,BITIN ;接收当前位送入CSR0.0
BSF CSR0A,0
DECFSZ CNT2,1 ;是否接收完16位
GOTO RCV5
;----------------------------------------
MOVFW CSR1A ;将临时寄存器中的数存回相应寄存器
MOVWF CSR0 ;
MOVFW CSR0A ;
MOVWF CSR1 ;
;**********************************************
MOVLW 00H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S2 ;
MOVLW 10H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S3 ;
MOVLW 08H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S4 ;
MOVLW 80H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S5 ;
MOVLW 90H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S6 ;
MOVLW 88H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S7 ;
MOVLW 40H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S8 ;
MOVLW 50H ;
SUBWF CSR1,W ;
BTFSC STATUS,Z ;
GOTO S9 ;
MOVLW 48H ;
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 ;
;*************************************************************
;5-13=E200 5-14=E210 5-15=E208 5-16=E218 ;
;5-17=E204 5-18=E214 5-19=E20C 5-20=E21C ;
;6-13=E280 6-14=E290 6-15=E288 6-16=E298 ;
;6-17=E284 6-18=E294 6-19=E28C 6-20=E29C ;
;7-13=E240 7-14=E250 7-15=E248 7-16=E258 ;
;7-17=E244 7-18=E254 7-19=E24C 7-20=E25C ;
;8-13=E2C0 8-14=E2D0 8-15=E2C8 8-16=E2D8 ;
;8-17=E2C4 8-18=E2D4 8-19=E2CC 8-20=E2DC ;
;9-13=E220 9-14=E230 9-15=E228 9-16=E238 ;
;9-17=E224 9-18=E254 9-19=E22C 9-20=E23C ;
;10-13=E2A0 10-14=E2B0 10-15=E2A8 10-16=E2B8 ;
;10-17=E2A4 10-18=E2B4 10-19-E2AC 10-20=E2BC ;
;11-13=E260 11-14=E270 11-15=E268 11-16=E278 ;
;11-17=E264 11-18=E274 11-19=E26C 11-20=E27C ;
;12-13=E2E0 12-14=E2F0 12-15=E2E8 12-16=E2F8 ;
;12-17=E2E4 12-18=E2F4 12-19=E2EC 12-20=E2FC ;
;*************************************************************