Advertisement
krizen

Untitled

May 6th, 2020
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ljmp start
  2.  
  3. P5 equ 0F8H
  4. P7 equ 0DBH
  5.    
  6. LCDstatus  equ 0FF2EH       ; adres do odczytu gotowosci LCD
  7. LCDcontrol equ 0FF2CH       ; adres do podania bajtu sterujacego LCD
  8. LCDdataWR  equ 0FF2DH       ; adres do podania kodu ASCII na LCD
  9.  
  10. // bajty sterujace LCD, inne dostepne w opisie LCD na stronie WWW
  11. #define  HOME     0x80     // put cursor to second line  
  12. #define  INITDISP 0x38     // LCD init (8-bit mode)  
  13. #define  HOM2     0xc0     // put cursor to second line  
  14. #define  LCDON    0x0e     // LCD nn, cursor off, blinking off
  15. #define  CLEAR    0x01     // LCD display clear
  16.  
  17. // linie klawiatury - sterowanie na port P5
  18. #define LINE_1      0x7f    // 0111 1111
  19. #define LINE_2      0xbf    // 1011 1111
  20. #define LINE_3      0xdf    // 1101 1111
  21. #define LINE_4      0xef    // 1110 1111
  22. #define ALL_LINES   0x0f    // 0000 1111
  23.  
  24. org 0100H
  25.        
  26. // macro do wprowadzenia bajtu sterujacego na LCD
  27. LCDcntrlWR MACRO x          ; x – parametr wywolania macra – bajt sterujacy
  28.            LOCAL loop       ; LOCAL oznacza ze etykieta loop moze sie powtórzyc w programie
  29. loop: MOV  DPTR,#LCDstatus  ; DPTR zaladowany adresem statusu
  30.       MOVX A,@DPTR          ; pobranie bajtu z biezacym statusem LCD
  31.       JB   ACC.7,loop       ; testowanie najstarszego bitu akumulatora
  32.                             ; – wskazuje gotowosc LCD
  33.       MOV  DPTR,#LCDcontrol ; DPTR zaladowany adresem do podania bajtu sterujacego
  34.       MOV  A, x             ; do akumulatora trafia argument wywolania macra–bajt sterujacy
  35.       MOVX @DPTR,A          ; bajt sterujacy podany do LCD – zadana akcja widoczna na LCD
  36.       ENDM
  37.      
  38. // macro do wypisania znaku ASCII na LCD, znak ASCII przed wywolaniem macra ma byc w A
  39. LCDcharWR MACRO
  40.       LOCAL tutu            ; LOCAL oznacza ze etykieta tutu moze sie powtórzyc w programie
  41.       PUSH ACC              ; odlozenie biezacej zawartosci akumulatora na stos
  42. tutu: MOV  DPTR,#LCDstatus  ; DPTR zaladowany adresem statusu
  43.       MOVX A,@DPTR          ; pobranie bajtu z biezacym statusem LCD
  44.       JB   ACC.7,tutu       ; testowanie najstarszego bitu akumulatora
  45.                             ; – wskazuje gotowosc LCD
  46.       MOV  DPTR,#LCDdataWR  ; DPTR zaladowany adresem do podania bajtu sterujacego
  47.       POP  ACC              ; w akumulatorze ponownie kod ASCII znaku na LCD
  48.       MOVX @DPTR,A          ; kod ASCII podany do LCD – znak widoczny na LCD
  49.       ENDM
  50.      
  51. // macro do inicjalizacji wyswietlacza – bez parametrów
  52. init_LCD MACRO
  53.          LCDcntrlWR #INITDISP ; wywolanie macra LCDcntrlWR – inicjalizacja LCD
  54.          LCDcntrlWR #CLEAR    ; wywolanie macra LCDcntrlWR – czyszczenie LCD
  55.          LCDcntrlWR #LCDON    ; wywolanie macra LCDcntrlWR – konfiguracja kursora
  56.          ENDM
  57.  
  58. // funkcja opóznienia
  59.  
  60.     delay:  mov r1, #0FFH
  61.     dwa:    mov r2, #0FFH
  62.     trzy:   djnz r2, trzy
  63.             djnz r1, dwa
  64.             ret
  65.            
  66. // funkcja wypisania znaku
  67. putcharLCD: LCDcharWR
  68.             ret
  69.  
  70. // tablica przekodowania klawisze - ASCII w XRAM
  71.  
  72. keyascii:   mov dptr, #80EBH
  73.             mov a, #"0"
  74.             movx @dptr, a
  75.            
  76.             mov dptr, #8077H
  77.             mov a, #"1"
  78.             movx @dptr, a
  79.            
  80.             mov dptr, #807BH
  81.             mov a, #"2"
  82.             movx @dptr, a
  83.            
  84.             mov dptr, #807DH
  85.             mov a, #"3"
  86.             movx @dptr, a
  87.            
  88.             mov dptr, #80B7H
  89.             mov a, #"4"
  90.             movx @dptr, a
  91.            
  92.             mov dptr, #80BBH
  93.             mov a, #"5"
  94.             movx @dptr, a
  95.            
  96.             mov dptr, #80BDH
  97.             mov a, #"6"
  98.             movx @dptr, a
  99.            
  100.             mov dptr, #80D7H
  101.             mov a, #"7"
  102.             movx @dptr, a
  103.            
  104.             mov dptr, #80DBH
  105.             mov a, #"8"
  106.             movx @dptr, a
  107.            
  108.             mov dptr, #80DDH
  109.             mov a, #"9"
  110.             movx @dptr, a
  111.            
  112.             mov dptr, #807EH
  113.             mov a, #"A"
  114.             movx @dptr, a
  115.            
  116.             mov dptr, #80BEH
  117.             mov a, #"B"
  118.             movx @dptr, a
  119.            
  120.             mov dptr, #80DEH
  121.             mov a, #"C"
  122.             movx @dptr, a
  123.            
  124.             mov dptr, #80EEH
  125.             mov a, #"D"
  126.             movx @dptr, a
  127.            
  128.             mov dptr, #80E7H
  129.             mov a, #"*"
  130.             movx @dptr, a
  131.            
  132.             mov dptr, #80EDH
  133.             mov a, #"#"
  134.             movx @dptr, a
  135.            
  136.             ret
  137.            
  138. czy_zwolniony_klawisz MACRO
  139.             LOCAL loop
  140.            
  141.             loop:
  142.             mov a, #11111111B
  143.             mov r3, a
  144.             mov a, P7               ; przeniesienie zawartosci portu P7 do akumulatora
  145.             clr c
  146.             subb a, r3              ; jesli klawisz nie zostal odcisniety to wynik odejmowania bedzie
  147.                                     ; rozny od zera co spowoduje ponowne zapetlenie petli
  148.             jnz loop
  149.            
  150.             ENDM
  151.            
  152.  
  153. // program glówny
  154.     start:  init_LCD
  155.    
  156.             acall keyascii
  157.    
  158.     key_1: 
  159.             mov r0, #LINE_1
  160.             mov a, r0
  161.             mov P5, a
  162.             mov a, P7
  163.             anl a, r0               ; w tym miejscu jest juz kod klawisza
  164.             mov r2, a               ; zapisanie kodu znaku w rejestrze r2
  165.             clr c
  166.             subb a, r0              ; sprawdzenie czy cos zostalo nacisniete
  167.             jz key_2
  168.            
  169.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  170.                                     ; zostal juz zwolniony
  171.                                    
  172.             mov a, r2
  173.             mov dph, #80h
  174.             mov dpl, a
  175.             movx a,@dptr
  176.             mov P1, a
  177.             acall putcharLCD
  178.            
  179.     key_2:  mov r0, #LINE_2
  180.             mov a, r0
  181.             mov P5, a
  182.             mov a, P7
  183.             anl a, r0
  184.             mov r2, a
  185.             clr c
  186.             subb a, r0
  187.             jz key_3
  188.            
  189.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  190.                                     ; zostal juz zwolniony
  191.            
  192.             mov a, r2
  193.             mov dph, #80h
  194.             mov dpl, a
  195.             movx a,@dptr
  196.             mov P1, a
  197.             acall putcharLCD
  198.             acall delay
  199.            
  200.     key_3:  mov r0, #LINE_3
  201.             mov a, r0
  202.             mov P5, a
  203.             mov a, P7
  204.             anl a, r0
  205.             mov r2, a
  206.             clr c
  207.             subb a, r0
  208.             jz key_4
  209.            
  210.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  211.                                     ; zostal juz zwolniony
  212.  
  213.             mov a, r2
  214.             mov dph, #80h
  215.             mov dpl, a
  216.             movx a,@dptr
  217.             mov P1, a
  218.             acall putcharLCD
  219.             acall delay
  220.            
  221.     key_4:  mov r0, #LINE_4
  222.             mov a, r0
  223.             mov P5, a
  224.             mov a, P7
  225.             anl a, r0
  226.             mov r2, a
  227.             clr c
  228.             subb a, r0
  229.             jz key_1
  230.            
  231.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  232.                                     ; zostal juz zwolniony         
  233.            
  234.             mov a, r2
  235.             mov dph, #80h
  236.             mov dpl, a
  237.             movx a,@dptr
  238.             mov P1, a
  239.             acall putcharLCD
  240.             acall delay
  241.            
  242.             jmp key_1
  243.            
  244.          
  245.  
  246.     nop
  247.     nop
  248.     nop
  249.     jmp $
  250.     end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement