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/27 17:32,
owner: ,
216.73.216.22,10-3-83-201: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://www.piclist.com/techref/member/RK-Catz-/index.htm"> Member Homepage for LCD HD44780 2X16 4 bit </A> |
| Did you find what you needed? |