Hur använder man en KS0108B display

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
barael
Inlägg: 2
Blev medlem: 19 februari 2009, 22:51:19

Hur använder man en KS0108B display

Inlägg av barael »

Jag har en grafisk display med en KS0108B kontrollerkrets http://www.fractronics.com/128x64bla.shtml
Datablad: http://www.fractronics.com/12864b_full.pdf

Jag undrar hur jag ska använda denna? Jag har förstått en liten bit men undrar hur jag ska göra för att sätta x, y och z adress. Dessutom undrar jag vad z adressen ska vara till för, vad betyder "display start line"? Jag förstår inte heller varför jag skulle vilja läsa från displayen, jag skriver väll bara det som jag vill ska visas och sen är det bra?

Jag har försökt söka men lyckas tyvärr inte hitta något som kan vara användbart. Troligtvis har det gått lite för fort så jag får fortsätta söka men nån kanske kan tipsa mig lite?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

Databladet som du länkade till verkar ha alla svar.

> hur jag ska göra för att sätta x, y och z adress.

Med instruktionerna på sidan 11 i databladet. På sidorna innan
ser du hur X, Y oxh Z hänger ihop.

> Jag förstår inte heller varför jag skulle vilja läsa från displayen,

Om du vill ändra bara en punkt (dot eller pixel), så måste du läsa först.
Eller ha en "spegelbild" av displayen i minnet på processorn.

> men nån kanske kan tipsa mig lite?

De dokument som du länkade till har allt du behöver.
barael
Inlägg: 2
Blev medlem: 19 februari 2009, 22:51:19

Re: Hur använder man en KS0108B display

Inlägg av barael »

Jag fatta vilka pinnar jag ska sätta H/L för att gå in i läget där jag sätter X/Y/Z men på tex x står det ju "page (0-7)" på pin db0-db2, vad menas med detta? ska jag m.h.a. dessa tre pinnar få fram en siffra? hur?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur använder man en KS0108B display

Inlägg av v-g »

Vad tänker du använda displayen tillsammans med? Dator, µc eller för hand?

Z vette klåen vad det är. Skippa tills vidare.

För att få den att fungera i korthet:

1.Resetta genom att sätta resetpinnen låg. Iaf på min är denna inverterad. Står inte så på din dock.
2. Starta upp BÅDA delarna av displayen "samtidigt" dvs du har CS1 & CS2 höga samtidigt.
3. Om du vill rensa hela skärmen måste du gå igenom alla tecken i alla 8 kolumner på båda sidor (kan göras simultant om bpda CS är höga).

4. Rita vad du vill ;)

Tips är att brygga R/W till 0 hela tiden, denna har jag aldrig ändrat eller använt mig av. Vet man inte vad som står på en punkt i displayen så har man fel i programmet. Reset är bra att köra emellanåt när det passar, displayen kan annars få fnatt & visa felaktiga data.

En mycket bra början är denna länk

OBS att inga tecken eller dylikt finns integrerat i displayen, bara punkt av punkt på i princip.

0-7 BINÄRT är vad de menar.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hur använder man en KS0108B display

Inlägg av vfr »

Vet man inte vad som står på en punkt i displayen så har man fel i programmet

Det där var lite väl kategoriskt, tycker jag. Det finns en massa tillfällen där man kanske inte vet exakt vad som har blivit skrivet i en viss punkt, och där man inte har minne till hela den grafiska bilden i internminnet. Då är det väldigt bra att kunna läsa tillbaka vad som finns på displayen. Men jag kan hålla med om att i många enklare fall, som det ofta är på inbyggnadsgrafik, så behövs det inte.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

> men på tex x står det ju "page (0-7)" på pin db0-db2, vad menas med detta?
> ska jag m.h.a. dessa tre pinnar få fram en siffra? hur?

Right, du har mycket större problem än vad du kanske inser...

*Är* det faktiskt så att du inte vet hur man får 8 olika binära värden med
hjälp av 3 bitar ? Då tror jag att du kan lägga ner LCD-projektet och
börja studera lite grundläggande digitalteknik istället under en tid.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur använder man en KS0108B display

Inlägg av v-g »

vfr:Helt rätt ;)

Utläggning:
Om man använder displayen som "minne" tycker jag ändå att man borde tänka på sin programmering. Fast gör man tex "pong" kan det ju vara intressant att använda sig av denna teknik även om det troligen är bättre att lösa direkt i koden. Jag ser det som enklare att rensa och skriva nytt.

Ska man köra tex rörliga bilder måste man ju ha ganska mycket minne om man kör med en µc, att räkna om pixel för pixel tippar jag tar för lång tid vid lite mer avancerade saker. Bättre då att satsa på mer minne i sin µc. Har man 1kB så kan man ju ha hela bilden i minnet(på µcn). På en PC däremot finns inga som helst anledningar att använda denna funktion.

Iofs skulle det vara ganska fränt att använda displayen som ett "visuellt minne" dvs man ser hela tiden vad som ligger i varje "minnescell".

Mao så har du rätt, dvs "Men jag kan hålla med om att i många enklare fall, som det ofta är på inbyggnadsgrafik, så behövs det inte" är exakt det jag menar.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg av Pajn »

Nu svarar jag med "rätt" användare, det är jag som har skrivit dem två ovanstående inläggen också, detta gjordes dock på min morfars användare när jag var hemma hos honom då jag inte kan mitt lösenord utan använder firefox "minnesfunktion".

Sodjan: Jag ska erkänna att jag inte är en hejare på det binära talsystemet. Men jag tror jag kan räkna till åtta 0, 1, 10, 11, 100, 101, 110, 111? Det går fort att googla upp. Var dock inte säker på att det var binärt som menades.

Displayen ska användas med en µC men jag kommer även att skicka data till picen (det är en sån som ska användas) som den ska visa på displayen också. Jag tackar för alla svar nu, jag tror jag fattar tillräckligt mycket för att börja och sedan kan jag testa mig fram.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hur använder man en KS0108B display

Inlägg av vfr »

Då verkar du kunna principen iallafall. Eller om det nu var Google... :)

Det är helt ok att vara nybörjare. Att prova sig fram är ofta en lärorik väg, om än kanske inte optimalt snabb. Databladen är väldigt värdefulla. Det mesta av det man behöver veta står där. Är det sedan ytterligare frågor så är det bara att ställa dem. Det är alltid positivt om man försökt själv. Inte bara för att visa att man är beredd att lägga ner lite energi, utan också för att när man försöker så får man en ingående förståelse för hur saker hänger ihop även om man inte löser det specifika problemet.

Lycka till!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

> 0, 1, 10, 11, 100, 101, 110, 111?

Rätt i princip, även om man brukar skriva 000, 001, 010, 011, 100, 101, 110, 111
för att undvika missförstånd.

Det här är kod till en PIC18 som skriver till en KS0108 display med 2 controllers.
Du kan kanske återanvända vissa delar...

Kod: Markera allt

;**********************************************************
	list p=18f2221
	include "p18f2221.inc"
;**********************************************************
;     Exempelprogram för EW12A00FEW
;     För PIC18F252
;
;     D0-D7 => PORTB
;     A0 => PORTC, 0 (data/command select)
;     E1 => PORTC, 1 (enable, first controller)
;     E2 => PORTC, 2 (enable, second controller)
;
;     5V, LCD-contrast och EL-backling kopplat enl datablad.
;
;**********************************************************
;     CONFIG settings
;
	config OSC = HS, PWRT = ON, BOR = OFF
	config WDT = OFF,  LVP = OFF
	config DEBUG = OFF, CP0 = OFF, CP1 = OFF
	config CPB = OFF, CPD = OFF, WRT0 = OFF
	config WRT1 = OFF,  WRTB = OFF
	config WRTC = OFF, WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF
	config  EBTRB = OFF
;
;**********************************************************
;    Some #defines and EUQ's...
;
#define     EW12A00_dataport  PORTB
#define     EW12A00_A0        LATC, 0
#define     EW12A00_E1        LATC, 1
#define     EW12A00_E2        LATC, 2
;
;**********************************************************
;    Some macros...
;
EW12A00_write_data macro value
    movlw   value
    call    EW12A00_data
    endm
;    
EW12A00_set_page_col macro pag, col
    movlw   pag
    call    EW12A00_set_page
    movlw   col
    call    EW12A00_set_col
    endm
;    
;
;**********************************************************
	
Boot	CODE	h'0000'
	goto	Start
;**********************************************************

Main	CODE

Start
    clrf    trisb           ; Allt som utgångar...
    clrf    trisc           ;
    clrf    trisa           ;

    call    delay_1s
    call    EW12A00_reset
    call    delay_1s
    call    EW12A00_set_duty_1_32
    call    delay_1s
    call    EW12A00_set_display_on
    call    delay_1s
    call    EW12A00_set_static_off
    call    delay_1s
    call    EW12A00_set_adc_rev

    call    delay_1s
    call    EW12A00_clear
    
;
    EW12A00_set_page_col d'0', d'0'
;
    EW12A00_write_data b'01111111'   ; "E"
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000001'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111111'   ; "W"
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00111000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00111111'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00000000'   ; "1"
    EW12A00_write_data b'01000010'
    EW12A00_write_data b'01111111'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'01000010'   ; "2"
    EW12A00_write_data b'01100001'
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'01111110'   ; "A"
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'01111110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111110'   ; "0"
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000101'
    EW12A00_write_data b'00111110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111110'   ; "0"
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000101'
    EW12A00_write_data b'00111110'
    EW12A00_write_data b'00000000'
    
    EW12A00_set_page_col d'1', d'0'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01100000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01100000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'

    EW12A00_set_page_col d'0', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'1', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'2', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'3', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'1', d'74'
    EW12A00_write_data b'11110000'
    EW12A00_write_data b'11110000'
    EW12A00_set_page_col d'2', d'74'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'11111111'
    EW12A00_set_page_col d'3', d'74'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'11111111'


loop

	goto	loop			; Once again...
	
;**********************************************************
;  EW12A00xxx subrutines.
;

EW12A00_vars             udata_acs

EW12A00_page_addr        res 1   ; temp reg for EW12A00_clear
EW12A00_col_addr         res 1   ; temp reg for EW12A00_clear
EW12A00_half_flag        res 1   ; flag for first second ctrl
EW12A00_col_temp         res 1   ; temp reg for EW12A00_set_col


EW12A00_code   CODE

;**********************************************************
EW12A00_cmd
; write byte in W as "command" to EW12A00.
; Writes to both controllers...
;
    bcf     EW12A00_A0        ; "Command" mode
    nop
    nop
    movwf   EW12A00_dataport
    nop
    nop
    bsf     EW12A00_E1        ; Clock first (left) ctrl.
    nop
    bsf     EW12A00_E2        ; Clock second (right) ctrl.
    nop
    nop
    bcf     EW12A00_E1
    nop
    bcf     EW12A00_E2
    nop
    nop
    return
    
;**********************************************************
EW12A00_data
; write byte in W as "data" to EW12A00.
; Select controller by EW12A00_half_flag
; if h'00' => first controller, left half
; if not h'00' => second controller, right half
;
    bsf     EW12A00_A0        ; "Data" mode
    nop
    nop
    movwf   EW12A00_dataport
    nop
    nop
    tstfsz  EW12A00_half_flag
    goto    EW12A00_write_sec_cont
    
    bsf     EW12A00_E1        ; Clock first (left) ctrl.
    nop
    nop
    bcf     EW12A00_E1
    nop
    goto    end_of_EW12A00_data
    
EW12A00_write_sec_cont
    bsf     EW12A00_E2        ; Clock second (right) ctrl.
    nop
    nop
    bcf     EW12A00_E2
    nop
    
end_of_EW12A00_data
    return
    
;**********************************************************
EW12A00_clear
; clear EW12A00...
; Page : 3 => 0
; Column : 121 => 0
;

    movlw   d'04'
    movwf   EW12A00_page_addr

clear_page_loop

    decf    EW12A00_page_addr, f
    movf    EW12A00_page_addr, w
    call    EW12A00_set_page

    movlw   d'122'
    movwf   EW12A00_col_addr

clear_col_loop

    decf    EW12A00_col_addr, f
    movf    EW12A00_col_addr, w
    call    EW12A00_set_col
    EW12A00_write_data  h'00'
    tstfsz  EW12A00_col_addr
    goto    clear_col_loop
    tstfsz  EW12A00_page_addr
    goto    clear_page_loop
    
    return
    
;**********************************************************
EW12A00_set_col
; column no in W...
; Sets 'EW12A00_half_flag' depending on the column.
;
    movwf   EW12A00_col_temp
    sublw   d'60'                   ; Col > 60 ?
    bn      EW12A00_set_sec_cont    ; Yes
    
    clrf    EW12A00_half_flag       ; No, first cntl.
    movf    EW12A00_col_temp, w     ; Restore W
    goto    end_of_EW12A00_set_half
    
EW12A00_set_sec_cont
    
    setf    EW12A00_half_flag       ; Second cntl.
    movlw   d'61'                   ; Adjust original W value
    subwf   EW12A00_col_temp, w     ; for second cntl...

end_of_EW12A00_set_half

    addlw   d'19'
    call    EW12A00_cmd
    return

;**********************************************************
EW12A00_set_page
; page no in W...
;
;    sublw   d'3'
    iorlw   b'10111000'
    call    EW12A00_cmd
    return

;**********************************************************
EW12A00_set_adc_forw
    movlw   b'10100000'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_adc_rev
    movlw   b'10100001'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_static_on
    movlw   b'10100101'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_static_off
    movlw   b'10100100'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_display_on
    movlw   b'10101111'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_display_off
    movlw   b'10101110'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_reset
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_duty_1_32
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
; Simple delay routine.
; Undefined lenght, probable *not* 1 sec...
;
dly_vars     udata_acs
CNT1         res 1
CNT2         res 1
CNT3         res 1


dly_code   code

delay_1s
;    return
;
	movlw	0x01
	movwf	CNT1
	movlw	0x01
	movwf	CNT2
	movlw	0x10
	movwf	CNT3
dly_loop
	decfsz	CNT2
	goto 	dly_loop
	movlw	0x08
	movwf	CNT2
	decfsz	CNT1
	goto	dly_loop
	decfsz	CNT3
	goto 	dly_loop
	return
    

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

Re: Hur använder man en KS0108B display

Inlägg av v-g »

Sodjan:Smart exempel, som "skadad" ser jag bokstäverna rätt i koden :D
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

Ja, det var ett "brute-force" ihopkok för att få en bild till på displayen till Tradera.
Mycket av det går säkert att göra effektivare, men det var mest för lågnivårutinerna
som gör själva skrivningen till LCD'n som jag tänkte att det var intressant.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur använder man en KS0108B display

Inlägg av v-g »

Sodjan:Superoptimerat är ju inte alltid det bästa heller. Lätt förlorat är tex överskådlighet vilket jag tycker är nog så viktigt. Bra exempel hur som helst. Önskar att jag hittat det innan jag satt två dygn för att få igång min KS0108 ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

Eftersom det bara finns på min hårddisk så kunde du inte "hitta" det.
Jag har dock funderat på att ladda upp det till min sida med PIC exempel kod...
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7474
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg av Marta »

Kanske inte helt smart, ganska illa skrivet till och med tycker jag för en PIC18 som har möjlighet att läsa programminnet på ett mycket bättre sätt och då använda båda bytes i varje programsteg för data. På det där sättet blir det tvärt om, två programsteg för en byte data. Fyra gånger mera minnesslukande.

Är ju ett enkelt sätt att komma igång, men viktigt att nybörjare även får veta att de skall titta på instruktionen TBLRD och inte ta för givet att att en klumpig lösning är den enda eller den bästa.
Skriv svar