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_DISPLAY_CLEAR equ 0x01 ; czyszczenie
- LCD_RETURN_HOME equ 0x02 ; skok na początek
- LCD_ENTRY_MODE_SET equ 0x04 ; zmiana trybu pracy
- LCD_DISPLAY_ON_OFF equ 0x08 ; sterowanie
- LCD_CURSOR_DISPLAY_SHIFT equ 0x10 ; przesunięcie kursora/wyświetlacza
- LCD_FUNCTION_SET equ 0x20 ; ustawienie podst. funkcji
- LCD_SET_CGRAM equ 0x40 ; ustawienie adresu CGRAM
- LCD_SET_DDRAM equ 0x80 ; ustawienie adresu DDRAM
- ;argumenty
- ;entry mode set
- LCD_EM_INC equ 0x02 ; inc kursor
- LCD_EM_DEC equ 0x00 ; dec kursor
- LCD_EM_DSPSHFT equ 0x01 ; przesunięcie całego wyświetlacza
- ;display on/of
- LCD_DC_DSPON equ 0x04 ; włącz wyśw.
- LCD_DC_CRSRON equ 0x02 ; włącz kursor
- LCD_DC_BLINK equ 0x01 ; znak na kursorze miga
- ; cursor/display shift
- LCD_SH_DSP equ 0x08 ; przesuń ekran
- LCD_SH_CURSOR equ 0x00 ; przesuń kursor
- LCD_SH_RIGHT equ 0x04 ; w prawo
- LCD_SH_LEFT equ 0x00 ; w lewo
- ;function set
- LCD_FS_DATA8 equ 0x10 ; 8-bitó
- LCD_FS_DATA4 equ 0x00 ; 4-bity
- LCD_FS_2LINES equ 0x08 ; 2 linie wyświetlacza
- LCD_FS_1LINE equ 0x00 ; 1 linia wyświetlacza
- LCD_FS_5x10 equ 0x04 ; font 5x10
- LCD_FS_5x8 equ 0x00 ; font 5x8
- RB3 equ 0x03 ; 3 bit portu B
- ENTER equ 0xC0
- LCD_MODE_DATA equ 0x0C ; 1 do RS - dane
- LCD_MODE_CTRL equ 0x08 ; 0 do RS - komendy
- UDATA
- t_ms RES 2
- LCD_data RES 1 ; miejsce na dane wysylane
- d1 RES 1
- d2 RES 1
- d3 RES 1
- keyPressed RES 1
- LCD_SEND MACRO MODE ; MODE - data albo command
- movf LCD_data, W ; ściągamy dane z W
- andlw 0xF0 ; zostawić 4 najstarsze bity
- iorlw MODE ; ustawienie RS i E
- movwf PORTB
- swapf LCD_data, W ; snowu ściągamy dane z W
- andlw 0xF0 ; teraz 4 najmłodsze
- bcf PORTB, RB3 ; stan niski na E
- nop
- iorlw MODE
- movwf PORTB
- nop
- nop
- bcf PORTB, RB3
- ENDM
- SEND_CMD MACRO CMD
- movlw CMD
- movwf LCD_data
- LCD_SEND LCD_MODE_CTRL
- call DELAY_100us
- ENDM
- PUT_CHAR MACRO CHAR
- SEND_CHAR CHAR
- call DELAY_
- ENDM
- 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
- bcf OPTION_REG, NOT_RBPU ; włączenie pull-up na PORTB
- movlw B'00000110' ; przełączenie wejść na cyfrowe
- movwf ADCON1 ; poprzez odłączenie przetwornika A/C
- clrf TRISA ; ustawienie wyprowadzeń PORTA na wyjścia
- movlw B'00000000' ; ekran
- movwf TRISB ; poprzez bity trisb
- bcf STATUS, RP0 ; wybór banku 0
- call lcd_init
- banksel TRISC
- movlw b'10101010'
- movwf TRISC
- START
- goto displayportc
- goto START
- ;M A R C
- ;I N S U
- ;R Y V L
- ;E O _ U
- displayportc
- banksel PORTC
- ;kolumna A,B,C,D
- bcf PORTC, 0
- bsf PORTC, 2
- bsf PORTC, 4
- bsf PORTC, 6
- btfsc PORTC, 1 ;INDEX 0,0
- goto $+3
- movlw 'U'
- goto end_check
- btfsc PORTC, 3 ;INDEX 0,0
- goto $+3
- movlw 'L'
- goto end_check
- btfsc PORTC, 5 ;INDEX 0,0
- goto $+3
- movlw 'U'
- goto end_check
- btfsc PORTC, 7 ;INDEX 0,0
- goto $+3
- movlw 'C'
- goto end_check
- ;kolumna 3,6,9,#
- bsf PORTC, 0
- bcf PORTC, 2
- btfsc PORTC, 1 ;INDEX 0,0
- goto $+3
- movlw ' '
- goto end_check
- btfsc PORTC, 3 ;INDEX 0,0
- goto $+3
- movlw 'V'
- goto end_check
- btfsc PORTC, 5 ;INDEX 0,0
- goto $+3
- movlw 'S'
- goto end_check
- btfsc PORTC, 7 ;INDEX 0,0
- goto $+3
- movlw 'R'
- goto end_check
- ;kolumna 2,5,8,0
- bsf PORTC, 2
- bcf PORTC, 4
- btfsc PORTC, 1 ;INDEX 0,0
- goto $+3
- movlw 'O'
- goto end_check
- btfsc PORTC, 3 ;INDEX 0,0
- goto $+3
- movlw 'Y'
- goto end_check
- btfsc PORTC, 5 ;INDEX 0,0
- goto $+3
- movlw 'N'
- goto end_check
- btfsc PORTC, 7 ;INDEX 0,0
- goto $+3
- movlw 'A'
- goto end_check
- ;kolumna 1,4,7,E
- bsf PORTC, 4
- bcf PORTC, 6
- btfsc PORTC, 1 ;INDEX 0,0
- goto $+3
- movlw 'E'
- goto end_check
- btfsc PORTC, 3 ;INDEX 0,0
- goto $+3
- movlw 'R'
- goto end_check
- btfsc PORTC, 5 ;INDEX 0,0
- goto $+3
- movlw 'I'
- goto end_check
- btfsc PORTC, 7 ;INDEX 0,0
- goto $+3
- movlw 'M'
- goto end_check
- bsf keyPressed, 0
- goto displayportc
- end_check
- bcf keyPressed, 0
- call printChar
- movf PORTC, 0
- iorlw b'01010101'
- xorlw b'11111111'
- btfss STATUS, Z
- goto $-4
- goto START
- printChar
- banksel PORTB
- call send_char
- banksel PORTC
- return
- lcd_init ; Inicjalizacja wyświetlacza
- call DELAY_20ms
- ; wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
- movlw LCD_FUNCTION_SET | LCD_FS_DATA8 | (1 << RB3)
- movwf PORTB
- goto $+1 ; odczekaj 4 cykle
- goto $+1
- bcf PORTB, RB3 ; E = 0
- call DELAY_20ms
- ; ponowne wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
- movlw LCD_FUNCTION_SET | LCD_FS_DATA8 | (1 << RB3)
- movwf PORTB
- goto $+1 ; odczekaj 4 cykle
- goto $+1
- bcf PORTB, RB3 ; E = 0
- call DELAY_100us
- ; ponowne wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
- movlw LCD_FUNCTION_SET | LCD_FS_DATA4 | (1 << RB3)
- movwf PORTB
- goto $+1 ; odczekaj 4 cykle
- goto $+1
- bcf PORTB, RB3 ; E = 0
- call DELAY_100us
- SEND_CMD LCD_FUNCTION_SET | LCD_FS_DATA4 | LCD_FS_2LINES | LCD_FS_5x8
- SEND_CMD LCD_DISPLAY_ON_OFF
- SEND_CMD LCD_DISPLAY_CLEAR
- call DELAY_20ms
- SEND_CMD LCD_ENTRY_MODE_SET | LCD_EM_INC
- SEND_CMD LCD_DISPLAY_ON_OFF | LCD_DC_DSPON
- return
- ;procedury
- send_char
- movwf LCD_data
- LCD_SEND LCD_MODE_DATA
- call DELAY_100us
- return
- ; Pętle opóźniające, z generatora
- DELAY_100us
- ;100 cycles
- movlw 0x21
- movwf d1
- Delay_100us
- decfsz d1, f
- goto Delay_100us
- return
- DELAY_20ms
- ;19998 cycles
- movlw 0x9F
- movwf d1
- movlw 0x10
- movwf d2
- Delay_20ms
- decfsz d1, f
- goto $+2
- decfsz d2, f
- goto Delay_20ms
- goto $+1 ;2 cycles
- return
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement