
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		
+
| file: /Techref/member/RK-Catz-/index.htm, 18KB, , updated: 2011/9/15 13:00, local time: 2025/10/31 13:04, 
owner:  , 
 
216.73.216.212,10-3-97-86:LOG IN | 
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://techref.massmind.org/techref/member/RK-Catz-/index.htm"> Member Homepage for LCD HD44780 2X16 4 bit </A> | 
| Did you find what you needed? |