Choď na obsah Choď na menu

zobrazenie na LCD

clrf Pozicia_znaku_v_riadku aktualizuj_riadky ;Inicializacia premennych clrf Aktualny_pocet_riadkov_na_LCD ;Vrat sa na predosly pociatocny bod odriadkovania zobrazovania textu na LCD, ak tam nejake... ;...riadky su a nebol tiez presiahnuty maximalny pocet pisanim, lebo vtedz treba riadky... ;...naopak posunut hore. Uvedene podmienky rozhoduju o tom, v akom stave bude vypinac. ;Podmienky toho su dole v programe. btfss Vypinac_posunu_riadkov_spat goto preskoc_riadok_koniec2 ;kod sa vykona iba raz, cize vypinac sa vypina (inak bz to blblo pri deletovani,... ;...ked uz hore nad displejom nie su ziadne dalsie riadky na pusuvanie) bcf Vypinac_posunu_riadkov_spat ;V pripade rucneho posunu riadkov sipkami deaktivuj automaticke posuvanie btfss Rucny_posun_riadkov decf Pocet_preskocenych_riadkov,f btfss Rucny_posun_riadkov goto preskoc_riadok_koniec2 movlw ADR_H_ENTER movwf FSR1H movf posun_riadku_y_spat,w sublw ADR_L_ENTER addwf Pocet_preskocenych_riadkov,w movwf FSR1L incf FSR1L,f movf INDF1,w ;addlw .10 movwf Aktualna_pozicia_v_texte_RAM preskoc_riadok_koniec2 ;000000 ;Nastavenie pociatocnej adresy pamate bodov odriadkovania A zaroven posun v tejto pamati... ;...o hodnotu, kolko krat bol presiahnuty posledny riadok displeja. (Text sa najprv... ;...dostane do posledneho riadka, a potom sa tato hodnota napocitava kazdym dalsim riadkom.) movlw ADR_H_ENTER movwf FSR1H movf posun_riadku_y_spat,w sublw ADR_L_ENTER addwf Pocet_preskocenych_riadkov,w movwf FSR1L ;inicializacia pocitadla bodov odriadkovania (pouziva sa pri pohybe kurzorom v texte) ; clrf pocitadlo_bodov ; movf Pocet_preskocenych_riadkov,w ; movwf pocitadlo_bodov ;Vloz poziciu zapisanu v bode odriadkovania do interneho pocitadla zobrazovanych znakov. ;(Tymto bodom sa zacina prvy zobrazovany riadok.) movf INDF1,w movwf Pozicia_znaku_v_RAM movwf Najdeny_bod_odriadkovania movwf Pozicia_znaku_v_riadku ;Vloz aktualnu polohu v texte do globalnej premenej. Neukladaj pri rucnom posune. ;(Sluzi v programe ako referencna hodnota pri rucnych pohyboch textu po LCD.) ;clrf Pocet_riadkov_na_preskocenie ; movf Pocet_preskocenych_riadkov,w ;oooo movlw Pocet_riadkov_LCD - 1 subwf Celkovy_pocet_riadkov,w ;if(Celkovy_pocet_riadkov - Pocet_riadkov_LCD) > 0 C=1 btfss STATUS,C goto preskoc_pamat_riadkov ;ukladaj len ak je posun textu nenulovy... movlw Pocet_riadkov_LCD - 1 ;...tj. nachadzaju sa skryte riadky nad displejom. subwf Celkovy_pocet_riadkov,w movwf Pocet_riadkov_na_preskocenie ;ooo ULOZI SA POCET RIADKOV NAVIAC (NAD POCET ZOBRAZENY NA DISPLEJI) preskoc_pamat_riadkov ;Nastavenie pociatocnej adresy textovej pamate A zaroven posun v tejto pamati... ;...o hodnotu zapisanu v akt. bode odridkovania. Tym znakom zacina prvy zobrazovany riadok. movlw ADR_H_TEXT movwf FSR0H movlw ADR_L_TEXT addwf INDF1,w movwf FSR0L ;Posun v pamati bodov odriadkovania o 1 (jeho hodnotou sa konci prvy zobrazovany riadok) ;Ten je pouzity ako prvy v textovej zobrazovacej slucke. incf FSR1L,f ; incf pocitadlo_bodov,f ;Vymazanie displeja pred zobrazenim aktualneho textu call Clear_display opakuj_displej ;Nacitanie aktualneho znaku z textovej pamate do W registra. ;Zobraz ten znak na displej, alebo ukonci cyklus citania, ak je to 0. movf INDF0,w btfsc STATUS,Z goto opusti_displej call SPIdisplejData ;Inkrementuj adresu textovej pamati a interne pocitadlo znakov o 1. incf FSR0L,f incf Pozicia_znaku_v_RAM,f ;pocitadlo pozicie znaku v textovej pamati incf Pozicia_znaku_v_riadku,f ;pocitadlo poctu znakov v riadku ;Porovnaj hodnotu interneho pocitadla s hodnotou bodu odriadkovania. ;Ak sa zhoduju, inkrementuj na dalsi bod odriadkovania a odriadkuj displej. movf INDF1,w subwf Pozicia_znaku_v_RAM,w ;subwf posun_kurzora_x_spat,w btfss STATUS,Z goto preskoc_odriadkovanie ;Ulozenie aktualneho bodu odriadkovania do globalnej premennej (pouziva sa pre kurzor) movf INDF1,w movwf Najdeny_bod_odriadkovania ;Inkrementuj na dalsi bod odriadkovania o 1 a posun sa na dalsi riadok incf FSR1L,f ; incf pocitadlo_bodov,f incf Aktualny_pocet_riadkov_na_LCD,f ;Vykonaj presun na dalsi riadok na LCD displeji movf Aktualny_pocet_riadkov_na_LCD,w call Presun_na_riadok_LCD ;vynuluj pocitadlo poctu znakov v riadku clrf Pozicia_znaku_v_riadku ;Aktivuj vypinac navratu prevysujucich riadkov nad displejom, ak tam nejake su. ;(tento vypinac zostane zapnuty, len ak nebol dosiahnuty max. pocet riadkov.... ;...k zobrazeniu (kod nizsie), alebo ak sa us posunutie nevykonalo). movf Pocet_preskocenych_riadkov,w btfss STATUS,Z bsf Vypinac_posunu_riadkov_spat ;Po dosiahnuti maximalneho poctu riadkov ktore sa maju zobrazit na LCD,... ;...posun sa na dalsi pociatocny bod odriadkovania (tj. riadky sa posunu celkovo hore) movlw Pocet_riadkov_LCD subwf Aktualny_pocet_riadkov_na_LCD,w btfss STATUS,Z goto preskoc_riadok_koniec ;deaktivuj vypinac navratu prevysujucich riadkov nad displejom bcf Vypinac_posunu_riadkov_spat ;opusti automaticke posuvanie riadkov v pripade rucneho posunu sipkami btfsc Rucny_posun_riadkov goto opusti_displej ;Posun prevysujuci riadok hore nad displej. (tj. zostava len v pamati PIC) incf Pocet_preskocenych_riadkov,f ;zopakuj cely kod zobrazenia na LCD kvoli aktualizacii s posunutymi riadkami goto aktualizuj_riadky preskoc_riadok_koniec preskoc_odriadkovanie goto opakuj_displej opusti_displej