;************************************************************** ; REMOCLON.ASM 15 December 2001 ;************************************************************** ; ; This PIC16LF84 program emulates the Zilog chip inside the ; remote intended for use with the Archos Jukebox 6000 ; ; Written by Tjerk "T.J." Schuringa, hardware engineer (ouch) ; ;************************************************************** LIST P=16F84, F=INHX8M __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC #include ".\p16f84.inc" ;************************************************************** ; f_osc = 429 kHz yields cycle time of 9.32 µs ;************************************************************** ; Equates RESET_V EQU 0x0000 ; Address of RESET Vector OSC_FREQ EQU D'429000' ; Oscillator Frequency is 429 kHz VOLDN EQU 0x77 CMDVOLDN EQU 0xc0 VOLUP EQU 0x7a CMDVOLUP EQU 0xa0 PREV EQU 0xef CMDPREV EQU 0x88 NEXT EQU 0xcf CMDNEXT EQU 0x90 STOP EQU 0x7f CMDSTOP EQU 0x84 PLAY EQU 0xaf CMDPLAY EQU 0x82 ; Registers KEYPAD EQU 0x0F DATABYTE EQU 0x10 BITCOUNT EQU 0x11 WAIT EQU 0x12 ;************************************************************** ; Begin Program ;************************************************************** ORG RESET_V ; RESET vector location RESET GOTO START ORG 4 ; INT vector GOTO WAKE ;************************************************************** ; Initialization Routine ;************************************************************** START ; POWER_ON Reset (Beginning of program) CLRF STATUS ; Do initialization, Select bank 0 CLRF INTCON ; Clear int-flags, Disable interrupts BSF INTCON,GIE ; Enable Global INT, needed for wake on PORTB CLRF PCLATH ; Keep in lower 2KByte CLRF PORTA ; ALL PORT output should output Low. CLRF PORTB BSF STATUS, RP0 ; Select bank 1 MOVLW 0xff CLRF TRISA ; RA4-0 Outputs MOVWF TRISB ; RB7-0 Inputs BCF OPTION_REG, NOT_RBPU ; Enable PORTB pull-ups BCF STATUS, RP0 ; Select bank 0 SLEEP ; Go to sleep ;************************************************************** ; Wake from Keypress ;************************************************************** WAKE MOVF PORTB,0 ; Read PortB MOVWF KEYPAD ; Store keypad value MOVLW VOLDN XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTVOLDN MOVLW VOLUP XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTVOLUP MOVLW PREV XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTPREV MOVLW NEXT XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTNEXT MOVLW PLAY XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTSTOP MOVLW STOP XORWF KEYPAD BTFSC STATUS,Z ; Test if zero GOTO OUTPLAY CALL WAIT10MS ; Debounce CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS SLEEP ; There was no match ;************************************************************** ; Surely there must be a more intelligent way to solve this... ;************************************************************** OUTVOLDN MOVLW CMDVOLDN CALL PUTCHAR SLEEP OUTVOLUP MOVLW CMDVOLUP CALL PUTCHAR SLEEP OUTPREV MOVLW CMDPREV CALL PUTCHAR SLEEP OUTNEXT MOVLW CMDNEXT CALL PUTCHAR SLEEP OUTSTOP MOVLW CMDSTOP CALL PUTCHAR SLEEP OUTPLAY MOVLW CMDPLAY CALL PUTCHAR SLEEP ;************************************************************** ; Subroutine PUTCHAR ; Output the RS232 Character ;************************************************************** PUTCHAR MOVF DATABYTE MOVLW 0x07 MOVWF BITCOUNT MORE RRF DATABYTE,1 ; Rotate DATABYTE through Carry BTFSS STATUS,C ; Test Carry GOTO ZERO ONE BSF PORTA,4 ; Send a one GOTO NEXTBIT ZERO BCF PORTA,4 ; Send a zero NEXTBIT NOP NOP NOP NOP NOP DECFSZ BITCOUNT GOTO MORE ; CHECK CORRECT DELAY!!! Need 11 cycles total per bit for 9600 baud (approx...) CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS CALL WAIT10MS RETURN ;************************************************************** ; Subroutine WAIT10MS ; Wait 10 ms ;************************************************************** WAIT10MS ; Do nothing for some time (10 ms) MOVLW 0xd7 MOVWF WAIT LOOP NOP NOP DECFSZ WAIT,1 GOTO LOOP RETURN END