Hur använder man en KS0108B display
Hur använder man en KS0108B display
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?
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?
Re: Hur använder man en KS0108B display
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.
> 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.
Re: Hur använder man en KS0108B display
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?
Re: Hur använder man en KS0108B display
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.
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.
Re: Hur använder man en KS0108B display
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.
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.
Re: Hur använder man en KS0108B display
> 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.
> 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.
Re: Hur använder man en KS0108B display
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.

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.
Re: Hur använder man en KS0108B display
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.
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.
Re: Hur använder man en KS0108B display
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!

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!
Re: Hur använder man en KS0108B display
> 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...
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
Re: Hur använder man en KS0108B display
Sodjan:Smart exempel, som "skadad" ser jag bokstäverna rätt i koden 

Re: Hur använder man en KS0108B display
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.
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.
Re: Hur använder man en KS0108B display
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 

Re: Hur använder man en KS0108B display
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...
Jag har dock funderat på att ladda upp det till min sida med PIC exempel kod...
Re: Hur använder man en KS0108B display
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.
Ä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.