NOKIA 3310 CONTROLLO LCD
 
 
Questo display integra al suo interno il controller/driver PCD8544 realizzato dalla philips che gestisce ogni singolo pixel.     
      
 
Come si vede dal immagine sul retro del display sono presenti 8 contatti 
 -vdd   >alimentazione a max 3,3 volt 
 -sck   >clock  si usa per gestire l'invio dei dati all'lcd 
 -sdin  > input dati 
 -d/c    > serve per far interpretare i dati al controller  
 -sce   >abilita lcd 
 -gnd  >massa 
 -vout >collegato a massa con un condensatore elettrolitico da 1uf 
 -res   >reset attivo a livello basso 
------------------------------------------------------------------------------------------------------- 
Per comunicare con questo lcd bisogna inviargli il dato composto da 8 bit serialmente sul pin sdin,sincronizzando ogni bit sul fronte di salita del clock fornito sul pin sck. 
La sequenza da inviare la si vede nella tabella del datasheet a pagina 14. 
 
                         
 
1)function set=metto a massa in pin d/c... il bit H è il primo bit che si invia e a seconda del suo valore gli 8 bit che  invierò in seguito sono riferiti alla gestione interna(H=1) del display (temp control,bias sistem,set vop)o alla gestione dei pixel (H=0). 
-il bit V è in secondo bit che invio e dice al lcd se le coordinate sono riferite al asse x o y 
-il bit PD serve per abilitare lcd. 
2)display control=metto a massa in pin d/c...serve per selezionare il tipo visualizzazione attraverso il valore dei due bit D,E. 
3)write data=metto a vcc il pin d/c...qua ho a disposizione 7 bit che mi dicono lo stato di    ogni singolo pixel  acceso quando 1 spento con 0...però dipende dal dipo di  visualizzazione scelta se normal mode (D=1,E=0) o inverse video mode(D=1,E=1) 
 
lo schermo è diviso in 6 righe (0,...,5) ciascuna riga è composta da 84colonne(0,...,83) 
ciascuna divisa in 8 pixel.L'indirizzo di ogni singola colonna è incrementato automaticamente dal controller tuttavia esiste la possibilità di individuare ciascuna di queste attraverso il comando set x address,mentre per le righe set y address
                                      
-------------------------------------------------------------------------------------------------------- 
                                                    PIC16F84/A 
Per gestire questo schermo io ho adoperato un comunissimo pic16f84 alimentato a 3 volt. 
                                             
 
il display pultroppo supporta una tensione massima di 3,3 volt per cui bisogna trovare un qualche sistema che adatti tale tensione se si intende adoperare qualche altro microcontrollore che supporta solo i 5 volt. 
                     
 
     -CONESSIONI- 
                         portb.0= sck   'clock 
                         portb.1=sdin   'dati 
                         portb.2=d/c      
                         portb.4=reset  'reset
Il programma lo ho scritto con mikrobasic però vagando su internet ho trovato un listato scritto in assembly. 
   
program nokia 
const dato as    'salvo i bit per inizializzare lcd 
             'fs   'vop'bs   'sf 'vi 'vi 'y 'x 
byte[8]=(132,163 ,200,4,16,48,2,1) 
'------------------ 
const riga0 as 
byte[85]=(0,0,0,0,0,0,0,0,0,0,0,0...,0,0,0,0,0) 
'------------------ 
const riga1 as 
byte[85]=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...0,0,0,0,0) 
'------------------ 
const riga2 as 
byte[85]=(0,0,0,0,0,0,0,0,15,63,15,0,0,0...,,0,0,0) 
'------------------ 
const riga3 as 
byte[85]=(0,0,0,128,192,225,255,254,142,132,142,254...0,0,0) 
'------------------ 
const riga4 as 
byte[85]=(0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0..0,0,0,0) 
'------------------ metto tante costanti quante sono le rigne qua ne manca una 
dim a,b,d,k as byte  'variabili 
main: 
'settaggi portb 
trisb.0=0'clock 
trisb.1=0'dati 
trisb.2=0'd/c 
trisb.3=0 
trisb.4=0'reset 
'----reset----------------serve per pulirmi la ram 
portb.4=0 
delay_ms(8) 
portb.4=1 
'-------inizializzazione--------- 
portb.3=0     'attivo sce 
portb.2=0     'd/c a 0 perche mando comandi 
'----------punto il dato contenuto nella prima costante dato------- 
for d=1 to 8 
a=dato[d]     'punto bit 
'---conversione in binario---- 
for k=0 to 7 
b=(a mod 2)  'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato(valore del resto) 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
'------------------------ 
next d 
'--------invio riga 0--- 
portb.2=1     'd/c a 1 perchè mando dato 
for d=1 to 84 
a=riga0[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
'--------invio riga 1--- 
portb.2=1     'd/c a 1 perchè mando dato 
for d=1 to 84 
a=riga1[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
'--------invio riga 2--- 
portb.2=1     'd/c a 1 perchè mando dato 
for d=1 to 84 
a=riga2[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
'--------invio riga 3--- 
portb.2=1     'd/c a 1 perchè mando dato 
for d=1 to 84 
a=riga3[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
'--------invio riga 4--- 
portb.2=1     'd/c a 1 perchè mando dato 
for d=1 to 84 
a=riga4[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
for d=1 to 84 
for k=0 to 7 
portb.1=0     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
end.
Il suo funzionamento è molto semplice creo delle costanti nelle quali salvo il valore che voglio inviare poi attraverso un ciclo for punto ogni singolo valore e lo converto a 8 bit in binario  
for k=0 to 7 
b=(a mod 2)  'controlla se divisione da il resto 
a=(a div 2)     'dimezzo a 
portb.1=b     'invio dato-valore del resto 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
con questo sistema però mi si sfalsa in valore in quanto ad esempio  
voglio mandare - 
 a b c d e f  g  
 0 0 1 0 0 0 0 = 32 -per inizializzare function set  
 dove 
 g=H 
 f= V  
 e= PD     
se mettessi 32 nel mio programma però no otterrei questo valore in uscita ma 
0000100 =4- dove ho tutti i valori sballati 
allora per questo nel mio programma devo mettere 4 cosi che in uscita ottenga 
0010000= 32  
lo stesso vale per tutti gli altri valori....volendo si potrebbe gestire la cosa diversamente ma 
visto che con questo sistema funziona non ne ho cercato un altro.... 
------------------------------------------------------------------------------------------------------------------------ 
per velocizzare la ricerca del valore che deve assumere ogni colonna ho creato degli altri programmi   con visual basic che mi forniscono già il dato da inserire nella costante.... 
IL PRIMO è: 
 
                         
i valori vanno sostituiti nella costante ma se si aumentano o diminuiscono al suo interno bisogna aggiornare il numero presente [] nelle due parentesi e nel ciclo for che la utilizza.... 
IL SECONDO è: 
vagando nel web ho trovato un programma di disegno "FastLCD" aposito per creare le coordinate da utilizzare per il controllo dello schermo. 
                   
                    
                   
 
                   
 
A  questo punto viene creato un file si estensione .bas ,questo file lo si apre con visual basic 
che lo riconosce come modulo si selezionano le coordinate e si preme copia.... 
                 
una volta fatto questo si apre il mio programma e si incolla il tutto nello spazio più ampio...     
                             
 
si preme su conversione....si selezzionano le varie righe e si copia il loro contenuto sostituendolo a quello nella costante nel programma e il gioco è fatto.... 
 
                        
                        
Io per testare il tutto ho utilizzato una bread board e mi sono creato un piccolo stampato per collegarmi all lcd, volendo si possono saldare sei fili alle linguette ma cosi facendo mi si sono rotti 2 schermi.... perchè le linguette sono incollate  e appena si sforza si stacca tutto....                   
 
 
                          
----------------------------------------------------------------------------------------------------------------------- 
Il programma in assembly in vece fa cosi: 
                                                                             
----------------------------------------------------------------------------------------------------------------------- 
                                            PIC16F628/A 
Altro programma(v2) questo contiene i dettagli di tutto lo schermo in un unica costante in questo caso l'ho fatto per visualizzare tre immagini diverse per cui ho dovuto cambiare il pic sono passato al 16f628 che ha piu memoria a disposizione 2k a differenza del 84 che ha 1k....comunquevolendo questo programma si puo utilizzare su qualsiasi microcontrollore se opportunamente adattato.... 
l'unica limitazione è rappresentata dalla memoria interna.... 
 
program nokianew 
const dato as    'costante per  l 'inizializzazione 
            '-fs-'-vop-'-bs-'-sf'vi-'vi '-y-'x 
byte[8]=(132,163,200,4,16,48,2,1) 
 
const imm0 as 
byte[505]=(0,0,0,0,0,8,31,15,7...,0,0,0) 
 
const imm1 as 
byte[505]=(0,0,0,0,0...255,127,255,255,255,127) 
 
const imm2 as 
byte[505]=(0,0,0,0,0,0,....0,0,0,0) 
 
dim a,b,k,v as byte 
dim d as word 
 
main: 
trisb.0=0'clock 
trisb.1=0'dati 
trisb.2=0'd/c 
trisb.3=0 
trisb.4=0'reset 
v=0 'variabile che uso per puntare le varie immagini 
'----reset---------------- 
portb.4=0 
delay_ms(8) 
portb.4=1 
 
'-------inizializzazione--------- 
portb.2=0     'd/c a 0 perche mando comandi 
for d=1 to 8 
a=dato[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
 
'----------ciclo infinito 
while true 
'controllo se ho esaurito le immagini 
 
if v=3 then 
v=0 
end if 
'------------- 
delay_ms(500)'pausa 
v=v+1     'incremento x puntare una immagine nuova 
portb.2=1     'd/c a 1 perchè mando dato 
 
for d=1 to 504 
'----------------scelgo che cosa visualizzare  in base al valore di v 
 
select case v 
case 1 
a=imm0[d] 
case 2 
a=imm1[d] 
case 3 
a=imm2[d] 
end select 
 
'----conversine in binario----------- 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
portb.1=b     'invio dato 
portb.0=0     'clock 
portb.0=1     'clock 
next k 
next d 
'------------------------------------- 
wend 
end.
 
programma molto semplice nella costante metto i 504 valori provenienti dal programma di conversione 
però lasciando lo 0, al inizio di ogni costante e mettendo il numero della stessa  a 505  
questo per mantenere la posizione perchè il primo valore letto dalla costante lo scherm 
o non lo visualizza  e parte dal secondo...quindi agiungendo lo 0,  il valore della prima  
colonna mi corisponde al valore della stessa nel programma da disegno e l immagine  
mi risulta pari pari a quella disegnata(spero di essermi spiegato!!!!).... 
     
                                  byte[505]=(0,'------metto i 504 valori------------') 
 
le conessioni sono le stesse del primo programma ho provato ad alimentare 
schermo e pic a 5 volt e funziona normalmente....nonstante sul datasheet dello 
schermo sia indicata la tensione massima di alimentazione a 3,3volt ....non so  
spiegarmi il perchè funziona  quando ho provato mi ero già preanunciato di bruciare 
lo schermo e invece.....bo!!! 
 
Le modifiche a questi soft sono infinite è possibile adattarli alle proprie esigenze 
variando di poco il codice...... 
----------------------------------------------------------------------------------------------------------------------- 
                                                       PIC12F629 
Ecco un altro programma(v3) che sto giro utilizza un pic 12f629 piccolo e versatile  
questa volta ho aggiunto anche la posibilità di variare il tipo di visualizzazione mediate un semplice pulsante....modifica che è attuabile su tutti i programmi precedenti.... 
program nok 
const dato as 
        'fs'vop'bs'sf'vi'vi'y'x 
byte[8]=(132,163,200,4,16,48,2,1) 
const file as 
byte[505]=(0,0,127,...2,2,2,254,0) 
dim a,b,k,j,js as byte 
dim d as word 
main: 
CMCON=%00000111 'spengo comparatore 
trisio.0=0  'clock 
trisio.1=0  'dati 
trisio.2=0  'd/c 
trisio.3=1  'pin per cotrasto 
trisio.4=0  'reset 
'------reset------- 
gpio.4=0 
delay_ms(1000) 
gpio.4=1 
'-------inizializzazione-------- 
gpio.2=0     'd/c a 0 perche mando comandi 
for d=1 to 8 
a=dato[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
gpio.1=b     'invio dato 
gpio.0=0     'clock 
gpio.0=1     'clock 
next k 
next d 
'----immagine------ 
gpio.2=1     'd/c a 0 perchè mando comandi 
for d=1 to 504 
a=file[d]     'punto bit 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
gpio.1=b     'invio dato 
gpio.0=0     'clock 
gpio.0=1     'clock 
next k 
next d 
j=0 
'----------ciclo per contrasto------ 
While true 
if (gpio.3=1) then 'se premo pulsante 
'------------------------------ 
while gpio.3=1 'ciclo anti repeat 
delay_ms(100) 
wend 
'------------------------ 
j=j+1                           'variabile 
js=j mod 2                  'controllo se è pari o dispari in base al resto 
if js=0 then  'se è pari 
a=48         'normale 
else          'se è dispari 
a=176        'invertito 
end if 
'------------------------------ 
gpio.2=0     ' a 0 perchè invio comando 
for k=0 to 7 
b=(a mod 2)   'controlla se divisione da il resto 
a=(a div 2) 
gpio.1=b     'invio dato 
gpio.0=0     'clock 
gpio.0=1     'clock 
next k 
end if 
wend 
end.
 
Le conessioni sono molto semplici: 
 
 
 
 gpio.0= sck -clock 
 gpio.1= sdin-dati 
 gpio.2=d/c 
 gpio.3=un pulsante con una resist pull-down 
 gpio.4=reset
Il programma è molto semplice il funzionamento è come i precedenti l'unica novità  
è il ciclo che controlla il valore di una variabile e a seconda se questa è pari o dispari 
invia il comando per cambiare il tipo di visualizzazione... 
Il pic deve essere configurato con oscillatore interno attivo cosi da poter utilizzare i pin 
gpio.4 /5 come normali pin i/o....e disattivare MCLR su gpio.3 cosi da usare anche  
questo come normale pin. 
 
                                  
 
                 
          
  
                                               
------------------------------------------------------------------------------------------------------------------------- 
download: 
 
                                                                <<torna su>> 
                                                            << HOME PAGE>>
 
 
 
CONTROLLO SCHERMO NOKIA 3310  
 
 
 
 
 
 
 
 
 
 
 
 
 
__________
Creato con la versione TRIAL di Visual Vision EasyWebEditor. Per rimuovere questo testo acquista la versione regolare.
EasyWebEditor, il programma professionale e facile per creare siti Web.