Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Microchip PIC => Konuyu başlatan: crapdeno - 15 Mart 2011, 13:46:43

Başlık: 128x64 glcd veri okumak
Gönderen: crapdeno - 15 Mart 2011, 13:46:43
Arkadaşlar benim projem dokunmatik ekran aracılığıyla çizdiğim birşeyi okuyarak rs232 ile bilgisayara atmam gerekiyor. bu glcd üzerindeki datayı okuyup atma işlemini çözemedim yardımcı olabilir misiniz??
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: Tagli - 15 Mart 2011, 21:07:21
Konu başlığını yanlış vermişsin. "Touchpad Kullanımı" veya "Dokunmatik Ekrandan Veri Okumak" gibi birşey olmalıydı. Bu şekilde değiştirirsen yardım alman kolaylaşır.

Mesela ben KS0108 sürücülü bir 128x64 GLCD'nin hafızasından nasıl veri okunacağını biliyorum ve senin "128x64 glcd veri okumak" başlığını görünce belki yardımcı olabilirim diye atladım hemen. Ancak malesef dokunmatik ekranlar hakkında hiçbir fikrim yok.
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: satilla - 15 Mart 2011, 21:28:40
dokunmatikten aldıgın analog veriyi 10 defa değişkene ekle sonra bunların ortalamasını al
aldığın ortalamayla elde eetigin verileri pc ye aktar
yazdıgın pc programıda bu noktalarla dot matris dizilimi tamamlasın

Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: teknikelektronikci - 15 Mart 2011, 21:41:15
yani cizdigin veriyi glcd den degil üzerindkei touch screen denen folyodan analog ollarak okuyup digitale cevirip (mcu ile) öyle bilgisyara aktaracaksin
ayrica microchipin hazir entegreleri mevcut arastirmani tavsiye ederim
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: f_machine - 15 Mart 2011, 22:11:06

https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/ (https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/)

Burada rezistif dokunmatik panellerle ilgili yazmış olduğum bi yazı var.
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: vebsel - 15 Mart 2011, 23:57:28
genelde touch pad okumak için  r    c şarj   devresi kullanılıyor önce iki eksenin kondansatörleri bir transiatör yardımıyla boşaltılıyor daha sonra dolma zamanı sayılıyor
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 20 Mart 2011, 10:01:45
Tagli arkadaşım banada zaten GLCD deki lazım ks108 den nasıl okuma yapabilirim?? bana o lazım zaten. f_machine bende ordan yardım aldım zaten ama ekrana dokunduğum noktayı çizdirtmek istiyorum kalibra de edemedim o konuda bana yardımcı olabilir misin??
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: Tagli - 20 Mart 2011, 10:54:39
Yazdığın iki şey birbirinden farklı. Bu başlıkta iki farklı okuma şekli, daha doğrusu kaynağı anılıyor:

Bunlardan birincisi KS0108'in hafızasındaki veri. Bu veri zaten ekrana yazı yazılırken KS0108'in içindeki hafıza alanına işlemci tarafından yükleniyor. Ancak bazı durumlarda veriyi bu hafızadan geri okumak gerekebiliyor. Aklıma gelen en basit örneği, ekrandaki resmin veya gösterilen her neyse onun tersini almak. Yani yanan pikselleri söndürüp sönenleri yakmak. Benim nasıl yapılacağını bildiğim okuma şekli bu.

İkincisi ise GLCD'nin üstüne iliştirilmiş touchpad denen ve yanlış bilmiyorsam 4 adet kablosu olan ince katmandan, üzerine dokunulduğu zaman neresine dokunulduğunu anlamak için gerekli okumayı yapmak. Bu işlemin KS0108 entegresi ve onun veri hafızası ile hiçbir ilgisi yok. İlk mesajından anladığım kadarıyla sen nereye dokunulduğunu anlamak istiyorsun. Bu durumda KS0108'in hafızasından veri okumana gerek de yok. Mesele şu ki benim dokunmatik yüzeyden veri okunması hakkında bir bilgim yok, ama zaten arkadaşlar kaynak göstermişler.
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: f_machine - 20 Mart 2011, 10:56:53
Burada mikroe nin örnek kodu var önce ekranı kalibre ediyor.Sonrada dokunulan noktaları ekrana çiziyor.

/*
* Project name:
     TouchPanel (Demo for working with TouchPanel Controller)
* Copyright:
     (c) Mikroelektronika, 2009.
* Revision History:
     20081218:
       - initial release;
       - 20090720 - modified by Slavisa Zlatanovic;
* Description:
     This code works with TouchPanel and GLCD. Two digital output and
     two analog input signals are used for communication with TouchPanel.
* Test configuration:
     MCU:             PIC16F887
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
     Dev.Board:       EasyPIC6
                      http://www.mikroe.com/en/tools/easypic6/
     Oscillator:      HS, 08.0000 MHz
     Ext. Modules:    GLCD 128x64, Touch Panel
                      http://www.mikroe.com/en/tools/components/
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/en/compilers/mikroc/pro/pic/
* Notes:
     - Turn on GLCD backlight switch SW8.8.
     - Turn on TouchPanel Controller switches SW9.5, SW9.6, SW9.7 and SW9.8.
     - Turn off PORTA LEDs SW9.1.
*/

// Glcd module connections
char GLCD_DataPort at PORTD;

sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS  at RB2_bit;
sbit GLCD_RW  at RB3_bit;
sbit GLCD_EN  at RB4_bit;
sbit GLCD_RST at RB5_bit;

sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction  at TRISB2_bit;
sbit GLCD_RW_Direction  at TRISB3_bit;
sbit GLCD_EN_Direction  at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections

// Touch Panel module connections
sbit DRIVE_A at RC0_bit;
sbit DRIVE_B at RC1_bit;
sbit DRIVE_A_Direction at TRISC0_bit;
sbit DRIVE_B_Direction at TRISC1_bit;
const char READ_X_CHANNEL = 0;                             // READ X line is connected to analog channel 0
const char READ_Y_CHANNEL = 1;                             // READ Y line is connected to analog channel 1
// End Touch Panel module connections

bit          write_erase;
char         pen_size;
unsigned int x_coord, y_coord, x_coord_old, y_coord_old, x_coord_diff, y_coord_diff;
long         x_coord128, y_coord64;                        // Scaled x-y position
int          cal_x_min, cal_y_min, cal_x_max, cal_y_max;   // Calibration constants
char write_msg[] = "WRITE";                                // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
const unsigned int ADC_THRESHOLD = 900;                    // Threshold value for press detecting

// Returns 1 if TouchPanel is pressed, 0 otherwise
char PressDetect() {
  unsigned adc_rd;
  char result;

  // PRESS detecting
  DRIVE_A = 0;                                             // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  DRIVE_B = 0;                                             // DRIVEB = 0 (BOTTOM drive off)
  Delay_ms(5);

  adc_rd = ADC_Read(READ_Y_CHANNEL);                       // READ-Y
  result = (adc_rd > ADC_THRESHOLD);                       // if logical one is detectet

  // Debouncing, repeat detecting after 2ms
  Delay_ms(2);
  adc_rd = ADC_Read(READ_Y_CHANNEL);                       // READ-Y
  result = result & (adc_rd > ADC_THRESHOLD);
  return result;
}

unsigned int GetX() {
  unsigned int result;
  // Reading X
  DRIVE_A = 1;                                             // DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
  DRIVE_B = 0;                                             // DRIVEB = 0 (BOTTOM drive off)

  Delay_ms(5);
  result = ADC_Read(READ_X_CHANNEL);                       // READ-X (BOTTOM)
  return result;
}

unsigned int GetY() {
  unsigned int result;
  // Reading Y
  DRIVE_A = 0;                                             // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  DRIVE_B = 1;                                             // DRIVEB = 1 (BOTTOM drive on)

  Delay_ms(5);
  result = ADC_Read(READ_Y_CHANNEL);                       // READ-X (LEFT)
  return result;
}

void Calibrate() {

  Glcd_Dot(0,63,1);
  Glcd_Write_Text("TOUCH BOTTOM LEFT",12,3,1);
  while (!PressDetect());

  // Get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_min = GetX() - 10;
  cal_y_min = GetY() - 10;
  Delay_ms(1000);

  Glcd_Fill(0);
  Glcd_Dot(127,0,1);
  Glcd_Write_Text("TOUCH UPPER RIGHT",12,4,1);
  while (!PressDetect()) ;

  // Get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_max = GetX() + 5;
  cal_y_max = GetY() + 5;
  Delay_ms(1000);
}

void Initialize() {
  DRIVE_A_Direction = 0;                                   // Set DRIVE_A pin as output
  DRIVE_B_Direction = 0;                                   // Set DRIVE_B pin as output

  ANSEL  = 3;                                              // Configure AN0 and AN1 pins as analog inputs
  ANSELH = 0;                                              // and other AN pins as digital I/O
  TRISA  = 3;
  C1ON_bit = 0;                                            // Disable comparators
  C2ON_bit = 0;
  Glcd_Init();                                             // Initialize GLCD
}

void main() {

  Initialize();
  Glcd_Fill(0x00);                                         // Clear GLCD
  Glcd_Set_Font(font5x7, 5, 7, 32);                        // Choose font
  Glcd_Write_Text("CALIBRATION", 30, 2, 1);
  // Delay_ms(1500);

  Glcd_Fill(0);
  Calibrate();
  Glcd_Fill(0);

  Glcd_Write_Text("WRITE ON SCREEN", 20, 5, 1) ;
  Delay_ms(1000);
  Glcd_Fill(0);

  Glcd_Fill(0);
  Glcd_V_Line(0,7,0,1);
  Glcd_Write_Text(clear_msg,1,0,0);
  Glcd_V_Line(0,7,97,1);
  Glcd_Write_Text(erase_msg,98,0,0);

  // Pen Menu:
  Glcd_Rectangle(41,0,52,9,1);
  Glcd_Box(45,3,48,6,1);
  Glcd_Rectangle(63,0,70,7,1);
  Glcd_Box(66,3,67,4,1);
  Glcd_Rectangle(80,0,86,6,1);
  Glcd_Dot(83,3,1);

  write_erase = 1;
  pen_size = 1;
  x_coord_old = 0;
  y_coord_old = 0;

  while (1) {

    if (PressDetect()) {
      // After a PRESS is detected read X-Y and convert it to 128x64 space
      x_coord = GetX() - cal_x_min;
      y_coord = GetY() - cal_y_min;

      // When lifting pen from the touchpanel surface GetX and GetY readings
      // (after correct PressDetect reading) may be incorrect
      x_coord_diff = abs(x_coord - x_coord_old);           // Compare with old values
      y_coord_diff = abs(y_coord - y_coord_old);
      x_coord_old = x_coord;                               // Save old values
      y_coord_old = y_coord;

      if ( (x_coord_diff>50) || (y_coord_diff>50) )        // If difference is too big then ignore the reading
        continue;

      x_coord128 = (x_coord * 128l) / (cal_x_max - cal_x_min);
      y_coord64 = (64 -(y_coord *64) / (cal_y_max - cal_y_min));

      if ((x_coord128 < 0) || (x_coord128 > 127))
        continue;
      if ((y_coord64 < 0) || (y_coord64 > 63))
        continue;

      // If clear is pressed
      if ((x_coord128 < 31) && (y_coord64 < 8)) {

        Glcd_Fill(0);

        // Pen Menu:
        Glcd_Rectangle(41,0,52,9,1);
        Glcd_Box(45,3,48,6,1);
        Glcd_Rectangle(63,0,70,7,1);
        Glcd_Box(66,3,67,4,1);
        Glcd_Rectangle(80,0,86,6,1);
        Glcd_Dot(83,3,1);

        Glcd_V_Line(0,7,0,1);
        Glcd_Write_Text(clear_msg,1,0,0);
        Glcd_V_Line(0,7,97,1);
        if (write_erase)
          Glcd_Write_Text(erase_msg,98,0,0);
        else
          Glcd_Write_Text(write_msg,98,0,0);
        }

      // If write/erase is pressed
      if ((x_coord128 > 96) && (y_coord64 < 8)) {
        if (write_erase) {
          write_erase = 0;
          Glcd_Write_Text(write_msg,98,0,0);
          Delay_ms(500);
          }
        else {
          write_erase = 1;
          Glcd_Write_Text(erase_msg,98,0,0);
          Delay_ms(500);
          }
        }

      // If pen size is selected
      if ((x_coord128 >= 41) && (x_coord128 <= 52) && (y_coord64 <= 9))
        pen_size = 3;

      if ((x_coord128 >= 63) && (x_coord128 <= 70) && (y_coord64 <= 7))
        pen_size = 2;

      if ((x_coord128 >= 80) && (x_coord128 <= 86) && (y_coord64 <= 6))
        pen_size = 1;

      if (y_coord64 < 11)
        continue;

      switch (pen_size) {
        case 1 : Glcd_Dot(x_coord128, y_coord64, write_erase); break;
        case 2 : Glcd_Box(x_coord128, y_coord64, x_coord128 + 1, y_coord64 + 1, write_erase); break;
        case 3 : Glcd_Box(x_coord128-1, y_coord64-1, x_coord128 + 2, y_coord64 + 2, write_erase); break;
        }

    }
  }

}



Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: teknikelektronikci - 20 Mart 2011, 12:16:33
benim anlamadigim mcu bilgiis olmayan arkadaslar niye cok büyük projelerin altina giriyor gecenlerdede bir tanesi cosfi yapacak amcam mcu bilmiyor

arkadasim sana soracagim sey öncellikle elektronik bilgin varmi bölümün ne ona göre sana tavsiyelerde bulunalim eger bölümün bilgisyar ise
yelkenci arkadasin kullandigi modülü kullan derim elektronik bilgi gerektirmez

https://www.picproje.org/index.php/topic,32062.msg227292/topicseen.html#msg227292

yok ben elektronik bilyiorum ama pic v.s mcu ögrencem dersen

projen icin önce lcd ve dokunmatik ekrani temin et

http://www.elektrovadi.com/LCD-DOKUNMATIK-PANEL,LA_182-2.html

tabi elektronik kisim icin bir prototyp baski devre hazirlaman gerekecek öncesinde isis de semani ciz
hani bilgin nedir ne degildir bunlari yazda bizde yönlendirelim birde lütven p.m ile degil kolay gelsin

Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 20 Mart 2011, 20:56:20
Elektronik ve haberleşme mühendisliği okuyorum. Mikroişlemci ve denetleyici bilgim var biraz ama daha önce sadece basit projelerde bulunduğum için bu çeşit bir proje zor geldi. Bitirme projem çok ağır o yüzden stresliyim dokunmatik ekran işini hallettikten sonra imza tanımaya geçmem gerekiyor. bu yüzden öncelikle imza atıp ardından seri portla bilgisayara yollayıp matlab ile yapay sinir ağları yardımıyla  traninge başlayacağım. Çok vaktim kalmadıığı için sizden bu kadar çok yardım talep ettim. 8086 6802 8051 gibi işlmeci ve mikrodenetleyicileri assembly olarak gördüm. Ama c ile detaylı projelerde zorlanıyorum işte. Teşekkür edeirm yinede edebileceğiniz yardımlar için kusura bakmayın
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 20 Mart 2011, 20:58:55
bu arada dokunmatik ekranım ve  glcd im var zaten devreyi kurdum ondada sıkıntı yok dookunduğum yerdeki voltajları görebiliyorum
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: teknikelektronikci - 20 Mart 2011, 21:20:26
o zaman sorun nedir devreyi kurmusunuz dokundugunuz yerdeki voltaji görüyorsunuz geriye ne kaldi bu bilgiyi seri portla aktarmak gerisinide artik bilgisyarda halledeceksiniz veya programi gelistirmek size kalmis bir sey yaniliormuyum ?
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 20 Mart 2011, 22:30:28
İşte problem sadece voltajı ölçebiliyorum dokunduğum yerdeki pikselleri yakamıorm. ADC 10 bitlik benim ekranım ise 128x64.  Burdan işin içinden çıkamadım işte ya biliyorum çoksoru sordum ama ordaki matematik oyununu nasıl çözerim bilmiyorum
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: satilla - 21 Mart 2011, 14:52:27
dediğim gibi yapacaksın aldığın ölçümlerin doğru olması için 10 defa örnekleme yapacaksın aldığın değeri ve bu değerlerin ortalamasını alıp dokunduğun noktayı belirliyeceksin
eğer dokunmatik ekranlı bir pda kullandıysan onlardada bu sistem mantığı vardır cihaz açılırken touch'un 4 köşesine ve ekran ortasına belirlenmiş noktaya dokunursun, böylece kalibre etmiş olursun
ekrandaki nokta bilgisinide seri haberleşme kullanarak pc'ye aktarmanda zor olmasa gerek?
bu arada eğer 2 ay kadar bir vaktin varsa ben de benzer bir proje yapacağım yaptıktan sonra sana yollarım
touch için sürücü devresiyi halledebildin değil mi?
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: Tagli - 21 Mart 2011, 16:13:00
Alıntı yapılan: sinansinan09 - 21 Mart 2011, 14:52:27
dediğim gibi yapacaksın aldığın ölçümlerin doğru olması için 10 defa örnekleme yapacaksın aldığın değeri ve bu değerlerin ortalamasını alıp dokunduğun noktayı belirliyeceksin
10 değil de 8 örnekleme yaparsan PIC sana duacı olur. Bölmeyi sağa kaydırarak yapmak gerekiyor tabi.
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 21 Mart 2011, 16:24:03
Tamam ben hallettim sürücü devre 2 tane pnp transistörle halloluyo zaten.  Dokunduğum yerleri yakabiliyorum çözümünü merak eden arkadaş olursa yardımcı olabilirim oldukça basit bir işlem ama bu sfer başka bir problem çıktı önüme donanımsal bir hatamıdır bilemiyorum. benim dokunduğum yerlerdeki pikseller güzelce yanıyor problem yok da ekranın sağ köşesinde kendi kendine sanki basılmış gibi pikseller yanıyor onu çözemedim threshold değerle alakası varmı bilmiyorum maximum düzeye getirdim gene olmadı bu konuda fikri olan varmı
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: teknikelektronikci - 21 Mart 2011, 18:44:48
ekranda voltajlari gösteren programi kendinizmi yazdiniz hazirmi ?
belliki hazir
neyse adc degerleri alindiktan sonra program büyük olasilikla ekrana gösterme alt programina gidiyordur siz öncellikle x ve y ekseninin 0 oldugu andaki voltaji okuyun sonra 128x64 deki voltaji okuyun sonra bu arada alinan degerlere göre ekrana yazdirma(voltajin) bölümünde bir kisim daha ekleyerek biraz matematiksel islem yaparak( artik mühendisiniz bunun denkelimini v.s bulursunuz) okunan voltajin hangi pixele denk geldigini hesaplayin ve o noktaya pixel yazdirma komutu gönderin hani ben böyle uygulama yapmadim ama yapcak olsam bu benim izleyecegim yöntem olurdu

her seyden önce madem elinizde bir program varda niye burda paylasmiyorsunuz forumdan belki birisi cikip geri kalani bitirecek veya yardimci olacakdir en azindna ben tahmin etmek yerine programa bakarak konusurdum !!

son mesajlarini görmeden yukardakini yazmis oldum problemi halletmisin
ama yine sorun burda forumda vatandas ödevi icin soru soruyor ama sorunu hallediyor cözümü yazmiyor niye pm cekilmesini veya crapdeno üstad bize bi yardimci olsana denmesi bekleniyor !! yanlismiyim crapdeno arkadas ?

Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: crapdeno - 21 Mart 2011, 22:38:48
Hayır öyle kasti bir düşüncem olmadı :s ben ilk kez forumda dolanıyorum bilmiyorum forum nasıl kullanılır. Evet voltaj ölçme kısmını netten aldım adc hakkında eksiğim vardı mantığını anladıktan sonra da geri kalan problemi çözmek zor olmadı.  Kodu ve devreyi f_machine arkadaşımın  https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/ (https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/)
linkinden aldım zaten o kısmı aynı pikseli yakma kısmını anlatayım öncelikle 0-5 volt arasını 10 bitlik adc ile ölçeklendiriyor devre ve ters işlem yaparak bu kod sayesinde değdiğimiz nokttadaki adc değerine karşılık gelen voltajı buluyoruz. Fakat benim ekranım 128 e 64 lük idi. yani adc 10 bit benim x eksenim 7 bit y eksneim 6 bit. Bende burdaki kalibrasyonu yapabilmek için dokunmatik ekran üzerindeki köşe noktalarının geriimlerini ölçtüm ve ona göre yeniden kalibre ettim. Bazı arkadaşalrım niçin direk x ekseni için 1024/8=128 y ekseni için 1024/16=64 yapmadık diye sorabilir. O şekilde olmuyor çünkü benim gözlemlediğim voltajlar maximum 4.60 civarı minimumlar ise 0.4 civarı bişi çıkıyordu dolayısıyla baştan kalibre etmem gerekti. Tam koduda altta paylaşıyorum ama dediğim sorun devam ediyor nedense dokunmadığım yerlerdende piksel yanması alıyorum problem nerdedir bilmiyorum o konuda hala sıkıntım var

unsigned int x_koordinat(void );
unsigned int y_koordinat(void );
unsigned char basma_kontrol(void );
unsigned int adc_deger;
unsigned char ch;
long gerilim;

// Glcd module connections
char GLCD_DataPort at PORTD;

sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS  at RB2_bit;
sbit GLCD_RW  at RB3_bit;
sbit GLCD_EN  at RB4_bit;
sbit GLCD_RST at RB5_bit;

sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction  at TRISB2_bit;
sbit GLCD_RW_Direction  at TRISB3_bit;
sbit GLCD_EN_Direction  at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections


void main() {
  PORTA = 0x00;
  TRISA = 0x03;                                // RA0 i RA1 are analog inputs
  ANSEL = 0x03;
  ANSELH = 0;                                  // Configure other AN pins as digital I/O
  PORTC = 0 ;
  TRISC = 0 ;                                  // PORTC is output
  Glcd_Init();                                 // Glcd_Init_EP5
  Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32);   // Choose font size 5x7
  Glcd_Fill(0);                                // Clear GLCD




  Glcd_Write_Text("X= ",10,3,1);
  Glcd_Write_Text("Y= ",10,5,1);

    for (;;) {
      while (!basma_kontrol()); //panele dokunuldu mu?
      gerilim = (long)x_koordinat() * 5000; // okunan değeri mv a dönüştür
      gerilim = gerilim / 1023; // 0..1023 -> 0-5000mV
      ch = gerilim / 1000; // voltu elde et
      Glcd_Write_Char(48+ch,42,3,1); // voltu yazdır
      Glcd_Write_Char('.',50,3,1);
      ch = (gerilim / 100) % 10; // 0.1 volt değerlerini elde et
      Glcd_Write_Char(48+ch,58,3,1);
      ch = (gerilim / 10) % 10; // 0.01 volt değerlerini elde et
      Glcd_Write_Char(48+ch,66,3,1);
      ch = gerilim % 10; // 0.001 volt değerlerini elde et
      Glcd_Write_Char(48+ch,74,3,1);
      Glcd_Write_Char('V',82,3,1);
      //y koordinatı için aynı işlemleri tekrarla
      gerilim = (long)y_koordinat() * 5000;
      gerilim = gerilim / 1023;
      ch = gerilim / 1000;
      Glcd_Write_Char(48+ch,42,5,1);
      Glcd_Write_Char('.',50,5,1);
      ch = (gerilim / 100) % 10;
      Glcd_Write_Char(48+ch,58,5,1);
      ch = (gerilim / 10) % 10;
      Glcd_Write_Char(48+ch,66,5,1);
      ch = gerilim % 10;
      Glcd_Write_Char(48+ch,74,5,1);
      Glcd_Write_Char('V',82,5,1);
      Delay_Ms(5);
      glcd_dot((x_koordinat()/6.812)-10,(y_koordinat()/11.67)-15,2); // bu kısımda kendim kalibre ediyorum
    }
}

unsigned int x_koordinat() {
  unsigned int sonuc;
  TRISA.F0=0; // porta 0. bit çıkış
  PORTA=0; //porta yı temizle
  PORTC.F1=1; // Y+ yüksek empedans
  PORTC.F0 = 0; // X+ +5v
  Delay_Ms(5);
  sonuc=adc_read(1); // X koordinatını al
  TRISA.F0=1; //porta 0.bit analog giriş
  return sonuc;
}
unsigned int y_koordinat() {
  unsigned int sonuc;
  TRISA.F1=0; //porta 1.bit çıkış
  PORTA=0; //porta yı temizle
  PORTC.F1 = 0; // Y+ +5v
  PORTC.F0 = 1; // X+ yüksek empedans
  Delay_Ms(5);
  sonuc = adc_read(0); // Y koordinatını al
  TRISA.F1=1;
  return sonuc;
}
unsigned char basma_kontrol(void ) {
  unsigned int ADC_ESIK_DEGER=900; //esik deger (5V/1024)*(800)=3.9v
  unsigned char sonuc;
  TRISA.F1=1; // RA0 analog giriş
  TRISA.F0=1; //RA1 analog giriş
  PORTA=0; //portayı temizle
  PORTC.F1=0; // Y+ +5v
  PORTC.F0=1; //X+ yüksek empedans
  adc_deger=adc_read(0); // y koordinatını al
  sonuc = (adc_deger > ADC_ESIK_DEGER); // okunan değer eşik değerden büyükse sonuc=1
  Delay_Ms(2);
  adc_deger = adc_read(0); // hata olasılığı için işlemi tekrarla
  sonuc = sonuc & (adc_deger > ADC_ESIK_DEGER);
  return sonuc; //basıldıysa 1,basılmadıysa 0 olur
}

dediğim gibi kodun voltaj ölçme kısmı f_machine dostumdan alıntıdır. Tekrara teşekkürler
Başlık: Ynt: 128x64 glcd veri okumak
Gönderen: teknikelektronikci - 23 Mart 2011, 23:36:30
kodu incelemedim ama programa baslarken ekrani temizle sonra programa basla belki faydasi ollabilir
bu arada eline saglik kolay gelsin