#include "p18F4520.inc" CONFIG OSC = HS CONFIG PWRT = OFF CONFIG WDT = OFF CONFIG PBADEN = OFF CONFIG LVP = OFF org 0x000000 PORST GOTO MAIN ; gå till main org 0x000020 IC8COL equ 0x002 ;Håller reda på keyboard kolumner IKTEMP equ 0x003 IKPREV equ 0x004 IKTIME equ 0x005 TMP equ 0x006 ;Används för att kontrollera vilken tangent som tryckts VARL equ 0x007 ;loop variabel VARL2 equ 0x008 ;loop variabel LAST equ 0x009 ;lägga saker i , vad ska visas i IDSHORT equ 0x07E IDLONG equ 0x07F EC8COLQ MOVF IC8COL,W ; sparar vilken kolumen som är tänd RETURN EC8NXTQ INCF IC8COL,W ; ta det som finns i IC(COL och ökar med ett och lägg i Wreg BTFSC WREG,2 ; Kolla om vi har nått kolumn 5 ( 0x04 ) 0x00 = Kolumn 1 0x01 = kolumn 2 0x02 = kolumn 3 0x03 = kolumn 4 CLRF WREG RETURN ;*********************************************************************** WAIT MOVLW 0xFF ;Loop funtionen MOVWF VARL ;Ge värdet 0xff LOOP2 MOVLW 0xFF MOVWF VARL2 LOOP1 decfsz VARL2,1 ;Minska VARL2 med 1 och kontrollera om det är 0, om 0 hoppa över en rad GOTO LOOP1 ;Om det inte är 0 gå tillbaka till LOOP1 decfsz VARL,1 ;Minska VARL med 1 och kontrollera om det är 0, om 0 hoppa över en rad goto LOOP2 ;Om det inte är 0 gå tillbaka till LOOP2 RETURN ;********************************************************************* ;Vad som händer efter varje kolumn switch EC8NEXT CALL EC8NXTQ ; Kommer tillbaka med rätt kolumn i WREG 0x00, 0x01, 0x02 eller 0x03 MOVWF IC8COL ; spara vilken kolomn är vi RLNCF WREG ; 0x02 x 2 = 0x04 RLNCF WREG ; 0x000024 PC 0x04 x 2 = 0x08 ADDWF PCL ; 0x000026 PC + 0x08 = 0x00002E 0xAddera i PCU, PCH, PCL 0x000000 , bestämmer vad i progmmet o plussar ett tal (PC counter) BSF PORTA,RA1 ; 2 instruktioner 0x000028 RETURN ; 2 instruktioner 0x00002A BSF PORTA,RA2 ; 2 instruktioner 0x00002C RETURN ; 2 instruktioner 0x00002E BSF PORTA,RA3 ; 2 instruktioner 0x000030 RETURN ; 2 instruktioner 0x000032 BSF PORTA,RA5 ; 2 instruktioner 0x000034 RETURN ; 2 instruktioner 0x000036 ;************************************************************************ ;Släcker alla kolumner portA EC8FREE BCF PORTA,RA1 BCF PORTA,RA2 BCF PORTA,RA3 BCF PORTA,RA5 CLRF PORTD RETURN ;********************************************************************************* ;Sätter portB som hör till tangenterna som input EKINIT BSF TRISB,RB0 BSF TRISB,RB2 BSF TRISB,RB4 BSF TRISB,RB5 SETF IKPREV CLRF IKTIME RETURN ;Funktion som returnerar tangenten som tryckts till WREG ;****************************************** EKDOWNQ CALL EC8COLQ ; b'0000 0001' hämtar vilke kolumn som står på tur i WREG DECFSZ WREG ; om det 0 hoppa till nästa rad GOTO LKDOWNQ DCFSNZ IKTIME INCF IKTIME ;*********************************************************** ; Vilken knapp är det (row)? LKDOWNQ SETF WREG ; FF BTFSS PORTB,RB0 ;Vilken rad (Test bit b of register f, where b=0 to, skip if set CLRF WREG ; 0x00 i WREG BTFSS PORTB,RB2 MOVLW 0x01 ; 0x01 i WREG BTFSS PORTB,RB4 MOVLW 0x02 ; 0x02 i WREG BTFSS PORTB,RB5 MOVLW 0x03 ; 0x03 i WREG BTFSC WREG,7 ; 0xFF = kommer tillbaka till mainloopen RETURN MOVWF IKTEMP ; sparas CALL EC8COLQ ;Vilken kolumn som vi har tänd RLNCF WREG ; 0000 0cc0 RLNCF WREG ; 0000 cc00 IORWF IKTEMP ; 0000 ccrr ex 0000 0110 = column 2 och rad 3 MOVF IKPREV,W ; WREG = 1111 1111; vilken knap tryckte i förre knap XORWF IKTEMP,W ; 0000 ccrr XOR 1111 1111 = 1111 1001 BNZ LKNEW ; Hoppa om status,Z != 1 Hoppas om ny knapp MOVF IKTEMP,W ;Blir samma tangent intryckt vänta lite tills man kan göra det igen DECFSZ IKTIME SETF WREG RETURN LKNEW MOVF IKTEMP,W MOVWF IKPREV CLRF IKTIME RETURN ;********************************************* ;Vilken knapp blev intryckt och vad ska hända? CHECKW MOVWF TMP ; sparas den knapp som tryckt ex 0000 0110 = 0x06 XORLW 0xFF ; BTFSC STATUS,Z GOTO DEFAULT ;Om ingen knapp blir intryckt fortsätt lysa MOVF TMP,W XORLW 0x00 BTFSC STATUS,Z GOTO ZERO MOVF TMP,W XORLW 0x01 BTFSC STATUS,Z GOTO ONE MOVF TMP,W XORLW 0x02 BTFSC STATUS,Z GOTO TWO MOVF TMP,W XORLW 0x03 BTFSC STATUS,Z GOTO THREE MOVF TMP,W XORLW 0x04 BTFSC STATUS,Z GOTO FOUR MOVF TMP,W XORLW 0x05 BTFSC STATUS,Z GOTO FIVE MOVF TMP,W XORLW 0x06 BTFSC STATUS,Z GOTO SIX MOVF TMP,W XORLW 0x07 BTFSC STATUS,Z GOTO SEVEN MOVF TMP,W XORLW 0x08 BTFSC STATUS,Z GOTO EIGHT MOVF TMP,W XORLW 0x09 BTFSC STATUS,Z GOTO NINE MOVF TMP,W XORLW 0x0A BTFSC STATUS,Z GOTO TEN MOVF TMP,W XORLW 0x0B BTFSC STATUS,Z GOTO ELEVEN MOVF TMP,W XORLW 0x0C BTFSC STATUS,Z GOTO TWELVE MOVF TMP,W XORLW 0x0D BTFSC STATUS,Z GOTO THIRTEEN MOVF TMP,W XORLW 0x0E BTFSC STATUS,Z GOTO FOURTEEN MOVF TMP,W XORLW 0x0F BTFSC STATUS,Z GOTO FIFTEEN RETURN DEFAULT MOVFF LAST,PORTD BSF PORTA,RA1 RETURN ZERO MOVLW B'00111111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN ONE MOVLW B'00000110' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN TWO MOVLW B'01011011' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN THREE MOVLW B'01001111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN FOUR MOVLW B'01100110' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN FIVE MOVLW B'01101101' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN SIX MOVLW B'01111101' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN SEVEN MOVLW B'00000111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN EIGHT MOVLW B'01111111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN NINE MOVLW B'01101111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN TEN MOVLW B'01110111' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN ELEVEN MOVLW B'01111100' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN TWELVE MOVLW B'00111001' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN THIRTEEN MOVLW B'01011110' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN FOURTEEN MOVLW B'01111001' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN FIFTEEN MOVLW B'01110001' MOVWF PORTD MOVWF LAST BSF PORTA,RA1 RETURN ED10MS CLRF IDSHORT MOVLW 0x0D MOVWF IDLONG LDLOOP DECFSZ IDSHORT GOTO LDLOOP DECFSZ IDLONG GOTO LDLOOP RETURN ;******************* RIKTNING PÅ PORTA/D RIKT_PORT BCF TRISA,RA1 ;PORTA på output BCF TRISA,RA2 BCF TRISA,RA3 BCF TRISA,RA5 CLRF TRISD ; PORTD på output ;**************************************************** MAIN CALL RIKT_PORT CLRF LAST ; CALL EC8FREE ; Släcker alla kolumner RA5, RA3-1 och PORTD CALL EKINIT CLRF IC8COL LOOP CALL EC8NEXT ; Tänder nästa PORTA CALL EKDOWNQ ; kolla vilken knapp är tryckk CALL EC8FREE CALL CHECKW ; visas i 7 segment CALL ED10MS ; Delay CALL EC8FREE, Släcker GOTO LOOP END