LCD 2x16 driver

Rasprava o el. shemama, pitanja i diskusije. Ako ti treba neka shema, ovdje pitaj.

Moderators: pedja089, stojke369, [eDo], trax

User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

Ma nije meni brzina toliko kriticna, ali znas, mi socijalno pomaknuti programeri kad imamo pi, i onda nam netko pokloni pi/2 mislimo da smo izgubili svemir... :) No kada bi to neki kreten pogledao sa strane reko bi mi: "Sorry stari, ja ne vidim razliku između 20 i 4o ms refresh-a :)" I jebat ga sada... :azdaja:
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

I lako zato što on ne vidi razliku, ali jebemu, iskreno, ne vidim je ni ja.... :azdaja: :azdaja: :azdaja:
InTheStillOfTheNight
lab1722tec
Napredujem
Napredujem
Posts: 123
Joined: 26-12-2010, 12:12
Location: sad_tu_sad_tamo

Re: LCD 2x16 driver

Post by lab1722tec »

Ako je tema još aktualna....http://forums.ni.com/attachments/ni/170 ... /1/lcd.pdf
Strana 9
Ovo je modifikacija koju sam koristio...pa ako ti odgovara...

Code: Select all

//// \f Clear display
//// \n Go to start of second line
//// \b Move back one position
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)


#ifndef LCDCLK
#define LCDCLK PIN_B2
#endif

#ifndef LCDDAT
#define LCDDAT PIN_B1
#endif

#define DATA1 output_high(LCDDAT)
#define DATA0 output_low(LCDDAT)

void lcd_Es() {
   output_high(LCDDAT);
  // delay_us(200); //only in high mhz
   output_low(LCDDAT);
}

void lcd_Clk() {
   output_high(LCDCLK);
   output_low(LCDCLK);
}


void lcd_Send_Nibble( char nibble, int1 rs) {
   int8 i;

   DATA0; // clear output
   for (i=0; i<6; i++) lcd_Clk();

   DATA1; // Output the "AND" Value
   lcd_Clk();

   IF (rs==1) {
      DATA1; // Output the RS Bit Value
   } ELSE {
      DATA0;
   }
   lcd_Clk();
   for (i = 0; i<4; i++) { // Output the Nybble
      if (nibble & 0x08) {
         DATA1; // Output the High Order Bit
      }
      else {
         DATA0;
      }
      lcd_Clk(); // Strobe the Clock
      nibble<<=1; // Shift up Nybble for Next Byte
   }
   lcd_Es(); // Toggle the "E" Clock Bit
}


void lcd_send_byte( int n , int1 rs) {
   lcd_send_nibble(n >> 4 , rs);
   lcd_send_nibble(n & 0xf, rs);
}


void lcd_init( void) {
   lcd_send_nibble(0x03,0);
   delay_ms(5);
   lcd_es();
   delay_us(160);
   lcd_es();
   delay_us(160);
   lcd_send_nibble(0x02,0);
   delay_us(160);
   lcd_send_byte(0x28,0);
   lcd_send_byte(0x08,0);
   lcd_send_byte(0x01,0);
   delay_ms(5);
   lcd_send_byte(0x06,0);
   lcd_send_byte(0x0C,0);
}


void lcd_gotoxy( int x, int y) {
   BYTE address;
   if (y!=1) {
      address=0x40;
   } else {
      address=0;
   }
   address+=x-1;
   lcd_send_byte(0x80|address,0);
}


void lcd_putc( char c) {
   switch (c) {
      case '\f' : lcd_send_byte(1,0); delay_ms(5); break; //clear display
      case '\n' : lcd_gotoxy(1,2); break; //
      case '\b' : lcd_send_byte(0x10,0); break;
      default : lcd_send_byte(c,1); break;
   }
}
nema pozadinskog :oops:
i radi sa svim standardnim LCD..ima
pozzz!
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

Pozdrav,

Evo tema tek sada aktualna jer sam sastavio HW sa sljedećeg linka:
http://www.electronics-lab.com/projects/mcu/015/

Pretipkao sam software i prilagodio ga svom HW-u i naravno NE radi. No kada sam malo pogledao SW nešto mi drastično nije bilo jasno:

Code: Select all

void Write_LCD_Nibble(unsigned short N){
 Enable_Pin = 0;
 // ****** Write RS *********
 Clk_Pin = 0;
 Data_Pin = RS;
 Clk_Pin = 1;
 Clk_Pin = 0;
 // ****** End RS Write
 
 // Shift in 4 bits
 Mask = 8;
  for (t=0; t<4; t++){
   Flag = N & Mask;
   if(Flag==0) Data_Pin = 0;
   else Data_Pin = 1;
   Clk_Pin = 1;
   Clk_Pin = 0;
   Mask = Mask >> 1;
  }
  // One more clock because SC and ST clks are tied
  Clk_Pin = 1;
  Clk_Pin = 0;
  Data_Pin = 0;
  Enable_Pin = 1;
  Enable_Pin = 0;
}
Brojim ja clock u funkciji i vidim da ima 6 puta clock a shift register je 8. Prvo što mi je palo na pamet je probati napraviti 8 puta clock kako bi postavio sve portove registra i sve funkcionira. Kasnije gledam primjer kolege lab1722tec:

Code: Select all

void lcd_Send_Nibble( char nibble, int1 rs) {
   int8 i;

   DATA0; // clear output
   for (i=0; i<6; i++) lcd_Clk();

   DATA1; // Output the "AND" Value
   lcd_Clk();

   IF (rs==1) {
      DATA1; // Output the RS Bit Value
   } ELSE {
      DATA0;
   }
   lcd_Clk();
   for (i = 0; i<4; i++) { // Output the Nybble
      if (nibble & 0x08) {
         DATA1; // Output the High Order Bit
      }
      else {
         DATA0;
      }
      lcd_Clk(); // Strobe the Clock
      nibble<<=1; // Shift up Nybble for Next Byte
   }
   lcd_Es(); // Toggle the "E" Clock Bit
}
i opet brojim clock = 12.
No, pogledam malo po navedenom pdf dokumentu i stvarno je 6 izlaza i ako sam dobro skužio bez problema može proći register 2 puta. Na prvu sve štima.

Dakle, ako sam dobro zaključio ovaj SW sa prvog linka ne valja jer naprosto da bi uvijek bio sinkroniziran shift register jednostavno mora raditi clock 8 puta u funkciji ispisa.

No, ako i oba ova primjera rade na način da se shift registar upiše kompletan, bez obzira koliko ima izlaza postavlja se jedno važno pitanje HW-a: "Što ako resetiram MCU na petom clocku shift registra?" Po tome LCD više ne može raditi jer se MCU nikada neće sinkronizirati sa shift registrom. Trebalo bi isključiti čitavo napajanje uređaja da bi se shift registar sinkronizirao ili izvući MCLR na port.

Jesam li nešto propustio ili pogrešno shvatio?
InTheStillOfTheNight
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: LCD 2x16 driver

Post by pedja089 »

Koliko vidim omano si totalno kako shift registar radi...
Nisam gledao kod, ali na osnovu onoga sto ti pricas nesto ne stima...
Stavis 1 bit na data, dovedes 1 klok, shift prebaci njega u Q0, iz Q0 prethodno stanje prebaci u Q1, prethodno stanje iz Q1 prebaci u Q2, itako redom.
Tako da u Q0 se nalazi uvek zadnji bit koji si poslao, u Q1 predzadnji, i tako redom.
Tako da nebitno kada ti njega resetujes i sta se nalazilo u registru, ako dovedes svojih 5 bita koji su ti potrebni njih ces uvek imati na izlazima Q0,Q1,Q2,Q3,Q4. I to da ponovim Q0 je zadnji koji si poslao, Q4 je prvi koji si poslao.
Tako da ako ti dovodis 6 klok, ko ce znti sta ti se nalazi u Q0... A pogotovo ako dovodis 8 klokova, sve tvoje podatke si pomerio za tri mesta gore, sto ne valja...
Moj predlog bi ti bio da prvo zakacis 5 ledica umesto LCD-a, pa se onda poigraj sa tim shiftom da dobijes tacne podatke na LED.
Ili si ti jos omanuo u hardveru pa D7 displeja spojio na Q7 registra...
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

Ahaaa, cek malo, ali zasto mi onda ne radi? :D

E baš sam sad raskopao to sa MCU boarda. Idem ponovno sastaviti.. Eh, sad, nemam ni instrumenta :) U Zagrebu sam kod cure, a ona isto nema instrument :) Imam samo taj HW koji sam nekako naštrikao na MCU... Sad cu ja to ponovno sklepati pa valjda nesto zakljucim
InTheStillOfTheNight
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: LCD 2x16 driver

Post by pedja089 »

Trkni do chipoteke po 5 LED i olaksace ti zivot vise nego instrument...
Sam si rekao da slje 6 klokova, a treba 5, sto ce znaciti da su svi podatci pomereni za 1 mesto. Kud ces bolji razlog zasto ne radi...
User avatar
Khaderah
Odlično uznapredovao
Odlično uznapredovao
Posts: 967
Joined: 17-04-2012, 16:10
Location: Zagreb, Hrvatska

Re: LCD 2x16 driver

Post by Khaderah »

vidi ovdje
modifikacija coda autora s te stranice

http://www.libstock.com/projects/view/6 ... ng-74hc595
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

Ma da, ja letim na 16 Mhz (AVR), naravno da je previše brzo... Kao test ubacio delay i stvar radi... Samo mi nije jasno zasto sam ocekivao da D7 prilikom shifta ide u D0... :ohno:
InTheStillOfTheNight
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: LCD 2x16 driver

Post by pedja089 »

Pa kad gledas u devojku, a ne tamo gde treba :lol:
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: LCD 2x16 driver

Post by InTheStillOfTheNight »

Bem mu, kad niš' nemoš' napraviti za 5 minuta. Ovaj što radi HW mi to sklepao samo da testiram jel radi prije nego proizvede konačan PCB. Dakle ajmo reći da radi, iako mi nekad ne prođe inicijalizacija, pojma nemam zašto... Budem ja to natipkao sve ponovno kada bude gotov konačan HW. Ne znam zašto nikada nemam sreće kad hoću nešto napraviti brzo... :)

Da, ovo sa shift sam totalno krivo povezao, ajde ne totalno, ali sam mislio da Q7 ide na Q0 na clocku. U ovom slučaju sve štima, samo napunim prvih n komada i trigam enable LCD-a...

https://www.dropbox.com/sh/u0ow126pps95 ... UwUDa?dl=0
InTheStillOfTheNight
Post Reply