LCD display och PIC *med bilder på sidan 2*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

LCD display och PIC *med bilder på sidan 2*

Inlägg av squiz3r »

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
Senast redigerad av squiz3r 17 mars 2007, 14:38:23, redigerad totalt 1 gång.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

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.
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

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 :)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Är det någon som har lust att berätta lite grund läggande hur en sån display fungerar, (eller har en länk)? Är det bara olika kombinationer på inputtarna som gör olika tecken eller är det pulsade signaler, så att dem är seriella?

//Daniel a
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

V-G: Jag råkar faktist ha ett sånt shiftregister hemma, vad tror ni är "lättast", att koppla via ett shift register eller direkt till en PIC?

//Daniel A
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Skulle den här koden fungera? http://www.piclist.com/techref/io/lcd/4b16x2lcd-ab.htm

Tack för alla svar!
//Daniel A
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> (eller har en länk)?

http://www.epemag.wimborne.co.uk/resources.htm

Se lcd1.pdf och lcd2.pdf mitt på sidan.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

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)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

*Personligen* skulle jag inte göra min första LCD-koppling via
shiftregister, *om* det inte var väldigt ont om pinnar på processorn.
Det blir bara ytterligare en "layer" att tänka på. Allra enklast (om man har
gott om pinnar) är att köra i ren 8-bitars mod rakt på LCD'n.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Se tabell 3-3 på sidan 42 i MPASM manualen för hur du anger
konstanter i olika format.

"retlw a'H' " är snyggare och tydligare...
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

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.
eriikh
Inlägg: 258
Blev medlem: 5 maj 2006, 10:52:15

Inlägg av eriikh »

Du kan ju kolla min kod här.
Hade samma problem för en vecka sen men sedan löste det sig. Den koden du har hittat hittade jag med men jag tycker han var så dålig att kommentera koden att jag skrev en egen istället. Givetvis mer kommenterad :D

/Erik
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

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

Kod: Markera allt

 __CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
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 " ?

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 
 
Tack!
//Daniel A
Skriv svar