LCD display och PIC *med bilder på sidan 2*
LCD display och PIC *med bilder på sidan 2*
Hej, Jag undrar om man kan koppla in en sån här display till en PIC, (jag är inte särskilt bra på PICar, så gärna om det finns något lätt sätt): http://www.trimlog.se/butik/pdf/LCD1602BLC.pdf
Antingen till en 16F628A eller till en 12F629.
//Daniel A
Antingen till en 16F628A eller till en 12F629.
//Daniel A
Senast redigerad av squiz3r 17 mars 2007, 14:38:23, redigerad totalt 1 gång.
Skall inte vara några problem vad jag ser vid en snabbtitt. Antigen kör du displayen i 4 bitarsmode (finns en tråd om det). Eller så köper du ett shiftregister som är enkelt att använda.
Klart du kan. Den här får väl kvala in som en "lättkopplad" display eftersom du bara behöver +5 V för att driva den.
Angående "lätt" så är de flesta teckenbaserade displayer ganska snälla att labba runt med. Leta upp ett datablad för controllern (eller exempelkod för KS0066) så ska det kvitta vilken PIC du använder, bara den har pinnar så det räcker
Angående "lätt" så är de flesta teckenbaserade displayer ganska snälla att labba runt med. Leta upp ett datablad för controllern (eller exempelkod för KS0066) så ska det kvitta vilken PIC du använder, bara den har pinnar så det räcker

Shiftregistret är (för mig) väldigt enkelt att koppla in. Du spar 6 utgångar på detta. Fast hursom så är det ju en felkälla till om man vill se det så.
Angående displayer så finns det hur mycket exempel som helst på nätet både med och utan shiftregister. Det finns för 628:an färdigt. Bara att läsa och lära. Sök en omgång med google.
Displayer är inte så svåra att styra läs bara databladet och var noga med timingen i början (vid initieringen) så fungerar det sen.
Om du har en dator med parallellport kan du börja labba där. VB är enkelt att styra en display ifrån. Se tex Min trådom detta. När du fått fyr på bitarna så är det superenkelt.
Angående displayer så finns det hur mycket exempel som helst på nätet både med och utan shiftregister. Det finns för 628:an färdigt. Bara att läsa och lära. Sök en omgång med google.
Displayer är inte så svåra att styra läs bara databladet och var noga med timingen i början (vid initieringen) så fungerar det sen.
Om du har en dator med parallellport kan du börja labba där. VB är enkelt att styra en display ifrån. Se tex Min trådom detta. När du fått fyr på bitarna så är det superenkelt.
Skulle den här koden fungera? http://www.piclist.com/techref/io/lcd/4b16x2lcd-ab.htm
Tack för alla svar!
//Daniel A
Tack för alla svar!
//Daniel A
> (eller har en länk)?
http://www.epemag.wimborne.co.uk/resources.htm
Se lcd1.pdf och lcd2.pdf mitt på sidan.
http://www.epemag.wimborne.co.uk/resources.htm
Se lcd1.pdf och lcd2.pdf mitt på sidan.
v-g: istället för 74HC164 så är 74HC595 trevligare, har load också
74HC595
Behöver förvisso 3 pinnar istället för 2, men data på utpinnarna ändras inte under utmatningen. Kör man på 4 bitars läge så kan hela displayen hängas på 74HC595. Sidan 3 i pdf:en http://www.parallax.com/dl/docs/cols/nv ... l/nv62.pdf
(från: jag har tur på google)
74HC595
Behöver förvisso 3 pinnar istället för 2, men data på utpinnarna ändras inte under utmatningen. Kör man på 4 bitars läge så kan hela displayen hängas på 74HC595. Sidan 3 i pdf:en http://www.parallax.com/dl/docs/cols/nv ... l/nv62.pdf
(från: jag har tur på google)
I exempel programet till PICen (på dokument 2 som sodjan länkade till) stog det "retlw 'H' " finns det i ASM så att man kan skriva in det som en bokstav tex. H o sen ta ut det som en binär kod, eller hur funkar det exemplet?
Jag hadde nog tänkt köra det direct från PICen utan shift register.
//Daniel A
Jag hadde nog tänkt köra det direct från PICen utan shift register.
//Daniel A
OffT:
Micke_s:Har båda kretsarna hemma så jag vet
. Men 164 är så grymt enkel att jag just nu kör med den i tex tråden som länkats ovan. Och "as we write" så håller jag på med en kabel för att köra en blå16x2 på kortet med 628.
Detta kortet är smidigt (anser jag) då man slipper koppla 10 st sladdar till PICen utan klarar sig med 4 st (+jord då) Då man _VET_ att kortet fungerar anser jag det vara att minimera felkällor.
Har faktist kört just den kodsnutten snutten på min *host*BS2*host* funkade vad jag minns.
Micke_s:Har båda kretsarna hemma så jag vet

Detta kortet är smidigt (anser jag) då man slipper koppla 10 st sladdar till PICen utan klarar sig med 4 st (+jord då) Då man _VET_ att kortet fungerar anser jag det vara att minimera felkällor.
Har faktist kört just den kodsnutten snutten på min *host*BS2*host* funkade vad jag minns.
Nu har jag en hel helg på mig att labba med displayen!
Eriikh: Jag tror att jag tar din kod att labba lite med.
Men jag vill köra med intosc men eriikh's kod är för kristall, kan jag byta ut hela konfig snutten till
och i eriikh's kod stog det:
Movlw 0x45 ; Send "E"
Call SendText4bit
kan jag istället med samma resultat skriva:
movlw a'E'
call Sendtext4bit
Och vad menas med "ISR Equ 0x004 " ?
Tack!
//Daniel A
Eriikh: Jag tror att jag tar din kod att labba lite med.
Men jag vill köra med intosc men eriikh's kod är för kristall, kan jag byta ut hela konfig snutten till
Kod: Markera allt
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
Movlw 0x45 ; Send "E"
Call SendText4bit
kan jag istället med samma resultat skriva:
movlw a'E'
call Sendtext4bit
Och vad menas med "ISR Equ 0x004 " ?
Kod: Markera allt
; LCD Test Program v1.0 made by Erik Henriksson
; This program is ment to run at a PIC16F628A @ 20MHz .
; It can be run at any pic with 8 io-pins if you make some small changes.
; Pinmap is:
; RB0-3 = D4-7
; RS = 6
; RW = 7
; EN = 5
; The control pins is easy to change. See "Alias declarations".
; If you want to run at 4MHz you have to change the delays to speed the code up. If
; you aren't in a hurry you can drive without any changes.
;
; Feel free to copy but write my name in your project and send me a mail so I can see
; how popular the code is. =)
; Email address is: eriikh(-at-)hotmail(-dot-)com
; (Change to the real address, the extra characters is only for spam removing.)
;
; Enjoy!
;
;*********************************************
; Start of program
;*********************************************
; CONFIG, INCLUDE & LIST
;*********************************************
__CONFIG 0x036A
INCLUDE p16f628a.inc
LIST p=16f628A
;*********************************************
; End
;*********************************************
; What to do when reset
;*********************************************
Org 0x001
Goto Start
;*********************************************
; End
;*********************************************
; Alias declarations
;*********************************************
ISR Equ 0x004
En Equ 5
RS Equ 6
RW Equ 7
;*********************************************
; End of Alias declarations
;*********************************************
; Variable declaration
;*********************************************
;Avalible RAM in bank0: 0x0020-0x06F
;
; Delay variables
d1 Equ 0x020
d2 Equ 0x021
d3 Equ 0x022
d4 Equ 0x023
; Lcd variables
Hi_bits Equ 0x024
Lo_bits Equ 0x025
tmp Equ 0x026
;*********************************************
; End of Variable declaration
;*********************************************
; Timer interrupt
;*********************************************
Org isr
Retfie
; Do nothing
;*********************************************
; End of Timer interrupt
;*********************************************
; Subroutines
;*********************************************
Delay_5ms ; Make a delay of exactly 5ms = 25000cykles
;24993 cycles
movlw 0x86
movwf d1
movlw 0x14
movwf d2
Delay_5ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_5ms_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
;******
Delay_160us ; Make a delay of exactly 160us = 800cykles
;793 cycles
movlw 0x9E
movwf d1
movlw 0x01
movwf d2
Delay_160us_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_160us_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
;******
Enable
bsf portb, En ; pulse the LCD Enable high
nop
nop
nop
nop
nop
bcf portb, En ; pulse the LCD Enable low
nop
nop
nop
nop
nop
return
;******
SendCmd4bit
; Send W to lcd trought 4bit interface
; You must set RS first if you are sending a command
clrf hi_bits ; Set hi_bits to zero
clrf lo_bits ; Set lo_bits to zero
clrf portb ; Set portb to zero
; Load W into lo_bits and hi_bits
movwf tmp
movwf hi_bits
movwf lo_bits
;lo_bits preparation
movlw 0x0F
andwf lo_bits, 1 ; Remove the high bits and store in lo_bits
;hi_bits preparation
movlw 0xF0
andwf hi_bits, 1 ; Remove the low bits
swapf hi_bits, 1 ; Swap (=switch) low and high bits
;Send the bits
;Hi:
movfw hi_bits ; Move hi_bits to W
addwf portb, 1 ; Add the bits instead of moving them so you can set RS before if you want. Store in portb
call Enable
call delay_160us ; lcd busy delay
movfw hi_bits ; Add hi_bits again to W, the delay_160ms is using it (W). (%¤&#½!)
subwf portb, 1 ; Store in portb
;Lo:
movfw lo_bits ; Move hi_bits to W
addwf portb, 1 ; Add the bits so you can set RS before if you want . Store in portb
call Enable ; Set enable for 3,2us
call delay_160us ; lcd busy delay
movfw lo_bits ; Add lo_bits again to W, the delay_160ms is using it (W).
subwf portb, 1 ; Store in portb
;Done
return
;*******
SendText4bit
; Send W to lcd trought 4bit interface
; This is for sending text so RS is Enabled
clrf hi_bits ; Set hi_bits to zero
clrf lo_bits ; Set lo_bits to zero
clrf portb ; Set portb to zero
; Enable RS
bsf portb, RS
; Load W into lo_bits and hi_bits
movwf tmp
movwf hi_bits
movwf lo_bits
;lo_bits preparation
movlw 0x0F
andwf lo_bits, 1 ; Remove the high bits and store in lo_bits
;hi_bits preparation
movlw 0xF0
andwf hi_bits, 1 ; Remove the low bits
swapf hi_bits, 1 ; Swap (=switch) low and high bits
;Send the bits
;Hi:
movfw hi_bits ; Move hi_bits to W
addwf portb, 1 ; Add the bits instead of moving them so you can set RS before if you want. Store in portb
call Enable
call delay_160us ; lcd busy delay
movfw hi_bits ; Add hi_bits again to W, the delay_160ms is using it (W). (%¤&#½!)
subwf portb, 1 ; Store in portb
;Lo:
movfw lo_bits ; Move hi_bits to W
addwf portb, 1 ; Add the bits so you can set RS before if you want . Store in portb
call Enable ; Set enable for 3,2us
call delay_160us ; lcd busy delay
movfw lo_bits ; Add lo_bits again to W, the delay_160ms is using it (W).
subwf portb, 1 ; Store in portb
;Done
return
;*********************************************
; End of Subroutines
;*********************************************
; Start
;*********************************************
Start
Clrf porta ; Init porta
Clrf portb ; Init portb
Banksel trisb ; Select bank1
Movlw 0x00 ; Data direction value, 0 = output
Movwf trisb ; Write to trisb
Movlw 0xFF
Movwf trisa
Banksel portb ; Select bank0
;*********************************************
; End of Start
;*********************************************
; Main
;*********************************************
Call delay_5ms
Call delay_5ms
Call delay_5ms
Call delay_5ms ; Wait for lcd to start
Movlw 0x03
Movwf portb
Call Enable ; Send 0x03
Call delay_5ms
Call Enable ; Send 0x03
Call delay_160us
Call Enable ; Send 0x03
Call delay_160us
Movlw 0x02
Movwf portb
Call Enable ; Send 0x02
Call delay_160us
Movlw 0x28 ; Interface length is: 4bit, 2 lines, 5x7
Call SendCmd4bit
Movlw 0x10 ; Turn off the display
Call SendCmd4bit
Movlw 0x01 ; Clear the display
Call SendCmd4bit
Movlw 0x06 ; Shift cursor on every written byte
Call SendCmd4bit
Movlw 0x0F ; Turn display on, cursor on, cursor blinking on
Call SendCmd4bit
;Init done
Movlw 0x45 ; Send "E"
Call SendText4bit
Movlw 0x72 ; Send "r"
Call SendText4bit
Movlw 0x69 ; Send "i"
Call SendText4bit
Movlw 0x6B ; Send "k"
Call SendText4bit
Movlw 0x21 ; Send "!"
Call SendText4bit
;*********************************************
; End of Main
;*********************************************
; End of Program
;*********************************************
END
//Daniel A