Advertisement
krizen

Untitled

May 20th, 2020
963
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 000BH                   ; obsluga przerwania
  25.     MOV TH0, #3CH           ; przeladowanie
  26.     MOV TL0, #0B0H          ; stalej timera na 50ms
  27.     DEC R0                  ; korekta licznika
  28.     RETI                    ; powrót z przerwania
  29.  
  30. org 0100H
  31.        
  32. // macro do wprowadzenia bajtu sterujacego na LCD
  33. LCDcntrlWR MACRO x          ; x – parametr wywolania macra – bajt sterujacy
  34.            LOCAL loop       ; LOCAL oznacza ze etykieta loop moze sie powtórzyc w programie
  35. loop: MOV  DPTR,#LCDstatus  ; DPTR zaladowany adresem statusu
  36.       MOVX A,@DPTR          ; pobranie bajtu z biezacym statusem LCD
  37.       JB   ACC.7,loop       ; testowanie najstarszego bitu akumulatora
  38.                             ; – wskazuje gotowosc LCD
  39.       MOV  DPTR,#LCDcontrol ; DPTR zaladowany adresem do podania bajtu sterujacego
  40.       MOV  A, x             ; do akumulatora trafia argument wywolania macra–bajt sterujacy
  41.       MOVX @DPTR,A          ; bajt sterujacy podany do LCD – zadana akcja widoczna na LCD
  42.       ENDM
  43.      
  44. // macro do wypisania znaku ASCII na LCD, znak ASCII przed wywolaniem macra ma byc w A
  45. LCDcharWR MACRO
  46.       LOCAL tutu            ; LOCAL oznacza ze etykieta tutu moze sie powtórzyc w programie
  47.       PUSH ACC              ; odlozenie biezacej zawartosci akumulatora na stos
  48. tutu: MOV  DPTR,#LCDstatus  ; DPTR zaladowany adresem statusu
  49.       MOVX A,@DPTR          ; pobranie bajtu z biezacym statusem LCD
  50.       JB   ACC.7,tutu       ; testowanie najstarszego bitu akumulatora
  51.                             ; – wskazuje gotowosc LCD
  52.       MOV  DPTR,#LCDdataWR  ; DPTR zaladowany adresem do podania bajtu sterujacego
  53.       POP  ACC              ; w akumulatorze ponownie kod ASCII znaku na LCD
  54.       MOVX @DPTR,A          ; kod ASCII podany do LCD – znak widoczny na LCD
  55.       ENDM
  56.      
  57. // macro do inicjalizacji wyswietlacza – bez parametrów
  58. init_LCD MACRO
  59.          LCDcntrlWR #INITDISP ; wywolanie macra LCDcntrlWR – inicjalizacja LCD
  60.          LCDcntrlWR #CLEAR    ; wywolanie macra LCDcntrlWR – czyszczenie LCD
  61.          LCDcntrlWR #LCDON    ; wywolanie macra LCDcntrlWR – konfiguracja kursora
  62.          ENDM
  63.          
  64. // funkcja wypisania liczby dla potrzeb zegara
  65. putdigitLCD:    mov b, #10
  66.                 div ab              ; uzyskanie cyfry dziesiatek
  67.                 add a, #30H         ; konwersja cyfry na kod ASCII
  68.                 acall putcharLCD
  69.                 mov a, b            ; ladowanie cyfry jednosci
  70.                 add a, #30H         ; konwersja na LCD
  71.                 acall putcharLCD
  72.                 ret
  73.  
  74. // funkcaj wypisywania znaku na LCD
  75. putcharLCD: LCDcharWR
  76.             ret
  77.  
  78. // wyznaczanie biezacej wartosci zegara i jego wyswietlanie na LCD
  79. ZEGAR:      INC R7              ; licznik sekund
  80.             MOV A, R7           ; obsluga sekund
  81.             CLR C
  82.             SUBB A, #60         ; przepelnienie sekund
  83.             JZ MINUTY
  84.             LCDcntrlWR #HOME    ; wyswietlenie calego zegara
  85.             MOV A, R5           ; godziny
  86.             ACALL putdigitLCD
  87.             MOV A, #":"         ; separator
  88.             ACALL putcharLCD
  89.             MOV A, R6           ; minuty
  90.             ACALL putdigitLCD
  91.             MOV A, #":"         ; separator
  92.             ACALL putcharLCD
  93.             MOV A, R7           ; sekundy
  94.             ACALL putdigitLCD
  95.             JMP FINAL
  96. MINUTY:     MOV R7, #00H        ; zerowanie sekund
  97.             INC R6              ; licznik minut
  98.             MOV A, R6           ; obsluga minut
  99.             CLR C
  100.             SUBB A, #60         ; przepelnienie minut
  101.             JZ GODZINY
  102.             LCDcntrlWR #HOME    ; wyswiwtlenie calego zegara
  103.             MOV A, R5           ; godziny
  104.             ACALL putdigitLCD
  105.             MOV A, #":"         ; separator
  106.             ACALL putcharLCD
  107.             MOV A, R6           ; minuty
  108.             ACALL putdigitLCD
  109.             MOV A, #":"         ; separator
  110.             ACALL putcharLCD
  111.             MOV A, R7           ; sekundy
  112.             ACALL putdigitLCD
  113.             JMP FINAL
  114. GODZINY:    MOV R6, #00H        ; zerowanie minut
  115.             INC R5              ; licznik godzin
  116.             MOV A, R5
  117.             CLR C
  118.             SUBB A, #24         ; przepelenienie godzin - doba
  119.             JNZ EKRAN
  120.             MOV R5, #00H        ; zerowanie godzin
  121. EKRAN:      LCDcntrlWR #HOME    ; wyswietlenie calego zegara
  122.             MOV A, R5           ; godziny
  123.             ACALL putdigitLCD
  124.             MOV A, #":"         ; separator
  125.             ACALL putcharLCD
  126.             MOV A, R6           ; minuty
  127.             ACALL putdigitLCD
  128.             MOV A, #":"         ; separator
  129.             ACALL putcharLCD
  130.             MOV A, R7           ; sekundy
  131.             ACALL putdigitLCD
  132. FINAL:      RET
  133.  
  134. // Przekodowanie kodow skaningowych cyfr z klawiatury
  135. // na odpowiednie wartosci liczbowe
  136. key_digits: mov dptr, #80EBH
  137.             mov a, #0
  138.             movx @dptr, a
  139.            
  140.             mov dptr, #8077H
  141.             mov a, #1
  142.             movx @dptr, a
  143.            
  144.             mov dptr, #807BH
  145.             mov a, #2
  146.             movx @dptr, a
  147.            
  148.             mov dptr, #807DH
  149.             mov a, #3
  150.             movx @dptr, a
  151.            
  152.             mov dptr, #80B7H
  153.             mov a, #4
  154.             movx @dptr, a
  155.            
  156.             mov dptr, #80BBH
  157.             mov a, #5
  158.             movx @dptr, a
  159.            
  160.             mov dptr, #80BDH
  161.             mov a, #6
  162.             movx @dptr, a
  163.            
  164.             mov dptr, #80D7H
  165.             mov a, #7
  166.             movx @dptr, a
  167.            
  168.             mov dptr, #80DBH
  169.             mov a, #8
  170.             movx @dptr, a
  171.            
  172.             mov dptr, #80DDH
  173.             mov a, #9
  174.             movx @dptr, a
  175.            
  176.             ret
  177.            
  178. czy_zwolniony_klawisz MACRO
  179.             LOCAL loop
  180.            
  181.             loop:
  182.             mov a, #11111111B
  183.             mov r3, a
  184.             mov a, P7               ; przeniesienie zawartosci portu P7 do akumulatora
  185.             clr c
  186.             subb a, r3              ; jesli klawisz nie zostal odcisniety to wynik odejmowania bedzie
  187.                                     ; rozny od zera co spowoduje ponowne zapetlenie petli
  188.             jnz loop
  189.            
  190.             ENDM
  191.  
  192. wczytaj_godziny:
  193.             acall wczytanie_cyfry   ; wczytujemy czesc dziesietna godziny
  194.                                     ; wynik w akumulatorze a
  195.             mov B, #10             
  196.             clr c
  197.             mul ab                  ; wykonanie mnozenia
  198.             mov R5, a
  199.             acall wczytanie_cyfry   ; wczytujemy czesc jednosci godziny
  200.                                     ; wynik w akumulatorze a
  201.             add a, R5               ; dodanie czesci jednosci
  202.             mov R5, a              
  203.             acall ZEGAR             ; wyswietlenie nowej godziny na wyswietlaczu
  204.             ret
  205.            
  206. wczytaj_minuty:
  207.             acall wczytanie_cyfry   ; wczytujemy czesc dziesietna minuty
  208.                                     ; wynik w akumulatorze a
  209.             mov B, #10             
  210.             clr c
  211.             mul ab                  ; wykonanie mnozenia
  212.             mov R5, a
  213.             acall wczytanie_cyfry   ; wczytujemy czesc jednosci minuty
  214.                                     ; wynik w akumulatorze a
  215.             add a, R5               ; dodanie czesci jednosci
  216.             mov R5, a
  217.             acall ZEGAR             ; wyswietlenie nowych minut na wyswietlaczu
  218.             ret    
  219.            
  220. wczytaj_sekundy:
  221.             acall wczytanie_cyfry   ; wczytujemy czesc dziesietna sekundy
  222.                                     ; wynik w akumulatorze a
  223.             mov B, #10             
  224.             clr c
  225.             mul ab                  ; wykonanie mnozenia
  226.             mov R5, a
  227.             acall wczytanie_cyfry   ; wczytujemy czesc jednosci sekund
  228.                                     ; wynik w akumulatorze a
  229.             add a, R5               ; dodanie czesci jednosci
  230.             mov R5, a
  231.             acall ZEGAR             ; wyswietlenie noweych sekund na wyswietlaczu
  232.             ret
  233.                
  234. wczytanie_cyfry:
  235.      one_key_1:
  236.             mov r4, #LINE_1
  237.             mov a, r4
  238.             mov P5, a
  239.             mov a, P7
  240.             anl a, r4               ; w tym miejscu jest juz kod klawisza
  241.             mov r2, a               ; zapisanie kodu znaku w rejestrze r2
  242.             clr c
  243.             subb a, r4              ; sprawdzenie czy cos zostalo nacisniete
  244.             jz one_key_2
  245.            
  246.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  247.                                     ; zostal juz zwolniony
  248.            
  249.             mov a, r2
  250.             mov dph, #80h
  251.             mov dpl, a
  252.             movx a,@dptr            ; w akumulatorze jest wartosc odpowieniego przycisku
  253.             sjmp koniec             ; konczymy wczytywanie                      
  254.            
  255.     one_key_2:  mov r4, #LINE_2
  256.             mov a, r4
  257.             mov P5, a
  258.             mov a, P7
  259.             anl a, r4
  260.             mov r2, a
  261.             clr c
  262.             subb a, r4
  263.             jz one_key_3
  264.            
  265.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  266.                                     ; zostal juz zwolniony
  267.                                    
  268.             mov a, r2
  269.             mov dph, #80h
  270.             mov dpl, a
  271.             movx a,@dptr            ; w akumulatorze jest wartosc odpowieniego przycisku
  272.             sjmp koniec             ; konczymy wczytywanie
  273.              
  274.     one_key_3:  mov r4, #LINE_3
  275.             mov a, r4
  276.             mov P5, a
  277.             mov a, P7
  278.             anl a, r4
  279.             mov r2, a
  280.             clr c
  281.             subb a, r4
  282.             jz one_key_1
  283.            
  284.             czy_zwolniony_klawisz   ; wstawienie makra, sprawdzajacego czy klawisz
  285.                                     ; zostal juz zwolniony
  286.            
  287.             mov a, r2
  288.             mov dph, #80h
  289.             mov dpl, a
  290.             movx a,@dptr            ; w akumulatorze jest wartosc odpowieniego przycisku
  291.             sjmp koniec             ; konczymy wczytywanie
  292.  
  293.     koniec:
  294.             ret
  295.  
  296.  
  297. ;-------------------------------------------------------------------------------------------------
  298.         ; program glówny
  299. START:  init_LCD
  300.         MOV TMOD, #01H          ; konfiguracja timera
  301.         MOV TH0, #3CH           ; ladowanie
  302.         MOV TL0, #0B0H          ; stalej timera na 50ms    
  303.  
  304.         MOV R5, #00H            ; inicjacja zegara
  305.         MOV R6, #00H
  306.         MOV R7, #0FFH
  307.         MOV IE, #82H            ; przerwania wlacz
  308.        
  309.         acall key_digits           
  310.        
  311. wczytywanie:  
  312.        key_1:  
  313.             mov r4, #LINE_1
  314.             mov a, r4
  315.             mov P5, a
  316.             mov a, P7
  317.             anl a, r4
  318.             mov r2, a
  319.             clr c
  320.             subb a, r4
  321.             jz key_2
  322.            
  323.             ; jesli nacisnieto jakis przycisk, sprawdzane jest
  324.             ; czy nie byl to klawisz A - ustawianie godziny
  325.             mov a, r2
  326.             cjne a, #01111110B, key_1       ; jesli nacisnieto znak ('A') to wczytujemy godziny
  327.             acall wczytaj_godziny
  328.            
  329.         key_2: 
  330.             mov r4, #LINE_2
  331.             mov a, r4
  332.             mov P5, a
  333.             mov a, P7
  334.             anl a, r4
  335.             mov r2, a
  336.             clr c
  337.             subb a, r4
  338.             jz key_3
  339.             ; jesli nacisnieto jakis przycisk, sprawdzane jest
  340.             ; czy nie byl to klawisz B - ustawianie minut
  341.             mov a, r2
  342.             cjne a, #10111110B, key_2       ; jesli nacisnieto znak ('B') to wczytujemy minuty
  343.             acall wczytaj_minuty
  344.            
  345.         key_3: 
  346.             mov r4, #LINE_3
  347.             mov a, r4
  348.             mov P5, a
  349.             mov a, P7
  350.             anl a, r4
  351.             mov r2, a
  352.             clr c
  353.             subb a, r4
  354.             jz key_4
  355.             ; jesli nacisnieto jakis przycisk, sprawdzane jest
  356.             ; czy nie byl to klawisz C - ustawianie sekund
  357.             mov a, r2
  358.             cjne a, #11011110B, key_3       ; jesli nacisnieto znak ('C') to wczytujemy sekundy
  359.             acall wczytaj_sekundy
  360.            
  361.         key_4: 
  362.             mov r4, #LINE_4
  363.             mov a, r4
  364.             mov P5, a
  365.             mov a, P7
  366.             anl a, r4
  367.             mov r2, a
  368.             clr c
  369.             subb a, r4
  370.             jz key_1
  371.            
  372.             ; jesli podano jakis przycisk to:
  373.             mov a, r2          
  374.             cjne a, #11100111B, key_4 ; jesli nacisnieto znak ('*') to zaczynamy wyswietlac
  375.             sjmp wyswietl                    ; jesli nie nacisnieto ('*') to czytamy 4-ta linie
  376.        
  377. wyswietl:
  378.         ; JESLI ROZPOCZETO/WZNOWIONO TIMER TO WYKONUJEMY POTRZEBNE OPERACJE
  379.         SETB TR0                ; timer start
  380.         ACALL ZEGAR             ; wyswietlenie zainicjowanego zegara
  381.         MOV A, #0FH
  382.         MOV P1, A               ; zapalenie diód
  383.         MOV R0, #20             ; licznik odmierzen 20 x 50ms
  384. CZEKAM: MOV A, R0               ; czekam, a timer
  385.         JNZ CZEKAM              ; mierzy laczny czas 1s
  386.         MOV R0, #20             ; po zgloszeniu przerwania - ust. na nowo licznik na 20 x 50ms
  387.         ACALL ZEGAR             ; utuchomeinie procedury oblugi i wyswietlenia zegara
  388.         MOV A, P1               ; zmiana
  389.         CPL A                   ; swiecenia
  390.         MOV P1, A               ; diód
  391.        
  392.         ; SPRAWDZENIE CZY ZATRZYMAC ODLCZANIE TIMERA
  393.             mov r4, #LINE_4
  394.             mov a, r4
  395.             mov P5, a
  396.             mov a, P7
  397.             anl a, r4
  398.             mov r2, a
  399.             clr c
  400.             subb a, r4
  401.             jz odliczaj_dalej           ; jesli nie jest wcisniety zaden przycisk w 4 wierszu to
  402.                                         ; timer nie zatrzymuje sie i odlicza dalej
  403.            
  404.                                         ; jesli wciscnieto jakis przycisk:
  405.             mov a, r2          
  406.             cjne a, #11101101B, odliczaj_dalej  ; jesli nacisnieto znak ('#') to stop odliczania
  407.             sjmp stop                           ; jesli nie nacisnieto ('#') to odliczamy dalej
  408.            
  409.             stop:
  410.             CLR TR0                     ; stop timer
  411.             jmp wczytywanie             ; czytamy ponownie znaki w celu ewentualnego startu timera
  412.                                         ; lub ustawienia nowego czasu
  413.        
  414.         odliczaj_dalej:
  415.        
  416.         JMP CZEKAM                      ; czekam na kolejna sekunde
  417. ;-------------------------------------------------------------------------------------------------
  418.         NOP
  419.         NOP
  420.         NOP
  421.         JMP $
  422. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement