Advertisement
Chain_L

Untitled

May 30th, 2022
1,513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;---------------------------------------------------------------------
  2. P5      EQU 0F8h        ; adres P5 w obszarze SFR
  3. P7      EQU 0DBh        ; adres P7 w obszarze SFR
  4. ;---------------------------------------------------------------------
  5. ROWS        EQU P5      ; wiersze na P5.7-4
  6. COLS        EQU P7      ; kolumny na P7.3-0
  7. ;---------------------------------------------------------------------
  8. LEDS        EQU P1      ; diody LED na P1 (0=ON)
  9. ;---------------------------------------------------------------------
  10.  
  11. ORG 0
  12.     mov     LEDS, #11111111b                ;wylaczenie ledΓ³w
  13.  
  14. main_loop:
  15.     lcall   kbd_read
  16.     lcall   kbd_display
  17.     sjmp    main_loop
  18.  
  19. ;---------------------------------------------------------------------
  20. ; Uaktywnienie wybranego wiersza klawiatury
  21. ;
  22. ; Wejscie: A - numer wiersza (0 .. 3)
  23. ;---------------------------------------------------------------------
  24. kbd_select_row:
  25.     orl     ROWS,   #11110000b              ;ustawienie stanu niskiego
  26.     cjne    A,      #4,     check_carry     ;sprawdzenie czy A jest niewieksze niz 3
  27. check_carry:
  28.     jc      set_row                         ;jest wieksze niz 3 -> nie wystepuje carry, w przeciwnym razie jest
  29.     ret
  30. set_row:
  31.     mov     DPTR, #k_code                   ;tutaj powinien byc kod wiersza (od 0 do 3)
  32.     movc    A,  @A+DPTR                     ;wpisanie do akumulatora wartosci z adresu A+DPTR
  33.     anl     ROWS,   A                       ;dajemy "sygnal", ktory klawisz jest poprawny
  34.     ret
  35.  
  36. ;---------------------------------------------------------------------
  37. ; Odczyt wybranego wiersza klawiatury
  38. ;
  39. ; Wejscie: A  - numer wiersza (0 .. 3)
  40. ; Wyjscie: CY - stan wiersza (0 - brak klawisza, 1 - wcisniety klawisz)
  41. ;      A  - kod klawisza (0 .. 3)
  42. ;---------------------------------------------------------------------
  43. kbd_read_row:
  44.     lcall   kbd_select_row                  ;uaktywnienie wybranego wiersza
  45.  
  46.     mov     A,  COLS                        ;przekazanie
  47.     orl     A,  #11110000b
  48.     jz      kbd_read_row_none
  49.    
  50.     mov     R1, #0
  51.     mov     A,  #00001000b                  ;wartosc do odczytow aktywnych klawiszy
  52.    
  53. kbd_read_row_loop:
  54.     push    ACC
  55.     anl     A,  COLS                        ;sprawdzenie klawiszy
  56.     jz      kbd_read_row_exist              ;jezeli sie zgadza -> przeskok do etykiety
  57.     pop     ACC
  58.     rr      A                               ;bedzie sprawdzana kolejna wartosc (przesunieta o 1 w prawo)
  59.     anl     A,  #00001111b                  ;wyzerowanie pierwszych 4 bitΓ³w akumulatora
  60.     inc     R1                              ;inkrementacja R1 - sprawdzanie nastepnego klawisza
  61.     jnz     kbd_read_row_loop               ;powtorzenie petli
  62.    
  63.    
  64. kbd_read_row_none:
  65.     clr     C
  66.     ret
  67.    
  68.    
  69. kbd_read_row_exist:
  70.     pop     ACC
  71.     mov     A,  R1                          ;akumulator przechowuje numer klawisza
  72.     setb    C                               ;ustawienie wartosci carry na 1
  73.     ret
  74.  
  75. ;---------------------------------------------------------------------
  76. ; Odczyt calej klawiatury
  77. ;
  78. ; Wyjscie: CY - stan klawiatury (0 - brak klawisza, 1 - wcisniety klawisz)
  79. ;      A - kod klawisza (0 .. 15)
  80. ;---------------------------------------------------------------------
  81. kbd_read:
  82.     mov     R0, #0                      ;przechowujemy numer wiersza
  83.    
  84. kbd_read_loop:
  85.     mov     A,  R0
  86.     lcall   kbd_read_row
  87.     jc      kbd_read_found
  88.  
  89.     inc     R0
  90.     cjne    R0, #4, kbd_check
  91.  
  92. kbd_check:
  93.     jc      kbd_read_loop
  94.    
  95.     clr     C
  96.     ret
  97. kbd_read_found:
  98.     mov     R1, A
  99.     mov     A,  R0
  100.     rl      A                           ;pomnozenie wiersza x2
  101.     rl      A                           ;pomnozenie wiersza x2 (x4 calkowicie)
  102.     add     A,  R1                      ;nr wiersza *4 + nr kolumny
  103.     setb    C
  104.    
  105.     ret
  106.  
  107. ;---------------------------------------------------------------------
  108. ; Wyswietlenie stanu klawiatury
  109. ;
  110. ; Wejscie: CY - stanu klawiatury (0 - brak klawisza, 1 - wcisniety klawisz)
  111. ;      A  - kod klawisza (0 .. 15)
  112. ;---------------------------------------------------------------------
  113. kbd_display:
  114.     jc      leds_on                         ;klawisz wcisniety = uruchomienie etykiety
  115.     mov     LEDS,   #11111111b              ;wylaczenie wszystkich diod
  116.     ret
  117.    
  118. leds_on:
  119.     cpl     A                              
  120.     clr     ACC.7                           ;wlaczenie najstarszej diody
  121.     mov     LEDS,   A
  122.    
  123.     ret
  124.  
  125. ;---------------------------------------------------------------------
  126. ; Kody wierszy
  127. ;---------------------------------------------------------------------
  128. k_code:
  129.     db  01111111b
  130.     db  10111111b
  131.     db  11011111b
  132.     db  11101111b
  133. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement