Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CZAS    EQU     50  ; ms
  2. LADUJ   EQU     (010000h - 1000*CZAS)   ;65536
  3.    
  4. CNT EQU 30H
  5. SEC EQU 31H
  6. MIN EQU 32H
  7. HOUR EQU 33H
  8.    
  9. WR_CMD EQU 0FF2Ch
  10. WR_DAT EQU 0FF2Dh
  11. RD_CMD EQU 0FF2Eh
  12. RD_DAT EQU 0FF2Fh
  13.  
  14. SEC_CHANGE BIT 34H          ;flaga zmiany sekundy
  15.  
  16.  
  17. CLEAR EQU 001H
  18. FUNCTION_SET EQU 0111000B   ;8 znakow, 2 linie 5x8
  19. WLACZ EQU 0110B             ;Kod wlaczalacy wyswietlacz
  20. CURSOR EQU 04h              ;adres kursora na wyswietlaczu
  21.  
  22. POSITION EQU 14H
  23. +
  24. ;--------------------------------------------------------
  25. ;                       ZEGAR LCD
  26. ;--------------------------------------------------------
  27. ORG 0
  28.         LCALL INIT_LCD                  ;inizjalizacja LCD
  29.         LCALL INIT_TIMER                ;inicjalizacja timera
  30.         SJMP $
  31.  
  32. ;--------------------------------------------------------
  33. ; OBSLUGA PRZERWAN
  34. ;--------------------------------------------------------
  35. ORG 0BH                                 ;Blok obslugi mechanizmu przerwan, musi startowac pod adresem 0BH
  36.         MOV TH0,#HIGH(LADUJ)            ;Ladowanie starszych i mlodszych bitow
  37.         MOV TL0,#LOW(LADUJ)             ;zmiennej LADUJ zawierajacej liczbe cykli
  38.        
  39.         PUSH ACC                        ;wrzucenie na stos zawartosci akumulatora
  40.         PUSH PSW                        ;wrzucenie na stos zawartosci rejestru flag
  41.        
  42.         DJNZ CNT, DONE                  ;Jesli A == 0 skok do DONE
  43.         MOV CNT, #20
  44.         SETB SEC_CHANGE
  45.         LCALL CLOCK
  46.         INC SEC
  47.         MOV A, SEC
  48.         CJNE A, #60, DONE               ;jezeli sekundy == 60 zwieksz minuty o 1 i wyzeruj sekundy
  49.         MOV SEC, #0
  50.         INC MIN
  51.         MOV A, MIN
  52.         CJNE A, #60, DONE               ;jezeli minuty == 60 zwieksz godziny o 1 i wyzeruj minuty
  53.         MOV MIN, #0
  54.         INC HOUR
  55.         MOV A, HOUR
  56.         CJNE A, #24, DONE               ;jezeli godziny == 24 wyzeruj godziny
  57.         MOV HOUR, #0
  58.  
  59. DONE:
  60.  
  61.         POP PSW                         ;odczytanie rejestru flag ze stosu
  62.         POP ACC                         ;odczytanie akumulatora ze stosu
  63.         RETI                            ;Wyjscie z bloku obslugi przerwania
  64.  
  65. ;--------------------------------------------------------
  66. ; INIT_TIMETR - Procedura inicjujaca timer
  67. ;--------------------------------------------------------
  68. INIT_TIMER:                            
  69.        
  70.         MOV CNT, #20                    ;Licznik wykonan przerwania (20* 50ms = 1s)
  71.         MOV SEC, #55                    ;inicjalizacja godziny 23:59:45 (ulatwienie do sprawdzania)
  72.         MOV MIN, #59
  73.         MOV HOUR, #23
  74.  
  75.         CLR TR0                         ;Wylaczenie timera
  76.         MOV TMOD, #00000001B            ;Ustawienie trybu timera na 16 bit
  77.         MOV TH0,#HIGH(LADUJ)            ;Ladowanie starszych i mlodszych bitow
  78.         MOV TL0,#LOW(LADUJ)             ;zmiennej LADUJ zawierajacej liczbe cykli
  79.         CLR TF0                         ;Zeruj przepelnienie
  80.         SETB ET0                        ;Ustawienie przerwania timera 0
  81.         SETB EA                         ;Wlaczenie ukladu przerwan
  82.         SETB TR0                        ;Wlaczenie timera
  83.         RET                             ;Wyjscie z procedury
  84.        
  85. ;--------------------------------------------------------
  86. ; INIT_LCD - Procedura inicjujaca LCD
  87. ;--------------------------------------------------------      
  88. INIT_LCD:
  89.         MOV A, #FUNCTION_SET    ;inicjalizacja
  90.         LCALL WRITE_CMD
  91.         MOV A, #CLEAR           ;czyszczenie
  92.         LCALL WRITE_CMD
  93.         MOV A, #WLACZ           ;wlaczenie wyswietlacza
  94.         LCALL WRITE_CMD
  95.         RET
  96.  
  97. WRITE_CMD:
  98.         PUSH ACC                ;zrzucenie akumulatora na stos
  99.         LCALL CHECK             ;sprawdzanie czy LCD jest wolny
  100.         MOV DPTR, #WR_CMD       ;wpisanie adresu sterowania
  101.         POP ACC                 ;zrzucenie ze stosu akumulatora
  102.         MOVX @DPTR, A           ;przeslanie akumulatora linie sterowania
  103.         RET
  104.        
  105. ;--------------------------------------------------------
  106. ; CHECK - Petla sprawdzajaca czy LCD jest wolny
  107. ;--------------------------------------------------------
  108. CHECK:                         
  109.         MOV DPTR, #RD_CMD
  110.         MOVX A, @DPTR
  111.         JB ACC.7, CHECK         ;sprawdza bit DB7(busy flag)
  112.         RET
  113.  
  114. WRITE_CHAR:
  115.         PUSH ACC
  116.         LCALL CHECK             ;sprawdzanie czy LCD jest wolny
  117.         MOV DPTR, #WR_DAT       ;wpisanie adresu sterowania
  118.         POP ACC                 ;zrzucenie ze stosu akumulatora
  119.         MOVX @DPTR, A           ;przeslanie akumulatora linie sterowania
  120.         RET
  121.        
  122.  
  123. ;--------------------------------------------------------
  124. ; A - wartosc do wyswietlenia (0..99)
  125. ;--------------------------------------------------------
  126. WRITE_DEC:
  127.         MOV B, #10              ;zamiana liczby na dziesietna
  128.         DIV AB                  ;w A dziesiatki, w B jednosci
  129.         ADD A, #'0'             ;przesuwamy o 48 (znak '0'), zeby otrzymac kod ascii cyfry
  130.         LCALL WRITE_CHAR
  131.         MOV A, B                ;to samo dla reszty z dzielenia
  132.         ADD A, #'0'
  133.         LCALL WRITE_CHAR
  134.         RET
  135.        
  136. ;--------------------------------------------------------
  137. ; CLOCK - Wyswietlanie zegara
  138. ;--------------------------------------------------------
  139. CLOCK:
  140.         MOV A, #04h
  141.         LCALL SET_CURSOR
  142.         MOV A, HOUR                     ;przekazanie liczby godzin do akumulatora
  143.         LCALL WRITE_DEC                 ;wyswietlenie liczby godzin
  144.         MOV A, #':'                     ;wpisanie znaku dwukropka do akumulatora
  145.         LCALL WRITE_CHAR                ;wyswietlenie znaku ':'
  146.         MOV A, MIN                      ;analogicznie dla minut i sekund
  147.         LCALL WRITE_DEC
  148.         MOV A, #':'
  149.         LCALL WRITE_CHAR
  150.         MOV A, SEC
  151.         LCALL WRITE_DEC
  152.         CLR SEC_CHANGE
  153.         RET
  154.  
  155. ;--------------------------------------------------------
  156. ; Ustawianie pozycji wyswietlania na LCD
  157. ; z akumulatora ---y | xxxx
  158. ; y - linia
  159. ; x - pozycja
  160. ;--------------------------------------------------------
  161. SET_CURSOR:
  162.         ANL A, #00011111B               ;wyzerowanie 3 najstarszych bitow
  163.         JNB ACC.4, SC_CONT              ;sprawdzanie czy y = 0
  164.         CLR ACC.4                       ;
  165.         ADD A, #40h                     ;jesli tak to przesun zegar na druga linie
  166.        
  167. SC_CONT:
  168.         ADD A, #80h                     ;dodanie do adresu kursora kodu polecenia
  169.         CALL WRITE_CMD
  170.         RET
  171.        
  172.  
  173.  END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement