miyago icon

Untitled

miyago | PRO | 02/22/18 10:00:41 AM UTC | 0 ⭐ | 12647 👁️ | Never ⏰ | []
ASM (NASM) |

0 B

|

None

|

0 👍

/

0 👎

#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

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎