#include "p18F4520.inc" CONFIG OSC = HS CONFIG PWRT = OFF CONFIG WDT = OFF CONFIG PBADEN = OFF CONFIG LVP = OFF ORG 0x000000 PORST GOTO MAIN ORG 0x000020 ;*** DELAY ROUTINE ************************************************************* IDSHORT equ 0x07E IDLONG equ 0x07F ED80MS CLRF IDSHORT CLRF IDLONG BRA LDLOOP ED10MS CLRF IDSHORT ; 1 MOVLW 0X20 ; 1 MOVWF IDLONG ; 1 LDLOOP DECFSZ IDSHORT ; 1 GOTO LDLOOP ; 2 DECFSZ IDLONG ; 1 GOTO LDLOOP ; 2 RETURN ;*** END OF DELAY ROUTINE*[1+1+1+((256x3)x32)+32*x3]**************************** ;*******COL toolbox 1.1 AC****** IC8COL equ 0x3 EC8INIT BCF TRISA,1 ; A1 Out for Col 1 BCF TRISA,2 ; A2 Out for Col 2 BCF TRISA,3 ; A3 Out for Col 3 BCF TRISA,5 ; A5 Out for Col 4 BCF TRISE,0 ; E0 Out for Col 5 BCF TRISE,1 ; E1 Out for Col 6 BCF TRISE,2 ; E2 Out for Col 7 BCF TRISC,0 ; C0 Out for Col 8 CLRF IC8COL ; Börja på Col1 CALL EC8FREE ; Turn off Col 1-8 RETURN EC8COLQ MOVF IC8COL,W ; Returns current Col RETURN EC8NXTQ INCF IC8COL,W ; Return next Col BTFSC WREG, 3 ; Kolla om vi nått Col8 CLRF WREG ; Börja om om vi var på Col8 RETURN EC8FREE BCF PORTA,1 ; Stänger av alla portar BCF PORTA,2 BCF PORTA,3 BCF PORTA,5 BCF PORTE,0 BCF PORTE,1 BCF PORTE,2 BCF PORTC,0 RETURN EC8NEXT CALL EC8NXTQ ; Gå till nästa column MOVWF IC8COL RLNCF WREG RLNCF WREG ADDWF PCL BSF PORTA,1 RETURN BSF PORTA,2 RETURN BSF PORTA,3 RETURN BSF PORTA,5 RETURN BSF PORTE,0 RETURN BSF PORTE,1 RETURN BSF PORTE,2 RETURN BSF PORTC,0 RETURN ;*******NO MORE TOOLBOX******** ;**************************************************** ;***LCD toolbox************************************** ;******Credit to A.C********************************* ;**************************************************** ELINIT CLRF TRISD ; LCD DATA D0-D7 Output BCF TRISB,1 ; LCD enable B1 BCF TRISB,3 ; LCD RS B3 BCF PORTB,1 ; Enable low RETURN ELWRCMD BCF PORTB,3 ; Control write MOVWF PORTD ; What to write BSF PORTB,1 ; Write! BCF PORTB,1 ; Done! RETURN ELWRCHR BSF PORTB,3 ; Data write MOVWF PORTD ; data incoming BSF PORTB,1 ; Write it! BCF PORTB,1 ; done! RETURN ;**************************************************** ;***** LCD toolbox*********************************** ;**************************************************** ILDCNT equ 0x0F0 ELKINIT SETF ILDCNT ELWRMSG INCFSZ ILDCNT RETURN SETF ILDCNT TBLRD*+ MOVF TABLAT,W BTFSS STATUS,N GOTO ELWRCHR ; Write the char! INFSNZ WREG GOTO LLNULL ; Null char INFSNZ WREG GOTO LLESCCH ; Escape char LOADMSG TBLRD*+ MOVFF TABLAT,FSR1L CLRF FSR1H MOVF INDF1,W ADDLW '0' GOTO ELWRCHR LLESCCH TBLRD*+ MOVLW 0x80 MOVWF ILDCNT MOVF TABLAT,W GOTO ELWRCMD LLNULL DECF TBLPTRL RETURN ;**********END OF LCD TOOLBOX*********************** ELTINIT MOVLW upper(LCDMSG) MOVWF TBLPTRU MOVLW high(LCDMSG) MOVWF TBLPTRH MOVLW low(LCDMSG) MOVWF TBLPTRL RETURN ETCKN MOVLW upper(LCDCHR) MOVWF TBLPTRU MOVLW high(LCDCHR) MOVWF TBLPTRH MOVLW low(LCDCHR) MOVWF TBLPTRL RETURN ;***************************************************** ;**************KEYBOARD******************************* ;****************************************************************************** IKTEMP equ 0x003 IKPREV equ 0x004 IKTIME equ 0x005 EKINIT BSF TRISB,0 BSF TRISB,2 BSF TRISB,4 BSF TRISB,5 SETF IKPREV CLRF IKTIME RETURN EKDOWNQ CALL EC8COLQ DECFSZ WREG GOTO LKDOWNQ DCFSNZ IKTIME INCF IKTIME LKDOWNQ SETF WREG ;Anta att ingen knappt är tryckt BTFSS PORTB,0 ;Är en knapp på kolumn 0 tryckt? CLRF WREG ; Spara 0 i WREG BTFSS PORTB,2 ;Är en knapp på kolumn 1 tryckt? MOVLW 0x01 ; Spara 1 i WREG BTFSS PORTB,4 ;Är en knapp på kolumn 2 tryckt? MOVLW 0x02 ; Spara 2 i WREG BTFSS PORTB,5 ;Är en knapp på kolumn 3 tryckt? MOVLW 0x03 ; Spara 3 i WREG BTFSC WREG,7 ; RETURN MOVWF IKTEMP ; Spara kolumnen för knappen tryckt 0000 0001 CALL EC8COLQ ; Kolla raden den var i 0000 0001 RLNCF WREG RLNCF WREG ; 0000 0100 IORWF IKTEMP ; Spara den! 0000 0101 MOVF IKPREV,W XORWF IKTEMP,W ; Är det samma knapp igen? BNZ LKNEW ; Ny knapp = branch! MOVF IKTEMP,W ; Om det är samma knapp så spara den här DECFSZ IKTIME SETF WREG RETURN LKNEW MOVF IKTEMP,W ; Ny knapp är tryckt! MOVWF IKPREV ; Spara det! CLRF IKTIME ; Återställä räknare RETURN ;*************END KEY TOOLBOX********************************* ;************************************************************ SYMBOL equ 0x0003 DOIT MOVFF PLUSW0, SYMBOL CALL ED80MS CALL ETCKN RETURN ;****************************************************** ;***********Loading FST with 7 segment chars*********** ;******************0-9, A-F**************************** ELDFSR LFSR 0, 0x020 MOVLW 0x00 ;Siffran 0 MOVWF POSTINC0 MOVLW 0x01 ;Siffran 1 MOVWF POSTINC0 MOVLW 0x02 ;Siffran 2 MOVWF POSTINC0 MOVLW 0x03 ;Siffran 3 MOVWF POSTINC0 MOVLW 0x04 ;Siffran 4 MOVWF POSTINC0 MOVLW 0x05 ;Siffran 5 MOVWF POSTINC0 MOVLW 0x06 ;Siffran 6 MOVWF POSTINC0 MOVLW 0x07 ;Siffran 7 MOVWF POSTINC0 MOVLW 0x08 ;Siffran 8 MOVWF POSTINC0 MOVLW 0x09 ;Siffran 9 MOVWF POSTINC0 MOVLW 0x10 ;Bokstaven A MOVWF POSTINC0 MOVLW A'B' ;Bokstaven b MOVWF POSTINC0 MOVLW A'C' ;Bokstaven c MOVWF POSTINC0 MOVLW A'D' ;Bokstaven d MOVWF POSTINC0 MOVLW A'E' ;Bokstaven E MOVWF POSTINC0 MOVLW A'F' ;Bokstaven F MOVWF POSTINC0 RETURN ;***********MAIN PROGRAM*************************** MAIN CALL ELTINIT CALL ELINIT CALL EC8INIT CALL EKINIT CALL ELDFSR LFSR 0,0x020 CLRF TRISD CLRF SYMBOL MLOOP CLRF PORTD CALL ELWRMSG CALL EC8NEXT CALL EKDOWNQ BTFSS WREG,7 CALL DOIT CALL ED10MS CALL EC8FREE GOTO MLOOP ;*************************************************** ;**************Användning***LCD********************* ;*************************************************** org 0x000500 LCDMSG DB 0xFE,0x38 ; Wake up! DB 0xFE,0x38 ; Wake up! DB 0xFE,0x38 ; 8-bit I/F, 2 rader DB 0xFE,0x0E ; Display on, cursor on DB 0xFE,0x06 ; Auto inc mode DB 0xFE,0x01 ; Clear display go home DB 0xFF org 0x000550 LCDCHR DB,0xFD,SYMBOL DB,0xFF END