All pastes #45016 Raw Edit

Someone

public text v1 · immutable
#45016 ·published 2006-03-09 10:45 UTC
rendered paste body
;**************************************************************
; REMOCL06.ASM 17 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)
;
; Inputs are according to prototype board
;
;**************************************************************

        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     0x00            ; Address of RESET Vector
OSC_FREQ        EQU     D'429000'       ; Oscillator Frequency is 429 kHz
STOP            EQU     7
PLAY            EQU     6
VOLU            EQU     5
PREV            EQU     4
VOLD            EQU     3
NEXT            EQU     2

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

                BSF     PORTA,4         ; Make Ring2 High

                BSF     INTCON,GIE      ; Enable global interrupt
LOOP
                BSF     INTCON,RBIE     ; Enable interrupt on RB port change
                SLEEP                   ; Go to sleep
                GOTO    LOOP

;**************************************************************
; Wake from Keypress
;**************************************************************

WAKE
                BCF     INTCON,RBIF     ; Clear Change on PortB flag

                MOVLW   0xFE            ; databyte[7..0] = {1,1,1,1,1,1,1,0};
                MOVWF   DATABYTE

                MOVF    PORTB,0         ; keypad[7..0] = PORTB[7..0];
                MOVWF   KEYPAD

                BTFSC   KEYPAD,VOLD

                BTFSS   KEYPAD,PLAY     ; databyte[1] = 1 if key PLAY pressed;
                BCF     DATABYTE,1

                BTFSS   KEYPAD,STOP     ; databyte[2] = 1 if key STOP pressed;
                BCF     DATABYTE,2

                BTFSS   KEYPAD,VOLD
                BTFSS   KEYPAD,PREV     ; databyte[3] = 1 if key PREV pressed;
                BCF     DATABYTE,3

                BTFSS   KEYPAD,NEXT     ; databyte[4] = 1 if key NEXT pressed;
                BCF     DATABYTE,4

                BTFSS   KEYPAD,NEXT
                BTFSS   KEYPAD,VOLU     ; databyte[5] = 1 if key VOL+ pressed;
                BCF     DATABYTE,5

                BTFSS   KEYPAD,VOLD     ; databyte[6] = 1 if key VOL- pressed;
                BCF     DATABYTE,6

                CALL    PUTCHAR

DEBOUNCE        CALL    WAIT10MS        ; Debounce
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                CALL    WAIT10MS
                RETFIE

;**************************************************************
; Subroutine PUTCHAR
; Output the RS232 Character
;**************************************************************

PUTCHAR         ; databyte[7..0] = { 1,VOL-,VOL+,NEXT,PREV,STOP,PLAY,0};
   
                MOVLW   0x08
                RLF     DATABYTE,1
                MOVWF   BITCOUNT
MORE
                RRF     DATABYTE,1
                NOP
                NOP
                SWAPF   DATABYTE,0      ; W[4] = databyte[0]    
                NOP
                NOP
                MOVWF   PORTA           ; PORTA[4] = W[4]
                NOP
                NOP
                DECFSZ  BITCOUNT,1
                GOTO    MORE

; CHECK CORRECT DELAY!!! Need 11 cycles total per bit for 9600 baud (approx...)

                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