Advertisement
Guest User

Untitled

a guest
May 9th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. TIME        EQU     50                  ;ustawienie czasu cyklu 50ms
  2. LOAD        EQU     (65536 - 1000*TIME)
  3.  
  4. CMD_WR      EQU     0FF2CH ; Sets CGRAM address
  5. DATA_WR     EQU     0FF2DH ; Sets DDRAM address
  6. READ_STATUS EQU     0FF2EH ; Reads busy flag
  7.  
  8. INIT        EQU     038H    ; Function Set
  9. CLEAR       EQU     001H    ; Clear display
  10. TURN_ON     EQU     06H     ; Display ON Cursor ON Blink OFF
  11. CURSOR      EQU     0AH     ; Sets Cursor address
  12.  
  13. SEC         EQU     40H     ;Sets seconds address
  14. MIN         EQU     41H     ;Sets minutes address
  15. HR          EQU     42H     ;Sets hours address
  16. COUNTER     EQU     43H     ;Sets counter address
  17.  
  18. ORG 0
  19.     LJMP START
  20.  
  21. ORG 0BH
  22.     MOV TH0, #HIGH(LOAD)    ;zaladowanie starszych bitow
  23.     MOV TL0, #LOW(LOAD)     ;zaladowanie mlodszych bitow
  24.     PUSH ACC
  25.     PUSH PSW
  26.     DJNZ COUNTER, KONIEC    ;dekrementacja licznika i skok jezeli jest rozne od 0
  27.     MOV COUNTER, #20        ;ustawienie licznika na 20
  28.  
  29.     LCALL   INIT_LCD
  30.     LCALL   WRITE_TIME
  31.  
  32.     INC SEC                 ;inkrementacja sekund
  33.     MOV A, SEC              ;przeslanie sekund do akumulatora
  34.     CJNE A, #60, KONIEC     ;jezeli akumulator jest rozny od 60 to skok do etykiety KONIEC
  35.     MOV SEC, #0            
  36.     INC MIN
  37.     MOV A, MIN
  38.     CJNE A, #60, KONIEC
  39.     MOV MIN, #0
  40.     INC HR
  41.     MOV A, HR
  42.     CJNE A, #24, KONIEC
  43.     MOV HR, #0
  44.  
  45. KONIEC:
  46.     POP ACC
  47.     POP PSW
  48.     RETI
  49. START:
  50.     LCALL   WRITE_TIME
  51.     LCALL   INIT_LCD
  52.     LCALL   INIT_TIMER
  53.  
  54.     SJMP    $
  55. ;--------------------------------------------------
  56. INIT_TIMER:
  57.     CLR TR0                 ;wylaczenie timera
  58.     MOV TMOD, #000000001B   ;ustawienie timera na 16bit
  59.     MOV TH0, #HIGH(LOAD)    ;zaladowanie starszych bitow
  60.     MOV TL0, #LOW(LOAD)     ;zaladowanie mlodszych bitow
  61.     MOV COUNTER, #20        ;ustawienie licznika na 20
  62.     CLR TF0                 ;wyzerowanie przepelnienia
  63.     SETB ET0                ;ustawienie przerwania timera na 0
  64.     SETB EA                 ;wlaczenie ukladu przerwan
  65.     SETB TR0                ;wlaczenie timera
  66.     RET
  67. ;--------------------------------------------------
  68. INIT_LCD:
  69.     MOV A, #INIT        ;inicjalizacja wyswietlacza
  70.     LCALL WRITE_CMD    
  71.  
  72.     MOV A, #CLEAR       ;czyszczenie wyswietlacza
  73.     LCALL WRITE_CMD
  74.  
  75.     MOV A, #TURN_ON     ;wlaczenie wyswietlacza
  76.     LCALL WRITE_CMD
  77.     RET
  78.  
  79. ;--------------------------------------------------
  80. CHECK_BUSY:
  81.     PUSH ACC
  82.     MOV DPTR, #READ_STATUS  ;odczytanie statusu
  83. CB_LOOP:
  84.     MOVX A, @DPTR
  85.     JB ACC.7, CB_LOOP
  86.     POP ACC
  87.     RET
  88.  
  89. ;--------------------------------------------------
  90. WRITE_CMD:
  91.     LCALL CHECK_BUSY        ;sprawdza czy wyswietlacz jest zajety
  92.     MOV DPTR, #CMD_WR       ;przeslanie adresu linii sterowania
  93.     MOVX @DPTR, A           ;przeslanie akumulatora na linie sterowania
  94.     RET
  95.  
  96. ;--------------------------------------------------
  97. WRITE_CHAR:
  98.     LCALL CHECK_BUSY       ;sprawdza czy wyswietlacz jest zajety                                     
  99.     MOV DPTR, #DATA_WR     ;przeslanie adresu linii zapisu danych
  100.     MOVX @DPTR, A          ;przeslanie akumulatora na linie zapisu danych
  101.     RET
  102.  
  103. ;--------------------------------------------------
  104. WRITE_DEC:
  105.     MOV B, #10              ;pomocniczny rejestr B (do mnozenia i dzielenia) ustawienie podstawy na 10
  106.     DIV AB                  ;dzielenie A/B, A=calosc, B=reszta
  107.     ADD A, #'0'
  108.     LCALL WRITE_CHAR
  109.     MOV A, B
  110.     ADD A, #'0'
  111.     LCALL WRITE_CHAR
  112.     RET
  113.  
  114. ;--------------------------------------------------
  115. WRITE_TIME:
  116.     MOV A, HR
  117.     LCALL WRITE_DEC
  118.     MOV A, #':'
  119.     LCALL WRITE_CHAR
  120.     MOV A, MIN
  121.     LCALL WRITE_DEC
  122.     MOV A, #':'
  123.     LCALL WRITE_CHAR
  124.     MOV A, SEC
  125.     LCALL WRITE_DEC
  126.     RET
  127.    
  128. ;--------------------------------------------------
  129.    
  130. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement