Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement