Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <p16f877A.inc> ; definicje specyficzne dla mikrokontrolera
- __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF
- LCD_RS_BIT equ 2
- LCD_E_BIT equ 3
- LCD_D4_BIT equ 4
- LCD_D5_BIT equ 5
- LCD_D6_BIT equ 6
- LCD_D7_BIT equ 7
- LCD_RS equ 1 << LCD_RS_BIT
- LCD_E equ 1 << LCD_E_BIT
- LCD_D4 equ 1 << LCD_D4_BIT
- LCD_D5 equ 1 << LCD_D5_BIT
- LCD_D6 equ 1 << LCD_D6_BIT
- LCD_D7 equ 1 << LCD_D7_BIT
- LCD_FUNC_SET equ B'00100000'
- LCD_FUNC_SET_8B equ B'00010000'
- LCD_FUNC_SET_4B equ B'00000000'
- LCD_FUNC_SET_2L equ B'00001000'
- LCD_FUNC_SET_1L equ B'00000000'
- LCD_FUNC_SET_HFONT equ B'00000100'
- LCD_FUNC_SET_LFONT equ B'00000000'
- LCD_DISP_CTRL equ B'00001000'
- LCD_DISP_CTRL_ON equ B'00000100'
- LCD_DISP_CTRL_OFF equ B'00000000'
- LCD_DISP_CTRL_CUR_ON equ B'00000010'
- LCD_DISP_CTRL_CUR_OFF equ B'00000000'
- LCD_DISP_CTRL_BLK_ON equ B'00000001'
- LCD_DISP_CTRL_BLK_OFF equ B'00000000'
- LCD_ENTRY_MODE equ B'00000100'
- LCD_ENTRY_MODE_INC equ B'00000010'
- LCD_ENTRY_MODE_DEC equ B'00000000'
- LCD_ENTRY_MODE_SHIFT equ B'00000001'
- LCD_ENTRY_MODE_NOTSHIFT equ B'00000000'
- LCD_SET_CGRAM equ B'01000000'
- LCD_SET_DDRAM equ B'10000000'
- LCD_SHIFT equ B'00010000'
- LCD_SHIFT_DISP equ B'00001000'
- LCD_SHIFT_RIGHT equ B'00000100'
- LCD_SHIFT_LEFT equ B'00000000'
- LCD_DISP_CLEAR equ B'00000001'
- UDATA
- ; zmienna przechowująca kod rozkazu do wykonania w procedurze wykonaj
- lcd_data RES 1
- tmp res 1
- tmp2 res 1
- tmp3 res 1
- address res 1
- counter res 1
- RST CODE 0x000 ; wektor resetu procesora
- pagesel main ; wybór strony pamięci programu
- goto main ; skok do początku programu
- PGM CODE
- main
- ; Inicjalizacja niezbędnych komponentów
- banksel PORTA ; wybór banku 0
- clrf PORTA ; inicjalizacja PORTA przez zerowanie zatrzasków wyjściowych
- bsf STATUS, RP0 ; wybór banku 1
- movlw B'00000110' ; przełączenie wejść na cyfrowe
- movwf ADCON1 ; poprzez odłączenie przetwornika A/C
- clrf TRISA ; ustawienie wyprowadzen PORTA na wyjścia
- clrf TRISB ; ustawienie wyprowadzen PORTB na wyjścia
- bcf STATUS, RP0 ; wybór banku 0
- ; inicjalizacja wyświetlacza
- call delay_20ms
- call delay_20ms
- call lcd_send_first_fs ; 1. instrukcja Function set
- call delay_20ms ; czekam więcej niż 4.1 ms
- call lcd_send_first_fs ; 2. instrukcja Function set
- call delay_20ms ; czekam więcej niż 100 us
- call lcd_send_first_fs ; 3. instrukcja Function set
- call delay_20ms ; czekam więcej niż 40 us
- movlw LCD_FUNC_SET | LCD_FUNC_SET_4B | LCD_FUNC_SET_2L | LCD_FUNC_SET_LFONT
- call lcd_send_command
- movlw LCD_DISP_CTRL | LCD_DISP_CTRL_OFF | LCD_DISP_CTRL_CUR_OFF | LCD_DISP_CTRL_BLK_OFF
- call lcd_send_command
- movlw LCD_ENTRY_MODE | LCD_ENTRY_MODE_INC | LCD_ENTRY_MODE_NOTSHIFT
- call lcd_send_command
- movlw LCD_DISP_CLEAR
- call lcd_send_command
- movlw LCD_DISP_CTRL | LCD_DISP_CTRL_ON | LCD_DISP_CTRL_CUR_OFF | LCD_DISP_CTRL_BLK_ON
- call lcd_send_command
- ; koniec inicjalizacji
- movlw LCD_SET_CGRAM
- call lcd_send_command
- clrf counter
- wysylam_a
- movfw counter
- call lcd_get_polish_a
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_a
- ;;;; Ę
- clrf counter
- wysylam_e
- movfw counter
- call lcd_get_polish_e
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_e
- ;;;; Ć
- clrf counter
- wysylam_c
- movfw counter
- call lcd_get_polish_c
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_c
- ;;;; L
- clrf counter
- wysylam_l
- movfw counter
- call lcd_get_polish_l
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_l
- ;;;; Ń
- clrf counter
- wysylam_n
- movfw counter
- call lcd_get_polish_n
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_n
- ;;;; Ó
- clrf counter
- wysylam_o
- movfw counter
- call lcd_get_polish_o
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_o
- ;;;; Ź
- clrf counter
- wysylam_zi
- movfw counter
- call lcd_get_polish_zi
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_zi
- ;;;; Ż
- clrf counter
- wysylam_zy
- movfw counter
- call lcd_get_polish_zy
- call lcd_send
- incf counter
- movlw 8
- subwf counter, W
- btfss STATUS, Z
- goto wysylam_zy
- movlw LCD_SET_DDRAM
- call lcd_send_command
- movlw 'J'
- call lcd_send
- movlw 'A'
- call lcd_send
- movlw 'N'
- call lcd_send
- movlw ' '
- call lcd_send
- movlw 6
- call lcd_send
- movlw 'D'
- call lcd_send
- movlw 6
- call lcd_send
- movlw 'B'
- call lcd_send
- movlw 3
- call lcd_send
- movlw 'O'
- call lcd_send
- movlw LCD_SET_DDRAM | 0x40
- call lcd_send_command
- movlw 0
- call lcd_send
- movlw 1
- call lcd_send
- movlw 2
- call lcd_send
- movlw 3
- call lcd_send
- movlw 4
- call lcd_send
- movlw 5
- call lcd_send
- movlw 6
- call lcd_send
- movlw 7
- call lcd_send
- goto $
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; wysyłanie znaku do CGRAM
- lcd_get_polish_a
- addwf PCL, f
- dt 0x0E, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x02 ; Ą
- lcd_get_polish_e
- addwf PCL, f
- dt 0x1E, 0x10, 0x10, 0x1C, 0x10, 0x10, 0x1E, 0x01 ; Ę
- lcd_get_polish_c
- addwf PCL, f
- dt 0x04, 0x0E, 0x15, 0x10, 0x10, 0x10, 0x11, 0x0E ; Ć
- lcd_get_polish_l
- addwf PCL, f
- dt 0x08, 0x08, 0x0C, 0x08, 0x18, 0x08, 0x0F, 0x00 ; Ł
- lcd_get_polish_n
- addwf PCL, f
- dt 0x04, 0x15, 0x19, 0x15, 0x15, 0x13, 0x11, 0x00 ; Ń
- lcd_get_polish_o
- addwf PCL, f
- dt 0x04, 0x0E, 0x15, 0x11, 0x11, 0x11, 0x11, 0x0E ; Ó
- lcd_get_polish_zi
- addwf PCL, f
- dt 0x04, 0x1F, 0x05, 0x02, 0x04, 0x08, 0x10, 0x1F ; Ź
- lcd_get_polish_zy
- addwf PCL, f
- dt 0x04, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F ; Ż
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- lcd_shift_left
- movlw LCD_SHIFT | LCD_SHIFT_DISP | LCD_SHIFT_LEFT
- call lcd_send_command
- return
- lcd_shift_right
- movlw LCD_SHIFT | LCD_SHIFT_DISP | LCD_SHIFT_RIGHT
- call lcd_send_command
- return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- lcd_send_command ;wysylanie danych do LCD
- movwf lcd_data
- andlw 0xF0
- iorlw LCD_E ; ustaw E
- movwf PORTB
- swapf lcd_data, W ; pobierz znak
- andlw 0xF0
- bcf PORTB, LCD_E_BIT
- nop
- iorlw LCD_E ; ustaw E
- movwf PORTB
- goto $+1
- bcf PORTB, LCD_E_BIT
- call delay_20ms
- return
- lcd_send ;wysylanie danych do LCD
- movwf lcd_data
- andlw 0xF0
- iorlw LCD_RS | LCD_E ; ustaw RS i E
- movwf PORTB
- swapf lcd_data, W ; pobierz znak
- andlw 0xF0
- bcf PORTB, LCD_E_BIT
- nop
- iorlw LCD_RS | LCD_E ; ustaw RS i E
- movwf PORTB
- goto $+1
- bcf PORTB, LCD_E_BIT
- call delay_20ms
- return
- lcd_send_first_fs
- movlw LCD_E | LCD_D5 | LCD_D4
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- return
- lcd_function_set
- movlw LCD_E | LCD_D5
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- movlw LCD_E | LCD_D7 | LCD_D6
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- return
- lcd_display_off
- movlw LCD_E
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- movlw LCD_E | LCD_D7
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- return
- lcd_init_entry_mode
- movlw LCD_E
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- movlw LCD_E | LCD_D6
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- call delay_20ms
- return
- lcd_display_clear
- movlw LCD_E
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- movlw LCD_E | LCD_D4
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- call delay_20ms
- return
- lcd_display_on
- movlw LCD_E
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- movlw LCD_E | LCD_D7 | LCD_D6
- movwf PORTB
- goto $+1
- goto $+1
- bcf PORTB, LCD_E_BIT
- call delay_20ms
- return
- delay_20ms
- movlw D'23'
- movwf tmp2
- call delay_1ms
- decfsz tmp2, f
- goto $-2
- return
- delay_5ms
- movlw D'5'
- movwf tmp2
- call delay_1ms
- decfsz tmp2, f
- goto $-2
- return
- delay_1ms
- call delay_600us
- call delay_298us
- movlw D'32'
- movwf tmp
- decfsz tmp, f
- goto $-1
- nop
- return
- delay_600us
- call delay_298us
- call delay_298us
- return
- delay_298us
- movlw 61
- movwf tmp
- decfsz tmp, f
- goto $-1
- nop
- nop
- return
- _end
- goto _end
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement