Advertisement
Guest User

Untitled

a guest
May 4th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 11.88 KB | None | 0 0
  1. $NOMOD51
  2. #include <C8051F060>
  3. ;Program obslugi wyswietlacza cieklokrystalicznego
  4. ;-------------------------------------------------------------------------------------------------------
  5. ;                       DEFINICJE SYMBOLI
  6. ;-------------------------------------------------------------------------------------------------------
  7.        LCD_RW                  equ     P5.0    ; read/write
  8.        LCD_CE                  equ     P5.1    ; nieaktywny/aktywny
  9.        LCD_CD                  equ     P5.2    ; instrukcja/dane
  10.        LCD_LIGHT               equ     P5.3    ; Podświetlanie
  11.        LCD_DATA                equ     P7      ; linia danych wyswietlacza
  12.  
  13.        TOS                     equ     30H     ; stos
  14.        ready                   bit     0
  15.        T0_TMOD                 equ     1H      ; konfiguracja licznika T0 w trybie 1 (16-bitowy)
  16.        T0_Reload               equ     65536 - 600     ; wartosc poczatkowa licznika T0
  17.        Del                     equ     7FH     ; zliczanie przerwan
  18.        DelReload               equ     100     ; liczba przerwan do zliczenia (rozszerzenie opo
  19. ;-------------------------------------------------------------------------------------------------------
  20. ;       Umieszczenie poczatku programu pod adresem 0000H
  21.                cseg    AT 0000h
  22.                jmp     Poczatek        ; skok do faktycznego poczatku programu
  23. ;-------------------------------------------------------------------------------------------------------
  24. ;       Umieszczenie poczatku procedury obslugi przerwania licznika T0 pod
  25. adresem 0000BH
  26.                org     000BH
  27.                jmp     Timer0_Int      ; skok do faktycznego poczatku procedury obslugi
  28. przerwania licznika T0
  29. ;-------------------------------------------------------------------------------------------------------
  30.  
  31. ;       konfiguracja mikrokontrolera
  32. ;-------------------------------------------------------------------------------------------------------
  33. Poczatek:
  34.                mov WDTCN, #0DEh;       wylaczenie watchdoga
  35.                mov WDTCN, #0ADh;       wylaczenie watchdoga
  36.  
  37.                mov SFRPAGE, #CONFIG_PAGE;        wlaczenie odpowiedniej konfiguracji SFR-ow
  38.                mov XBR2, #040h        ;       wlaczenie krosownicy
  39. ;-------------------------------------------------------------------------------------------------------
  40. ;                       PROGRAM GLOWNY
  41. ;-------------------------------------------------------------------------------------------------------
  42. ;       inicjalizacja
  43.  
  44.        mov     SP, #TOS                ; inicjalizacja stosu
  45.        mov     P5MDOUT, #08h            ;tryb push pull dla sterowania podswietlaniem
  46.        setb    LCD_LIGHT               ; włączenie podswietlania
  47.  
  48.        clr     Ready                      ; wyzerowanie flagi Ready
  49.        mov     Del, #DelReload         ; zaladuj liczbe przerwan do odliczenia
  50.        call    Timer0_Init             ; wywolanie procedury konfiguracji licznika T0
  51.  
  52. ; aktywacja systemu przerwan
  53.        setb    ET0                     ; uaktywnienie przerwania licznika T0
  54.        setb    EA                      ; globalne uaktywnienie systemu przerwan
  55.  
  56. mov     DPTR, #tablica
  57. mov     R7, #4
  58.  
  59.  
  60. call configuracja
  61.  
  62.  
  63. ;Mode Set
  64.       mov     A, #84h                            ;    CG_ROM, TEXT ONLY
  65.       call    write_command
  66.  
  67. ;Display Mode Set
  68.       mov     A, #94h                            ;    grafika OFF,
  69. text ON, kursor OFF, migotanie OFF
  70.       call    write_command
  71.  
  72. ;Addres początkowy dla zapisu danych do pamięci VRAM(grafika):
  73. mov     R7, #1
  74. call    configuracja
  75.  
  76. ;czyszczenie:
  77. ;Czyszczenie pamieci graficznej:
  78.       mov     R2, #13h
  79.       mov     R3, #0FFh
  80. petla_czysc_grafike:
  81.       mov     A, #00h         ; znak zera do akumulatora
  82.       call    write_data
  83.       mov     A, #0C0h        ; Zapis do VRAM
  84.       call    write_command   ; zapis znaku
  85.       djnz    R3, petla_czysc_grafike
  86.       mov     R3, #0FFh
  87.       djnz    R2, petla_czysc_grafike    ; licznik
  88.  
  89. ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
  90. mov     R7, #1
  91. call    configuracja
  92.  
  93. czyszczenie:
  94.  
  95. ;Czyszczenie pamieci tekstowej:
  96.       mov     R2, #04h
  97.       mov     R3, #0FFh
  98. Petla_czysc_text:
  99.       mov     A, #00h         ; znak zera do akumulatora
  100.       call    write_data
  101.       mov     A, #0C0h        ; Zapis do VRAM
  102.       call    write_command   ; zapis znaku
  103.       djnz    R3, Petla_czysc_text
  104.       mov     R3, #0FFh
  105.       djnz    R2, Petla_czysc_text    ; licznik
  106.  
  107. ;=========================
  108.  
  109.  
  110. Wartosci_poczatkowe:
  111.  
  112.       mov     DPTR, #Display  ;poczatek tablicy do wyswietlenia
  113.       mov     R2, #167d            ;miejsce rozpoczecia wyswietlania,
  114. w pierwszej niepotrzebne
  115. ;petla_glowna:
  116.  
  117. poczatek_wyswietlania:
  118.        jnb ready, poczatek_wyswietlania
  119.        clr ready
  120.  
  121.  
  122.       mov     R0, #00h
  123.  
  124. ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
  125.       mov     A, R2
  126.       call    write_data
  127.       mov     A, #17H
  128.       call    write_data
  129.       mov     A, #24h
  130.       call    write_command
  131.  
  132. petla_wyswietlania:
  133.       mov     A, R0           ;sprowadzenie znaku
  134.       movc    A,@A+DPTR        ;z Displaya
  135.  
  136.       cjne    A,#0Dh,dalej       ;porownojemy ze znakiem oznaczajacym
  137. koniec Displaya
  138.       jmp     koniec_napisu
  139. dalej:
  140.       subb    A, #20h         ;konwersja ASCII->LCD_HEX
  141.  
  142.       call    write_data
  143.       mov     A, #0C0h            ;zapis do VRAM
  144.       call    write_command    ; zapis znaku
  145.  
  146.       ;nastepny znak:
  147.       inc     R0
  148.       jmp     petla_wyswietlania
  149. koniec_napisu:
  150.  
  151.        dec R2
  152.        cjne R2, #00h, idz
  153.        jmp     drugie_wyswietlanie
  154. idz:
  155.       cjne    R0, #00h, poczatek_wyswietlania
  156.  
  157.  
  158. ;jmp Wartosci_poczatkowe
  159.  
  160. drugie_wyswietlanie:            ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  161.  
  162. poczatek_wyswietlania2:
  163.        jnb ready, poczatek_wyswietlania2
  164.        clr ready
  165.  
  166.       mov     R0, #00h
  167.  
  168. ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
  169.       mov     A, R2
  170.       call    write_data
  171.       mov     A, #17H
  172.       call    write_data
  173.       mov     A, #24h
  174.       call    write_command
  175.  
  176. petla_wyswietlania2:
  177.       mov     A, R0           ;sprowadzenie znaku
  178.       movc    A,@A+DPTR        ;z Displaya
  179.  
  180.       cjne    A,#0Dh,dalej2       ;porownojemy ze znakiem
  181. oznaczajacym koniec Displaya
  182.       jmp     koniec_napisu2
  183. dalej2:
  184.       subb    A, #20h         ;konwersja ASCII->LCD_HEX
  185.  
  186.       call    write_data
  187.       mov     A, #0C0h            ;zapis do VRAM
  188.       call    write_command    ; zapis znaku
  189.  
  190.       ;nastepny znak:
  191.       inc     R0
  192.       jmp     petla_wyswietlania2
  193. koniec_napisu2:
  194.  
  195.        inc DPTR
  196.        mov A, #0
  197.        movc A, @A+DPTR
  198.        cjne A, #0Dh, idz2
  199.        mov     DPTR, #Display
  200.        jmp     czyszczenie
  201. idz2:
  202.       cjne    R0, #00h, poczatek_wyswietlania2
  203.  
  204.  
  205. program_start:
  206.       jmp     program_start
  207.  
  208. ;-----------------------------------------------------------------------------------------------
  209. ;               PROCEDURY
  210. ;-----------------------------------------------------------------------------------------------
  211.  
  212. ;sprawdzanie zajetosci LCD:
  213.  
  214.  
  215. ;Configuracja
  216. configuracja:
  217.  
  218. mov     A, R7
  219. mov     R4, A
  220.  
  221. petla:
  222.        mov     A, #0
  223.        movc    A, @A+DPTR
  224.        call    write_data
  225.        inc     DPTR
  226.  
  227.        mov     A, #0
  228.        movc    A, @A+DPTR
  229.        call    write_data
  230.        inc     DPTR
  231.  
  232.        mov     A, #0
  233.        movc    A, @A+DPTR
  234.        call    write_command
  235.        inc     DPTR
  236.  
  237.        djnz    R4, petla
  238.  
  239. ret
  240.  
  241. zajety:
  242.       push    ACC             ; zapamietaj A na stosie
  243.       setb    LCD_CD          ; wysylaj command
  244.       setb    LCD_RW          ; czytaj wyswietlacz
  245.       mov     LCD_DATA, #0FFh ; jedynki na DATA
  246. check:
  247.       mov     R1, #10h            ;opoznienie
  248.       djnz    R1, $
  249.  
  250.       clr     LCD_CE          ; wlacz kontroler LCD
  251.  
  252.       mov     R1, #10h            ;opoznienie
  253.       djnz    R1, $
  254.  
  255.       mov     A, LCD_DATA     ; odczytaj status
  256.       setb    LCD_CE          ; wylacz kontroler LCD
  257.       jnb     ACC.0, check
  258.       jnb     ACC.1, check    ; sprawdz, czy wyswietlacz zajety
  259.  
  260.       mov     R1, #10h            ;opoznienie
  261.       djnz    R1, $
  262.  
  263.       pop     ACC             ; przywroc A ze stosu
  264.       ret
  265.  
  266. ;zapis polecenia:
  267. write_command:
  268.       call    zajety          ; sprawdz, czy wyswietlacz gotowy
  269.       nop
  270.       nop
  271.       clr     LCD_RW          ; zapisuj do wyswietlacza
  272.       setb    LCD_CD          ; wysylaj command
  273.       mov     LCD_DATA, A     ; wyslij polecenie z akumulatora
  274.       clr     LCD_CE          ; wlacz kontroler LCD
  275.  
  276.       mov     R1, #10h            ;opoznienie
  277.       djnz    R1, $
  278.  
  279.       setb    LCD_CE          ; wylacz kontroler LCD
  280.       ret
  281.  
  282. ;zapis danej:
  283. write_data:
  284.       call    zajety
  285.       nop
  286.       nop
  287.       clr     LCD_RW          ; zapisuj do wyswietlacza
  288.       clr     LCD_CD          ; wysylaj data
  289.       mov     LCD_DATA, A     ; wyslij dana z akumulatora
  290.       clr     LCD_CE          ; wlacz kontroler LCD
  291.  
  292.       mov     R1, #10h            ;opoznienie
  293.       djnz    R1, $
  294.  
  295.       setb    LCD_CE          ;wylacz kontroler LCD
  296.       ret
  297.  
  298. Timer0_Init:
  299. ; wybranie odpowiedniej strony rejestrow specjalnych
  300.       mov     SFRPAGE, #TIMER01_PAGE
  301. ; skonfigurowanie licznika T0 w trybie 1 (16-bitowy)
  302.       anl     TMOD, #0F0H     ; iloczyn logiczny zawartosci rejestru
  303. TMOD i stalej 0F0H
  304.       orl     TMOD, #T0_TMOD  ; suma logiczna zawartosci rejestru
  305. TMOD i stalej T0_TMOD
  306. ; zapisanie wartosci poczatkowej licznika
  307.       call    Timer0_Reload
  308. ; uruchomienie licznika
  309.       setb    TR0                     ; nadanie wartosci 1 bitowi TR0 (TCON)
  310. ; przywrocenie odpowiedniej strony rejestrow specjalnych
  311.       mov     SFRPAGE, #CONFIG_PAGE
  312.       ret
  313. ;---------------------------------------------------------------------------------------------------
  314. Timer0_Reload:
  315. ; zapisanie poczatkowej wartosci rejestrow licznika
  316.       mov     TH0, #High(T0_Reload)   ; zapis starszego bajtu stalej
  317. T0_Delay w rejestrze TH0
  318.       mov     TL0, #Low(T0_Reload)    ; zapis mlodszego bajtu stalej
  319. T0_Delay w rejestrze TL0
  320.       ret
  321. ;---------------------------------------------------------------------------------------------------
  322. ; procedura obslugi przerwania licznika T0
  323. Timer0_Int:
  324.       mov     SFRPAGE, #TIMER01_PAGE  ; wybierz strone rejestrow
  325. specjalnych umozliwiajaca obsluge licznika T0
  326.       call    Timer0_Reload           ; zaladuj wartosc poczatkowa do
  327. licznika T0
  328.       mov     SFRPAGE, #CONFIG_PAGE   ; wroc do wlasciwej strony
  329. rejestrow specjalnych
  330.       djnz    Del, Timer0_Int_Exit    ; jezeli nie odliczono zadanej
  331. liczby przerwan wyjdz z procedury
  332.       mov     Del, #DelReload         ; zaladuj liczbe przerwan do odliczenia
  333.       setb    Ready                   ; ustaw flage Ready
  334. Timer0_Int_Exit:
  335.       reti                            ; wroc z procedury obslugi przerwania
  336.  
  337.  
  338. tablica:
  339.        db 00h, 00h, 42h        ;;Poczatkowy adres VRAM dla danych graficznych (GH)
  340.        db 15h, 00h, 43h        ;Liczba kolumn danych graficznych w linii (GA)
  341.        db 00h, 17h, 40h        ;Poczatkowy adres VRAM dla danych textowych (TH)
  342.        db 15h, 00h, 41h        ;Liczba kolumn w linii wyświetlacza (TA)
  343.        db 00h, 00h, 24h        ;Addres początkowy dla zapisu danych do pamięci VRAM(grafika):
  344.        db 00h, 17h, 24h        ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
  345.  
  346.  
  347. Display:
  348.       db 'There`s a lady who`s '
  349.       db 'shure all that gleate'
  350.       db 'rns is gold and she`s'
  351.       db 'buying a stairway to '
  352.       db 'heaven.      R Plant '
  353. ;       db '                     '
  354.       db 0Dh
  355.  
  356. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement