Code:
;********************************************************************* ; MPLABIDEv8.2a ; Filename: LCD scherm v1.2 ; Doel: Educatief ; Author: Rob Kats ; pic: 16f648A ; snelheid: kristal = 20Mhz ;********************************************************************** ; ; Plaats op de juiste plaats in je prog. ; #include "c:\pic-programma\inc-files\print.inc" ; #define EN PORTB,2 ;EN = Enable (Laag actief). #define RS PORTB,3 ;RS = Register select. ;Register select ;0 = Instructie naar LCD. ;1 = Data naar LCD (leesteken). ;R/W Pin ligt aan massa Write = laag actief. ;Geen lees opdracht mogelijk. ;Het LCD scherm gebruikt bit 2 t/m bit 7 van PORTB . ;Bit 0,1 zijn vrij te gebruiken I/P of O/p. #define L_Z Tekst_F,0 #define Kolom_m Tekst_F,1 #define tekst_error_m Tekst_F,2 CBLOCK 0x2B ;Bank 0 TEMP_B ;TEMP algemeen. TEMP_D ;TEMP algemeen. TEMP_A ;TEMP algemeen. TEMP_C ;TEMP algemeen. TELLER ;Teller. Tekst_F ;Tekst flags. HONDERD ;ASCII waarde honderd tallen. TIEN ;ASCII waarde tien tallen. EEN ;ASCII waarde een tallen. CNTR1 CNTR2 CNTR3 NumH NumL TenK Thou Hund Tens Ones ENDC ;*************************************************************** ; **** LCD **** ; Gebaseerd op de HD44780U controller van Hitachi. ;*************************************************************** ;Ini lcd. LCD_INI: MOVLW 0x07 ;Alle pinnen digitaal BCF STATUS,RP1 BCF STATUS,RP0 ;Wissel naar bank 0 MOVWF CMCON CLRF PORTB BCF STATUS,RP1 BSF STATUS,RP0 ;Wissel naar bank 1. MOVLW B'00000010' ;Configuratie PORTB In/out. MOVWF TRISB ;Bit 0 en 1 zijn vrij te gebruiken. BCF STATUS,RP0 ;Terug naar bank 0. BSF EN ;*************************************************************** ;50 ms opstart tijd lcd.. CALL WACHT50 ;************************************************************* ;instellingen LCD scherm ;LCD staat na een reset op 8 bits mode. ;Function set BCF RS ;LCD op Instrucie modus. MOVLW B'00100000' ;Schijf instructie weg als 8 bits 1x MOVWF PORTB ;stobe. CALL PULS ;Function set ;b0 * b1* niet gebruikt. MOVLW B'00101000' ;4 bit data breedte (LCD b7,b4). CALL CMD ;font 5x8 b2. ;Display ;2 regels b3. MOVLW B'00001100' ;display aan b2. CALL CMD ;cursor zichtbaar b1. ;cursor knipperend b0. ;Entry MOVLW B'00000110' ;Cursor positie na elke schrijf actie. CALL CMD ;met 1 verhogen of verlagen b1. ;b0 shift actief.. ;***************************************************************** BSF L_Z ;Standaard leading zerro aan. ;***************************************************************** RETURN ;Terug aanroep LCD_INI ;LCD klaar voor gebruik. ;***************************************************************** ; ***** De 4 bits Motor ***** ; *** Stuur karakter/instructie naat LCD afhankelijk van status RS *** CMD: MOVWF TEMP_D ;Bewaar karakter/instructie in TEMP_D. MOVF PORTB,W MOVWF TEMP_B ;Bewaar status vrije uitgangen van PORTB in TEMP_B. ;b7..b4 MOVLW B'00001111' ;Maskeer PORTB en RS,EN . ANDWF TEMP_B,F ;Bewaar status vrije uitgangen van PORTB. MOVLW B'11110000' ANDWF TEMP_D,W ;Maskeer TEMP_D. ADDWF TEMP_B,W ;Voeg b0,b4 van TEMP_D en b0,b1 van TEMP_B samen. MOVWF PORTB ;Plaats data op PORTB (LCD). CALL PULS ;Verstuur data naar LCD. SWAPF TEMP_D,F ;Swap nibbles in TEMP_D. ;b3..b0 MOVLW B'00001111' ;andere helft van de instructie ANDWF TEMP_B,F ;Herhaling voor b0,b3. MOVLW B'11110000' ANDWF TEMP_D,W ADDWF TEMP_B,W MOVWF PORTB CALL PULS RETURN ;******************************************************************** PULS: BCF EN ;Creëer stobe signaal. CALL WACHT ;voor overdracht data/instructie BSF EN ;Verwerkings tijd voor dat volgende RETURN ;uitgevoerd kan worden. ;******************************************************************** PRINT: BSF RS ;De data die naar het LCD CALL CMD ;gescheven wordt is een ascii karakter. BCF RS ;Zet LCD daarna op instuctie. RETURN ;******************************************************************** ;Schuif cursor n plaatsen naar links,n komt uit W. SCL: MOVWF TELLER A12 MOVLW B'00010000' CALL CMD DECFSZ TELLER,F GOTO A12 RETURN ;******************************************************************** ;Schuif cursor n plaatsen naar rechts n komt uit W. SCR: MOVWF TELLER A13 MOVLW B'00010100' CALL CMD DECFSZ TELLER,F GOTO A13 RETURN ;******************************************************************** ;Backspace plaats curssor 1 plaats terug en wis karakter. BACKS: MOVLW B'00010000' ;Cursor 1 plaats terug naar rechts. CALL CMD MOVLW " " CALL PRINT ;Schrijf karakter "spatie" MOVLW B'00010000' ;Cursor 1 plaats terug naar rechts. CALL CMD RETURN ;******************************************************************** ;Wis gehele LCD scherm zet cursor terug op regel 1 positie 0. CLS: MOVLW B'00000001' ;Clear instructie naar LCD. CALL CMD RETURN ;******************************************************************** ;Schuif scherm n plaatsen naar rechts n komt uit W. SDR: MOVWF TELLER A16: MOVLW B'00011100' CALL CMD CALL WACHT50 DECFSZ TELLER,F GOTO A16 RETURN ;******************************************************************** ;Schuif scherm n plaatsen naar links n komt uit W. SDL: MOVWF TELLER A17: MOVLW B'00011000' CALL CMD CALL WACHT50 DECFSZ TELLER,F GOTO A17 RETURN ;******************************************************************** ;Zet cursor op regel 1 of regel 2 kolom x. ;Regel,kolom komt uit W. ;Regel 1 en regel 2 zijn 40 karakters lang eeste 16(0 t/m 15) zichtbaar. ;MOVLW 0x03 regel 1 kolom 3 ;MOVLW 0x41 regel 2 kolom 1 REGEL: ADDLW B'10000000' CALL CMD RETURN ;******************************************************************** ;Plaats cursor terug op regel 1,positie 0. ;Inhoud scherm blijft ongewijzigd. RETURN_H ADDLW B'00000010' CALL CMD RETURN ;******************************************************************** ;Binaire(byte)W naar Hex ascii waarde. HEX: MOVWF TEMP_A MOVLW 0x02 MOVWF TELLER MOVLW B'11110000' ANDWF TEMP_A,W MOVWF TEMP_B SWAPF TEMP_B,F MOVF TEMP_B,W A91 SUBLW 0X09 ;W-L BTFSS STATUS,C GOTO A90 ;C <=9 MOVF TEMP_B,W ADDLW 0x30 ;NC >9 CALL PRINT GOTO A88 A90: MOVF TEMP_B,W ADDLW 0x37 CALL PRINT A88: MOVLW B'00001111' ANDWF TEMP_A,W MOVWF TEMP_B DECF TELLER,F BTFSS STATUS,Z GOTO A91 RETURN ;******************************************************************** ;Binair byte waarde W naar Binair ascii waarde. BIN: MOVWF TEMP_A MOVLW 0x08 ;1 byte. MOVWF TELLER A72: RLF TEMP_A,F ;Roteer links door carry .(print carry) BTFSS STATUS,C ; GOTO A69 ;carry =0 GOTO A70 ;carry =1 A69: MOVLW 0x30 CALL PRINT ;Print ascii "0" GOTO A71 A70: MOVLW 0x31 ;Print ascii "1" CALL PRINT A71: DECFSZ TELLER,F GOTO A72 RETURN ;******************************************************************** ;Binaire waarde byte W naar decimale ascii waarde. DEC: CLRF HONDERD ;Variabelen 0x00. CLRF TIEN CLRF EEN MOVWF TEMP_A ;W naar TEMP_A. HUN MOVLW 0x64 ;Waarde 100 in W. SUBWF TEMP_A,W ;Trek 100 af van TEMP_B. BTFSS STATUS,C ;TEMP_B groter dan 100 ? GOTO TEN ;Nee ga naar 10. INCF HONDERD,F MOVWF TEMP_A GOTO HUN ;Ja:HONDERD = HONDERD +1. TEN MOVLW 0x0A ;Waarde 10 in W. SUBWF TEMP_A,W ;Trek 10 af van TEMP_B . BTFSS STATUS,C ;TEMP_B groter dan 10 ? GOTO ONE ;Nee ga naar 1. INCF TIEN,F MOVWF TEMP_A GOTO TEN ;Ja ONE: MOVF TEMP_A,W MOVWF EEN MOVLW "0" ;Ascii waarde 0. ADDWF HONDERD,F ADDWF TIEN,F ADDWF EEN,F ;Print decimale ascii waarde met leading zerro. BTFSS L_Z GOTO A56 MOVF HONDERD,W CALL PRINT MOVF TIEN,W CALL PRINT MOVF EEN,W CALL PRINT RETURN ;Print decimale ascii waarde zonder leading zerro. A56: MOVLW "0" XORWF HONDERD,W BTFSC STATUS,Z ;Honderd <> ascii"0". GOTO A57 ;nee honderd = ascii"0". MOVF HONDERD,W ;ja CALL PRINT GOTO A59 ;geen leading zerro. A57 MOVLW "0" XORWF TIEN,W BTFSC STATUS,Z ;tien <> ascii"0". GOTO A58 ;nee tien = ascii"0". A59 MOVF TIEN,W ;ja CALL PRINT A58 MOVF EEN,W CALL PRINT RETURN ;******************************************************************** ;Binaire 16 bits waarde naar decimale ascii waarde. ;16 bits waarde staat in NumH ,NumL. ;This routine downloaded from http://www.piclist.com ....THANKS GUY'S for help me out. CONVERT16: swapf NumH, w iorlw B'11110000' movwf Thou addwf Thou,f addlw 0XE2 movwf Hund addlw 0X32 movwf Ones movf NumH,w andlw 0X0F addwf Hund,f addwf Hund,f addwf Ones,f addlw 0XE9 movwf Tens addwf Tens,f addwf Tens,f swapf NumL,w andlw 0X0F addwf Tens,f addwf Ones,f rlf Tens,f rlf Ones,f comf Ones,f rlf Ones,f movf NumL,w andlw 0X0F addwf Ones,f rlf Thou,f movlw 0X07 movwf TenK ; At this point, the original number is ; equal to ; TenK*10000+Thou*1000+Hund*100+Tens*10+Ones ; if those entities are regarded as two's ; complement binary. To be precise, all of ; them are negative except TenK. Now the number ; needs to be normalized, but this can all be ; done with simple byte arithmetic. movlw 0X0A Lb1: addwf Ones,f decf Tens,f btfss STATUS,C goto Lb1 Lb2: addwf Tens,f decf Hund,f btfss STATUS,C goto Lb2 Lb3: addwf Hund,f decf Thou,f btfss STATUS,C goto Lb3 Lb4: addwf Thou,f decf TenK,f btfss STATUS,C goto Lb4 ;**************************************************************** ;My additional part. MOVLW "0" ADDWF TenK,F ;Convert naar ASCII. ADDWF Thou,F ADDWF Hund,F ADDWF Tens,F ADDWF Ones,F BTFSS L_Z GOTO T2 ;** indirect adressering ** MOVF FSR,W ;Bewaar FSR register in TEMP_FSR. MOVWF CNTR1 ;Indien deze buiten print.inc word gebruikt. MOVLW TenK ;Zet FRS op begin 16 bit conversie. MOVWF FSR MOVLW 0x05 MOVWF TELLER ;Indien uitkomst digit = "0" print een " ".(spatie) T1 MOVLW "0" XORWF INDF,W ;Is de waarde waar FSR na toe wijst "0"? BTFSC STATUS,Z GOTO SPATIE ;Ja: GOTO T2 ;Nee SPATIE MOVLW " " ;Inhoud waar FSR na toe wordt een spatie. MOVWF INDF INCF FSR,F DECFSZ TELLER,F GOTO T1 T2: MOVF TenK,W CALL PRINT MOVF Thou,W CALL PRINT MOVF Hund,W CALL PRINT MOVF Tens,W CALL PRINT MOVF Ones,W CALL PRINT MOVF CNTR1,w MOVWF FSR ;Oude waarde terug in FSR. RETURN ;******************************************************************** ;pauze. WACHT: MOVLW 0x10; MOVWF CNTR2 delay2 MOVLW 0xFE; MOVWF CNTR1 delay3 DECFSZ CNTR1,F GOTO delay3 DECFSZ CNTR2,F GOTO delay2 RETURN ;******************************************************************** ;Reset lcd na power up. WACHT50: MOVLW 0x02 MOVWF CNTR3 delay4: MOVLW 0xA3 MOVWF CNTR2 delay5: MOVLW 0xFF MOVWF CNTR1 delay6: DECFSZ CNTR1,F GOTO delay6 DECFSZ CNTR2,F GOTO delay5 DECFSZ CNTR3,F GOTO delay4 RETURN ;********************************************************************* WACHT500: MOVLW 0x20 MOVWF CNTR3 delay7: MOVLW 0xA2 MOVWF CNTR2 delay8: MOVLW 0xA0 MOVWF CNTR1 delay9: DECFSZ CNTR1,F GOTO delay9 DECFSZ CNTR2,F GOTO delay8 DECFSZ CNTR3,F GOTO delay7 RETURN ;********************************************************************* ;Toon een tekst gekozen uit een tabel ;index komt uit W.(zie tabel) PRINT_INDEX: MOVWF TEMP_A ;Index tekst in temp_A. CLRF TELLER ;Pointer op begin tabel. A98 MOVF TELLER,W ;Pointer in W. CALL TABEL ;Haal tekst index op uit programma XORWF TEMP_A,W ;geheugen. BTFSC STATUS,Z ;index gelijk aan gewenste index in temp_A ? GOTO TEKST# ;Ja: print tekst. A97 MOVF TELLER,W ;Nee: zoek naar einde regel. INCF TELLER,F CALL TABEL XORLW 0xFF ;Einde tekst regel ? BTFSS STATUS, Z GOTO A97 ;Nee:zoek verder. GOTO A98 ;Ja: TEKST#: INCF TELLER,F MOVF TELLER,W ;Pointer op display positie. CALL TABEL ;Haal Tekst positie op. MOVWF TEMP_B XORLW 0xFF ;Display tekst tot einde regel is ;bereikt. BTFSC STATUS, Z RETURN MOVF TEMP_B,W CALL PRINT GOTO TEKST#; ****************************************************************** ;8 eigen karakters 0 t/m 7. ;Zet lcd op CGRAM adres 0x00 instructie 01000000. ;Haal data die naar CGRAM gescheven moet worden op uit een tabel (K_DATA). ;Indien de data <> aan 255 schrijf het in CGRAM. ;Na iedere schrijf actie word CGRAM automatisch met 1 opgehoogd. ;Eigen karakters in een programma: ;Ini (call EIGEN_K) dit plaats de inhoud van K_DATA in CGRAM ;Aanroep eigen karakter: movlw 0 t/m 7 call print. EIGEN_K: CLRF TELLER ;pointer wijs naar begin data tabel. MOVLW B'01000000' CALL CMD ;Lcd wijs nu naar CGRAM adres xx000000.(0 t/m 63 = 64 bytes groot) B1: MOVF TELLER,W CALL K_DATA ;Haal data op uit karakter tabel. MOVWF TEMP_A ; XORLW 0xFF ;Is data einde tabel? BTFSC STATUS, Z GOTO DDRAM ;Ja: MOVF TEMP_A,W ;Nee: INCF TELLER,F ;Pointer = pointer+1. CALL PRINT ;Schrijf data naar CGRAM en verhoog GOTO B1 ;CGRAM adres automatisch met 1. DDRAM MOVLW B'10000000' ;Terug naar DDRAM regel 1 positie 0. CALL CMD RETURN ;******************************************************************** ORG 0x400 ;Plaats tekst in programma geheugen 0400 hex. ;Tekst om weer te geven opgegeven in W als: TOP: MOVWF TEMP_B ;Bewaar pointer. MOVLW 0x04 ;Zet pc op juiste pagina. MOVWF PCLATH ; MOVF TEMP_B,W ; ADDWF PCL,F ;Haal gegevens op binnen de pagina. ;Formaat Tekst:Index(0x00..0x0F),"tekst",0xFF ;Tekst tabel. DT 0x00, " ",0xFF DT 0x01, "Maak keuze",0xFF DT 0x02, "Toerental",0xFF DT 0x03, "Pulslengte ",0xFF DT 0x04, "Rev Counter",0xFF DT 0x05, "Knight Rider",0xFF DT 0x06, "Err-W=0 SCL/R:",0xFF DT 0x07, "usec x 8",0xFF DT 0x08, "X",0xFF DT 0x09, "Rob Kats",0xFF DT 0x0A, " ",0xFF DT 0x0B, "--Meter--",0xFF DT 0x0C, "Test regel 2",0xFF DT 0x0D, "Instellingen",0xFF ;********************************************************************* ;Plaats eigen karakters in programma geheugen 0500 hex. ORG 0x500 K_DATA: MOVWF TEMP_B ;Bewaar pointer. MOVLW 0x05 ;Zet pc op juiste pagina. MOVWF PCLATH ; MOVF TEMP_B,W ; ADDWF PCL,F ;Haal gegevens op binnen de pagina. ;Data voor CGRAM (Eigen karakters)5 bit breed x 8 bit hoog DT B'00000000',B'00000001',B'00000010',B'00000100',B'00000100', B'00000100',B'00001000',B'00010000';Karakter-0 DT B'00000000',B'00000001',B'00000010',B'00000100',B'00000100', B'00000100',B'00001000',B'00010000';Karakter-1 DT B'00000100',B'00000100',B'00000100',B'00000100',B'00000100', B'00000100',B'00000100',B'00000100';Karakter-2 DT B'00000000',B'00010000',B'00001000',B'00000100',B'00000100', B'00000100',B'00000010',B'00000001';Karakter-3 DT B'00001111',B'00001111',B'00001111',B'00001111',B'00001111', B'00001111',B'00001111',B'00001111';Karakter-4 DT B'00001111',B'00001111',B'00001111',B'00001111',B'00001111', B'00001111',B'00001111',B'00001111';Karakter-5 DT B'00001111',B'00001111',B'00001111',B'00001111',B'00001111', B'00001111',B'00001111',B'00001111';Karakter-6 DT B'00001111',B'00001111',B'00001111',B'00001111',B'00001111', B'00001111',B'00011111',B'00011110';Karakter-7 DT 0xFF