Advertisement
Chain_L

Untitled

May 30th, 2022
989
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;------------------------------------------------------------------------------
  2. TIME_MS     EQU 50                  ; czas w [ms]
  3. CYCLES      EQU (1000 * TIME_MS)    ; czas w cyklach (f = 12 MHz)
  4. LOAD        EQU (65536 - CYCLES)    ; wartosc ladowana do TH0|TL0
  5. ;------------------------------------------------------------------------------
  6. CNT_50      EQU 30h                 ; licznik w ramach sekundy
  7. SEC         EQU 31h                 ; sekundy
  8. MIN         EQU 32h                 ; minuty
  9. HOUR        EQU 33h                 ; godziny
  10.  
  11. ALARM_SEC   EQU 34h                 ; alarm - sekundy
  12. ALARM_MIN   EQU 35h                 ; alarm - minuty
  13. ALARM_HOUR  EQU 36h                 ; alarm - godziny
  14.  
  15. SEC_CHANGE  EQU 0                   ; flaga zmiany sekund (BIT)
  16. ;------------------------------------------------------------------------------
  17. LEDS        EQU P1                  ; diody LED na P1 (0=ON)
  18. ALARM       EQU P1.7                ; sygnalizacja alarmu
  19. ;------------------------------------------------------------------------------
  20.  
  21. CSEG AT 0
  22.     sjmp    start
  23.    
  24. CSEG AT 0Bh
  25. ;---------------------------------------------------------------------
  26. ; Obsluga przerwania Timera 0
  27. ;---------------------------------------------------------------------
  28. T0_int:
  29.     mov TL0,    #LOW(LOAD)      ; przeladowanie timera 0
  30.     mov TH0,    #HIGH(LOAD)
  31.    
  32.     push PSW                    ; odlozenie na stos uzywanych rejestrow
  33.     push ACC
  34.    
  35.     djnz CNT_50,    koniec1
  36.     mov  CNT_50,    #20
  37.  
  38.     inc     SEC                 ;sprawdzanie czy SEC jest mniejsze niz 60
  39.     jc      sec_ch
  40.     mov     A, SEC
  41.     cjne    A, #60, koniec1
  42.     mov     SEC, #0
  43.    
  44.  
  45.     inc     MIN                 ;sprawdzanie czy MIN jest mniejsze niz 60
  46.     mov     A, MIN
  47.     cjne    A, #60, koniec1
  48.     mov     MIN, #0
  49.    
  50.     inc     HOUR                ;sprawdzanie czy HOUR jest mniejsze niz 24
  51.     mov     A, HOUR
  52.     cjne    A, #24, koniec1
  53.     mov     HOUR, #0
  54.    
  55. sec_ch:
  56.     setb SEC_CHANGE
  57.  
  58. koniec1:
  59.     pop ACC
  60.     pop PSW
  61.  
  62.     reti
  63.  
  64. ;---------------------------------------------------------------------
  65. ; Start programu
  66. ;---------------------------------------------------------------------
  67. start:
  68.     lcall lcd_init
  69.     lcall clock_init
  70.     lcall timer_init
  71.    
  72. lcd_init:
  73.     mov LEDS, #0FFh
  74.     ret
  75. ;---------------------------------------------------------------------
  76. ; Petla glowna programu
  77. ;---------------------------------------------------------------------
  78. main_loop:
  79.     jnb SEC_CHANGE, other_tasks ; sprawdzenie zmiany sekundy
  80.     clr SEC_CHANGE              ; czyszczenie flagi
  81.    
  82.     lcall clock_display
  83.     lcall clock_alarm
  84. other_tasks:
  85.     sjmp    main_loop
  86.  
  87. ;---------------------------------------------------------------------
  88. ; Inicjowanie Timera 0 w trybie 16-bitowym z przerwaniami
  89. ;---------------------------------------------------------------------
  90. timer_init:
  91.     clr TR0                     ; zatrzymanie timera
  92.    
  93.     anl TMOD,   #11110000B      ; pierwsze 4 bity to ustawienia timera, wiec zerujemy 4 ostatnie
  94.     orl TMOD,   #00000001B      ; ustawienie ostatniego bitu na 1 - wyzerowanie timera
  95.    
  96.     mov TL0,    #LOW(LOAD)      ; wpisanie odpowiednich wartosci do rejestrow
  97.     mov TH0,    #HIGH(LOAD)
  98.    
  99.     clr TF0                     ; wyzerowanie flagi
  100.    
  101.     setb ET0                    ; zezwolenie na przerwanie z timera 0
  102.     setb EA                     ; ogolne zezwolenie na przerwania
  103.    
  104.     setb TR0                    ; wznowienie pracy zegara
  105.     ret
  106.  
  107. ;---------------------------------------------------------------------
  108. ; Inicjowanie zmiennych zwiazanych z czasem
  109. ;---------------------------------------------------------------------
  110. clock_init:
  111.  
  112.     mov CNT_50, #20
  113.     mov SEC,    #53         ; przykladowe wartosci dla czasu   
  114.     mov MIN,    #59        
  115.     mov HOUR,   #23
  116.    
  117.    
  118.     mov ALARM_SEC,  #0      ; alarm przy czasie 00:00:00
  119.     mov ALARM_MIN,  #0
  120.     mov ALARM_HOUR, #0
  121.    
  122.     setb ALARM              ; wlaczenie alarmu
  123.    
  124.     ret
  125.  
  126. ;---------------------------------------------------------------------
  127. ; Wyswietlanie czasu
  128. ;---------------------------------------------------------------------
  129. clock_display:
  130.     mov A,      SEC
  131.     cpl A
  132.     orl LEDS, #11111111B            ; wyzerowanie diod
  133.     anl LEDS,   A                   ; aktualizacja czasu na wyswietlaczu
  134.     ret
  135.  
  136. ;---------------------------------------------------------------------
  137. ; Obsluga alarmu
  138. ;---------------------------------------------------------------------
  139. clock_alarm:
  140.     mov  A, SEC
  141.     cjne A, ALARM_SEC,  alarm_return
  142.    
  143.     mov  A, MIN
  144.     cjne A, ALARM_MIN,  alarm_return
  145.    
  146.     mov  A, HOUR
  147.     cjne A, ALARM_HOUR, alarm_return
  148.    
  149.     clr  ALARM
  150.     ret
  151.    
  152. alarm_return:
  153.     ret
  154.  
  155. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement