Advertisement
miyago

Untitled

Feb 22nd, 2018
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "p18F4520.inc"
  2.    
  3.     CONFIG OSC = HS
  4.     CONFIG PWRT = OFF
  5.     CONFIG WDT = OFF
  6.     CONFIG PBADEN = OFF
  7.     CONFIG LVP = OFF
  8.  
  9.     org 0x000000
  10.    
  11. PORST   GOTO MAIN             ; gå till main
  12.    
  13.     org 0x000020
  14.    
  15. IC8COL  equ 0x002             ;Håller reda på keyboard kolumner
  16. IKTEMP  equ 0x003
  17. IKPREV  equ 0x004
  18. IKTIME  equ 0x005
  19. TMP     equ 0x006             ;Används för att kontrollera vilken tangent som tryckts
  20. VARL    equ 0x007             ;loop variabel
  21. VARL2   equ 0x008             ;loop variabel
  22. LAST    equ 0x009 ;lägga saker i , vad ska visas i
  23. IDSHORT equ 0x07E
  24. IDLONG  equ 0x07F
  25.    
  26. EC8COLQ MOVF    IC8COL,W ; sparar vilken kolumen som är tänd
  27.         RETURN
  28.    
  29. EC8NXTQ INCF    IC8COL,W ; ta det som finns i IC(COL och ökar med ett  och lägg i Wreg
  30.         BTFSC   WREG,2 ; Kolla om vi har nått kolumn 5 ( 0x04 )  0x00 = Kolumn 1 0x01 = kolumn 2 0x02 = kolumn 3 0x03 = kolumn 4
  31.         CLRF    WREG
  32.         RETURN
  33.    
  34. ;***********************************************************************
  35. WAIT        MOVLW  0xFF ;Loop funtionen
  36.             MOVWF  VARL ;Ge värdet 0xff
  37. LOOP2       MOVLW  0xFF
  38.             MOVWF  VARL2
  39. LOOP1       decfsz VARL2,1 ;Minska VARL2 med 1 och kontrollera om det är 0, om 0 hoppa över en rad
  40.             GOTO   LOOP1 ;Om det inte är 0 gå tillbaka till LOOP1
  41.             decfsz VARL,1 ;Minska VARL med 1 och kontrollera om det är 0, om 0 hoppa över en rad
  42.             goto   LOOP2 ;Om det inte är 0 gå tillbaka till LOOP2
  43.  
  44.             RETURN
  45.        
  46.        
  47. ;*********************************************************************     
  48.     ;Vad som händer efter varje kolumn switch
  49.    
  50. EC8NEXT CALL    EC8NXTQ        ; Kommer tillbaka med rätt kolumn i WREG 0x00, 0x01, 0x02 eller 0x03
  51.         MOVWF   IC8COL         ; spara vilken kolomn är vi
  52.         RLNCF   WREG            ; 0x02 x 2 = 0x04
  53.         RLNCF   WREG            ; 0x000024 PC    0x04 x 2 = 0x08
  54.         ADDWF   PCL             ; 0x000026 PC  + 0x08 = 0x00002E  0xAddera i PCU, PCH, PCL 0x000000 , bestämmer vad i progmmet o plussar ett tal (PC counter)
  55.         BSF     PORTA,RA1        ; 2 instruktioner 0x000028
  56.         RETURN                    ; 2 instruktioner    0x00002A
  57.         BSF     PORTA,RA2        ; 2 instruktioner    0x00002C
  58.         RETURN                    ; 2 instruktioner    0x00002E
  59.         BSF     PORTA,RA3        ; 2 instruktioner    0x000030
  60.         RETURN                    ; 2 instruktioner    0x000032
  61.         BSF     PORTA,RA5        ; 2 instruktioner    0x000034
  62.         RETURN                    ; 2 instruktioner    0x000036
  63.    
  64. ;************************************************************************
  65.     ;Släcker alla kolumner portA
  66. EC8FREE BCF PORTA,RA1
  67.         BCF PORTA,RA2
  68.         BCF PORTA,RA3
  69.         BCF PORTA,RA5
  70.         CLRF    PORTD
  71.         RETURN
  72.  
  73. ;*********************************************************************************     
  74.     ;Sätter portB som hör till tangenterna som input
  75. EKINIT  BSF     TRISB,RB0
  76.         BSF     TRISB,RB2
  77.         BSF     TRISB,RB4
  78.         BSF     TRISB,RB5
  79.         SETF    IKPREV 
  80.         CLRF    IKTIME
  81.         RETURN
  82.    
  83.                                                  
  84.     ;Funktion som returnerar tangenten som tryckts till WREG
  85.  ;******************************************                                                
  86. EKDOWNQ CALL    EC8COLQ         ;    b'0000 0001' hämtar vilke kolumn som står på tur i WREG
  87.         DECFSZ  WREG ; om det 0 hoppa till nästa rad
  88.         GOTO    LKDOWNQ
  89.         DCFSNZ  IKTIME
  90.         INCF    IKTIME
  91.  
  92. ;***********************************************************
  93. ; Vilken knapp är det (row)?  
  94. LKDOWNQ SETF    WREG        ; FF
  95.         BTFSS   PORTB,RB0  ;Vilken rad (Test bit b of register f, where b=0 to, skip if set
  96.         CLRF    WREG        ; 0x00 i WREG
  97.         BTFSS   PORTB,RB2
  98.         MOVLW   0x01        ; 0x01 i WREG
  99.         BTFSS   PORTB,RB4
  100.         MOVLW   0x02        ; 0x02 i WREG
  101.         BTFSS   PORTB,RB5
  102.         MOVLW   0x03        ; 0x03 i WREG
  103.         BTFSC   WREG,7        ; 0xFF = kommer tillbaka till mainloopen
  104.         RETURN
  105.         MOVWF   IKTEMP ; sparas
  106.         CALL    EC8COLQ  ;Vilken kolumn som vi har tänd
  107.         RLNCF   WREG        ; 0000 0cc0
  108.         RLNCF   WREG        ; 0000 cc00
  109.         IORWF   IKTEMP      ; 0000 ccrr ex 0000 0110 = column 2 och rad 3
  110.         MOVF    IKPREV,W    ; WREG = 1111 1111; vilken knap tryckte i förre knap
  111.         XORWF   IKTEMP,W    ; 0000 ccrr XOR 1111 1111 = 1111 1001
  112.         BNZ     LKNEW       ; Hoppa om status,Z != 1 Hoppas om ny knapp
  113.  
  114.         MOVF    IKTEMP,W    ;Blir samma tangent intryckt vänta lite tills man kan göra det igen
  115.         DECFSZ  IKTIME
  116.         SETF    WREG
  117.         RETURN
  118.    
  119. LKNEW   MOVF    IKTEMP,W
  120.         MOVWF   IKPREV
  121.         CLRF    IKTIME
  122.         RETURN
  123.    
  124. ;*********************************************
  125.                           ;Vilken knapp blev intryckt och vad ska hända?
  126. CHECKW  MOVWF   TMP             ; sparas den knapp som tryckt ex 0000 0110 = 0x06
  127.         XORLW   0xFF ;
  128.         BTFSC   STATUS,Z
  129.         GOTO    DEFAULT         ;Om ingen knapp blir intryckt fortsätt lysa
  130.         MOVF    TMP,W
  131.         XORLW   0x00   
  132.         BTFSC   STATUS,Z
  133.         GOTO    ZERO
  134.         MOVF    TMP,W
  135.         XORLW   0x01
  136.         BTFSC   STATUS,Z
  137.         GOTO    ONE
  138.         MOVF    TMP,W
  139.         XORLW   0x02
  140.         BTFSC   STATUS,Z
  141.         GOTO    TWO
  142.         MOVF    TMP,W
  143.         XORLW   0x03
  144.         BTFSC   STATUS,Z
  145.         GOTO    THREE
  146.         MOVF    TMP,W
  147.         XORLW   0x04
  148.         BTFSC   STATUS,Z
  149.         GOTO    FOUR
  150.         MOVF    TMP,W
  151.         XORLW   0x05
  152.         BTFSC   STATUS,Z
  153.         GOTO    FIVE
  154.         MOVF    TMP,W
  155.         XORLW   0x06
  156.         BTFSC   STATUS,Z
  157.         GOTO    SIX
  158.         MOVF    TMP,W
  159.         XORLW   0x07
  160.         BTFSC   STATUS,Z
  161.         GOTO    SEVEN
  162.         MOVF    TMP,W
  163.         XORLW   0x08
  164.         BTFSC   STATUS,Z
  165.         GOTO    EIGHT
  166.         MOVF    TMP,W
  167.         XORLW   0x09
  168.         BTFSC   STATUS,Z
  169.         GOTO    NINE
  170.         MOVF    TMP,W
  171.         XORLW   0x0A
  172.         BTFSC   STATUS,Z
  173.         GOTO    TEN
  174.         MOVF    TMP,W
  175.         XORLW   0x0B
  176.         BTFSC   STATUS,Z
  177.         GOTO    ELEVEN
  178.         MOVF    TMP,W
  179.         XORLW   0x0C
  180.         BTFSC   STATUS,Z
  181.         GOTO    TWELVE
  182.         MOVF    TMP,W
  183.         XORLW   0x0D
  184.         BTFSC   STATUS,Z
  185.         GOTO    THIRTEEN
  186.         MOVF    TMP,W
  187.         XORLW   0x0E
  188.         BTFSC   STATUS,Z
  189.         GOTO    FOURTEEN
  190.         MOVF    TMP,W
  191.         XORLW   0x0F
  192.         BTFSC   STATUS,Z
  193.         GOTO    FIFTEEN
  194.         RETURN
  195. DEFAULT MOVFF   LAST,PORTD
  196.         BSF     PORTA,RA1
  197.         RETURN
  198. ZERO    MOVLW   B'00111111'
  199.         MOVWF   PORTD
  200.         MOVWF   LAST
  201.         BSF     PORTA,RA1
  202.         RETURN
  203. ONE     MOVLW   B'00000110'
  204.         MOVWF   PORTD
  205.         MOVWF   LAST
  206.         BSF     PORTA,RA1
  207.         RETURN
  208. TWO     MOVLW   B'01011011'
  209.         MOVWF   PORTD
  210.         MOVWF   LAST
  211.         BSF     PORTA,RA1
  212.         RETURN
  213. THREE   MOVLW   B'01001111'
  214.         MOVWF   PORTD
  215.         MOVWF   LAST
  216.         BSF     PORTA,RA1
  217.         RETURN
  218. FOUR    MOVLW   B'01100110'
  219.         MOVWF   PORTD
  220.         MOVWF   LAST
  221.         BSF     PORTA,RA1
  222.         RETURN
  223. FIVE    MOVLW   B'01101101'
  224.         MOVWF   PORTD
  225.         MOVWF   LAST
  226.         BSF     PORTA,RA1
  227.         RETURN
  228. SIX     MOVLW   B'01111101'
  229.         MOVWF   PORTD
  230.         MOVWF   LAST
  231.         BSF     PORTA,RA1
  232.         RETURN
  233. SEVEN   MOVLW   B'00000111'
  234.         MOVWF   PORTD
  235.         MOVWF   LAST
  236.         BSF     PORTA,RA1
  237.         RETURN
  238. EIGHT   MOVLW   B'01111111'
  239.         MOVWF   PORTD
  240.         MOVWF   LAST
  241.         BSF     PORTA,RA1
  242.         RETURN
  243. NINE    MOVLW   B'01101111'
  244.         MOVWF   PORTD
  245.         MOVWF   LAST
  246.         BSF     PORTA,RA1
  247.         RETURN
  248. TEN     MOVLW   B'01110111'
  249.         MOVWF   PORTD
  250.         MOVWF   LAST
  251.         BSF     PORTA,RA1
  252.         RETURN
  253. ELEVEN  MOVLW   B'01111100'
  254.         MOVWF   PORTD
  255.         MOVWF   LAST
  256.         BSF     PORTA,RA1
  257.         RETURN
  258. TWELVE  MOVLW   B'00111001'
  259.         MOVWF   PORTD
  260.         MOVWF   LAST
  261.         BSF     PORTA,RA1
  262.         RETURN
  263. THIRTEEN MOVLW  B'01011110'
  264.         MOVWF   PORTD
  265.         MOVWF   LAST
  266.         BSF     PORTA,RA1
  267.         RETURN
  268. FOURTEEN MOVLW  B'01111001'
  269.         MOVWF   PORTD
  270.         MOVWF   LAST
  271.         BSF     PORTA,RA1
  272.         RETURN
  273. FIFTEEN MOVLW   B'01110001'
  274.         MOVWF   PORTD
  275.         MOVWF   LAST
  276.         BSF     PORTA,RA1
  277.         RETURN
  278.  
  279. ED10MS  CLRF    IDSHORT
  280.         MOVLW   0x0D
  281.         MOVWF   IDLONG
  282. LDLOOP DECFSZ   IDSHORT
  283.         GOTO    LDLOOP
  284.         DECFSZ  IDLONG
  285.         GOTO    LDLOOP
  286.         RETURN
  287.    
  288. ;******************* RIKTNING PÅ PORTA/D
  289. RIKT_PORT       BCF     TRISA,RA1           ;PORTA på output
  290.                 BCF     TRISA,RA2
  291.                 BCF     TRISA,RA3
  292.                 BCF     TRISA,RA5
  293.                 CLRF    TRISD                   ; PORTD på output
  294.                                        
  295. ;****************************************************                                        
  296.                                        
  297.                                        
  298. MAIN    CALL    RIKT_PORT                              
  299.         CLRF    LAST                    ;
  300.         CALL    EC8FREE                 ; Släcker alla kolumner RA5, RA3-1 och PORTD
  301.        
  302.         CALL    EKINIT                
  303.                                        
  304.         CLRF    IC8COL
  305.                                        
  306. LOOP    CALL    EC8NEXT    ; Tänder nästa PORTA
  307.         CALL    EKDOWNQ      ; kolla vilken knapp är tryckk
  308.         CALL    EC8FREE
  309.         CALL    CHECKW     ; visas i 7 segment
  310.         CALL    ED10MS       ; Delay
  311.         CALL    EC8FREE, Släcker
  312.         GOTO    LOOP
  313.         END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement