GLCD Pixel Silme Sorunu

Başlatan SB7, 06 Mart 2019, 16:49:00

SB7

Merhabalar.
XC8 ile GLCD uygulaması yapıyorum. Amacım tüm pixellerin rengini değiştirmek. KS108 tipi bir GLCD ile çalışıyorum.
          for(sut=1;sut<64;sut++){  
          for(sat=1;sat<128;sat++){ 
          ks0108_pixel(sat,sut,1);
          DelayMs(10);
           }
          }
Bu şekilde bir kod yazıp tüm pixellerin 1,1 den itibaren rengini değiştiriyorum . Yazdığım kod çalışıyor ancak sorun 3 satır doğru çalıştıktan sonra diğer 3 satırda pixelleri siliyor .


Resimde de görüldüğü gibi bu 3 satır önce yazılıyor sonra siliniyor. Kütüphanede sorun vardır diye silinen pixellerde deneme yaptım. Mesela 1,1 pixelini set ettim sorun yok. Bu yüzden kütüphanede sorun olduğunu düşünmüyorum. Donanım olarak Expkits EXM1 kartını kullanıyorum. Kartın şematik dosyaları elimde mevcut. Kütüphaneyi ona göre ayarladım ve çeşitli denemeler yaptım herhangibir sorun göremedim.
Sizce sorun nerde olabilir?
-SB7

brandice5

1,1 yerine 1,2 yada 2,1 pixelini set ederek deneme yap.

satır sütun ters olabilir, yerlerini değiştirip dene.

SB7

#2
@brandice5 hocam sorun ondan kaynaklanmıyor. Denedim dediğinizi de satır sütun olayının pek bir önemi yok şimdilik. Sadece 1 satırı yapınca böyle bir sorunla karşılaşmıyorum.
Örneğin
  sat=0;
          for(sut=0;sut<128;sut++){  
          ks0108_pixel(sut,sat,1);
          DelayMs(10);
          }
Böyle deneyince  sadece 1. satırı tersleyebiliyorum. Silinme olmuyor ancak
sat++;
 
yapınca yine aynı şekilde 3 satır silinip 3 satır yazılıyor.
-SB7

RaMu

sat sut unsigned tanımlı mı ve
pixel fonksiyonu nasıl yazılmış nasıl kullanılabiliyor
bunlara bakmak lazım.
Muhtemelen 0~63 0~127 değer alıyordur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Tagli

Bu GLCD'lere piksel erişimi nasıl oluyor? Aklımda yanlış kalmadıysa tek seferde dikey 8 piksel yazılıyor olmalı. Kütüphane içeride bir frame buffer mı tutuyor yoksa oku-değiştir-yaz mantığı ile mi çalışıyor?

ks0108_pixel fonksiyonu 1 bit değil de 1 byte alıyor olabilir mi? Yani şunun gibi:
for (sut=0; sut < 128; sut++){  
    for(sat=0; sat < 8; sat++){ 
        ks0108_pixel(sat,sut,0xff);
        DelayMs(10);
    }
}
Gökçe Tağlıoğlu

SB7

@RaMu Hocam teşekkürler.unsigned char olarak tanımlı.Kullandığım kütüphaneyi fırat devecinin Hi-Tech C derslerinden alıp düzenledim.
#include <xc.h>
#include "glcd.h"
#include "delay.h"
#define EKRANAC 0x3F
#define EKRANKAPA 0x3E
#define sag 1
#define sol 0
void ks0108_init(void)
{
RST=1;
EN=0;
CS1=0;
CS2=0;
DI=0; //Komut verilecek
ks0108_write(sag, 0xC0); //En üst RAM'in ilk RAM olduğu belirleniyor
ks0108_write(sol, 0xC0);
ks0108_write(sag, 0x40); //Sütunun en baĢına gidiliyor, Y=0
ks0108_write(sol, 0x40);
ks0108_write(sag, 0xB8); //Satırın en baĢına gidiliyor, X=0
ks0108_write(sol, 0xB8);
ks0108_write(sag, EKRANAC); //Ekranı aç
ks0108_write(sol, EKRANAC);
ks0108_fill(0);
}
void ks0108_write(unsigned char chip, unsigned char veri){
if(chip)
{
CS1=0;
CS2=1;
}
else
{
CS1=1;
CS2=0;
}
RW=0; // Veri yazma moduna alındı
GLCD_PORT=veri;
DelayUs(10);
EN=1; // DüĢen kenar tetiklemeli
DelayUs(10);
EN=0;
CS1=0; // Chip seçim alanları temizleniyor
CS2=0;
}
unsigned char ks0108_read(unsigned char chip)
{
unsigned char veri;
TRIS_GLCD=0xFF;
RW=1;
if(chip)
{
CS1=0;
CS2=1;
}
else
{
CS1=1;
CS2=0;
}
DelayUs(10);
EN=1;
DelayUs(10);
veri=GLCD_PORT;
EN=0;
TRIS_GLCD=0x00;
CS1=0;
CS2=0;
return veri;
}
void ks0108_pixel(unsigned char x, unsigned char y, unsigned char renk)
{
unsigned char veri, kay=1;
unsigned char chip=sol;
if(x>63) // 63'ten büyükse ikinci chipe geç
{
x=x-64;
chip=sag;
}
DI=0; // Komut verilecek
x=x&0x7F; // X için komutlar hazırlanıyor
x=x|0x40;
ks0108_write(chip,x); // X için komut veriliyor
ks0108_write(chip,(y/8 & 0xBF) | 0xB8); // Y için komut veriliyor
DI=1; // Veri okunup, yazılacak
ks0108_read(chip); // Yeni adres bilgisi için
veri=ks0108_read(chip); // GLCD iki kez okunuyor
if(renk) // Pixel açık mı kapalı mı
veri=veri | kay<<y%8;
else
veri=veri & (~(kay<<y%8));
DI=0; // Komut veriliyor
ks0108_write(chip,x);
DI=1; // Yazım yapılıyor
ks0108_write(chip,veri);
}
void ks0108_fill(unsigned char renk){
unsigned char i,j;
for(i=0;i<8;i++) // 8 sayfa var
{
DI=0; // Komut veriliyor
ks0108_write(sol,0x40);
ks0108_write(sag,0x40);
// Her seferinde, her sayfanın baĢına gidiliyor
ks0108_write(sol,i | 0xB8);
ks0108_write(sag,i | 0xB8);
DI=1; // Veri gönderilecek
for(j=0;j<64;j++) // 64 sütun var
{
if(renk){
ks0108_write(sag, 0xFF);
ks0108_write(sol, 0xFF);
}
else{
ks0108_write(sag, 0x00);
ks0108_write(sol, 0x00);
}
}
}
}
void ks0108_line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2, unsigned char renk){
int addx=1, addy=1, P;
unsigned char i, dy, dx, diff;
if(x2>x1)
dx = x2 - x1;
else{
dx = x1 - x2;
addx = -1;
}
if(y2>y1)
dy = y2 - y1;
else{
dy = y1 - y2;
addy = -1;
}
if(dx >= dy){
dy *= 2;
P = dy - dx;
diff = P - dx;
for(i=0; i<=dx; ++i){
ks0108_pixel(x1, y1, renk);
if(P < 0)
{
P += dy;
x1 += addx;
}
else{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
else{
dx *= 2;
P = dx - dy;
diff = P - dy;
for(i=0; i<=dy; ++i){
ks0108_pixel(x1, y1, renk);
if(P < 0){
P += dx;
y1 += addy;
}
else
{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
}
void ks0108_rect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char dolu, unsigned char renk)
{
if(dolu){
unsigned char i, xmin, xmax, ymin, ymax;
if(x1 < x2){
xmin = x1;
xmax = x2;
}
else{
xmin = x2;
xmax = x1;
}
if(y1 < y2){
ymin = y1;
ymax = y2;
}
else{
ymin = y2;
ymax = y1;
}
for(; xmin <= xmax; ++xmin){
for(i=ymin; i<=ymax; ++i){
ks0108_pixel(xmin, i, renk);
}
}
}
else{
ks0108_line(x1, y1, x2, y1, renk);
ks0108_line(x1, y2, x2, y2, renk);
ks0108_line(x1, y1, x1, y2, renk);
ks0108_line(x2, y1, x2, y2, renk);
}
}
void ks0108_circle(unsigned char x,unsigned char y, unsigned char r, unsigned char dolu, unsigned char renk){
unsigned char a,b;
int P;
a=0;
b=r;
P=1-r;
do
{
if(dolu){
ks0108_line(x-a, y+b, x+a, y+b, renk);
ks0108_line(x-a, y-b, x+a, y-b, renk);
ks0108_line(x-b, y+a, x+b, y+a, renk);
ks0108_line(x-b, y-a, x+b, y-a, renk);
}
else{
ks0108_pixel(a+x, b+y, renk);
ks0108_pixel(b+x, a+y, renk);
ks0108_pixel(x-a, b+y, renk);
ks0108_pixel(x-b, a+y, renk);
ks0108_pixel(b+x, y-a, renk);
ks0108_pixel(a+x, y-b, renk);
ks0108_pixel(x-a, y-b, renk);
ks0108_pixel(x-b, y-a, renk);
}
if(P < 0)
P+= 3 + 2 * a++;
else
P+= 5 + 2 * (a++ - b--);
}
while(a <= b);
}
/* 
* KS0108 GLCD Kullan?m Klavuzu
* ks0108_init(); ile ilk ayarlar? yap
* ks0108_write(0,0x55); ?eklinde veri yaz
* veri=ks0108_read(0); ?eklinde veri oku
* ks0108_pixel(1,1,1) ?eklinde herhangi bir pixeli aç ya da kapa (sut,sat,deger)
* ks0108_fill(1); ?eklinde tüm ekran pixelleri aç?l?r ya da kapan?r
* ks0108_line(10,10,20,50,1); ?eklinde belirtilen koordinatlarda çizgi çiz
* ks0108_rect(10,10,20,20,1,1); ?eklinde belirtilen koordinatlarda dikdörtgen çiz
* ks0108_circle(10,10,10,1,1); ?eklinde daire çiz
* 
*/
#define TRIS_GLCD   TRISD //Pin tan?mlamalar?
#define GLCD_PORT   PORTD
#define CS1 		LATBbits.LATB3
#define CS2 		LATBbits.LATB4
#define DI  		LATBbits.LATB0 
#define RW  		LATBbits.LATB1
#define EN  		LATBbits.LATB2
#define RST 		LATBbits.LATB5
extern void ks0108_init(void);
extern void ks0108_write(unsigned char chip, unsigned char veri);
extern unsigned char ks0108_read(unsigned char chip);
extern void ks0108_pixel(unsigned char x, unsigned char y, unsigned char renk);
extern void ks0108_fill(unsigned char renk);
extern void ks0108_line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2, unsigned char renk);
extern void ks0108_rect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char dolu, unsigned char renk);
extern void ks0108_circle(unsigned char x,unsigned char y, unsigned char r, unsigned char dolu, unsigned char renk);
kütüphane dosyaları bu şekilde herhangibir satırı kaplarken sıkıntı olmuyor hocam.
@Tagli hocam teşekkürler. Dediğinizi denedim yine 3 satır boşluk 3 satır dolu oluyor. İşin içinden çıkamadım.
-SB7

RaMu

void ks0108_pixel(unsigned char x, unsigned char y, unsigned char renk)
{
unsigned char veri, kay=1;
unsigned char chip=sol;
if(x>63) // 63'ten büyükse ikinci chipe geç
{
x=x-64;
chip=sag;
}
Fonksiyona bakılırsa:
0<=x<=127 değerlerini alır,
0<=y<=63 değerlerini alır.

Bu:
for (sat=0; sat <= 63; sat++){  
    for(sut=0; sut <= 127; sut++){ 
        ks0108_pixel(sut,sat,0xff);
        DelayMs(10);
    }
}

veya şu şekilde dene:
for(sut=0; sut <= 127; sut++){  
    for (sat=0; sat <= 63; sat++){ 
        ks0108_pixel(sut,sat,0xff);
        DelayMs(10);
    }
}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html