27 Mayıs 2019, 15:34:30

Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d


GLCD Pixel Silme Sorunu

Başlatan SB7, 06 Mart 2019, 19: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?

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

06 Mart 2019, 20:39:33 #2 Son düzenlenme: 06 Mart 2019, 20:51:32 SB7
@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.

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=0sut 128sut++){  
    for(
sat=0sat 8sat++){ 
        
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(sag0xC0); //En Ã¼st RAM'in ilk RAM olduğu belirleniyor
ks0108_write(sol0xC0);
ks0108_write(sag0x40); //Sütunun en baĢına gidiliyor, Y=0
ks0108_write(sol0x40);
ks0108_write(sag0xB8); //Satırın en baĢına gidiliyor, X=0
ks0108_write(sol0xB8);
ks0108_write(sagEKRANAC); //Ekranı aç
ks0108_write(solEKRANAC);
ks0108_fill(0);
}
void ks0108_write(unsigned char chipunsigned 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 xunsigned char yunsigned char renk)
{
unsigned char verikay=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/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,0xB8);
ks0108_write(sag,0xB8);
DI=1// Veri gönderilecek
for(j=0;j<64;j++) // 64 sütun var
{
if(
renk){
ks0108_write(sag0xFF);
ks0108_write(sol0xFF);
}
else{
ks0108_write(sag0x00);
ks0108_write(sol0x00);
}
}
}
}
void ks0108_line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2unsigned char renk){
int addx=1addy=1P;
unsigned char idydxdiff;
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;
dy dx;
diff dx;
for(
i=0i<=dx; ++i){
ks0108_pixel(x1y1renk);
if(
0)
{
+= dy;
x1 += addx;
}
else{
+= diff;
x1 += addx;
y1 += addy;
}
}
}
else{
dx *= 2;
dx dy;
diff dy;
for(
i=0i<=dy; ++i){
ks0108_pixel(x1y1renk);
if(
0){
+= dx;
y1 += addy;
}
else
{
+= diff;
x1 += addx;
y1 += addy;
}
}
}
}
void ks0108_rect(unsigned char x1unsigned char y1unsigned char x2unsigned char y2unsigned char doluunsigned char renk)
{
if(
dolu){
unsigned char ixminxmaxyminymax;
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=ymini<=ymax; ++i){
ks0108_pixel(xminirenk);
}
}
}
else{
ks0108_line(x1y1x2y1renk);
ks0108_line(x1y2x2y2renk);
ks0108_line(x1y1x1y2renk);
ks0108_line(x2y1x2y2renk);
}
}
void ks0108_circle(unsigned char x,unsigned char yunsigned char runsigned char doluunsigned char renk){
unsigned char a,b;
int P;
a=0;
b=r;
P=1-r;
do
{
if(
dolu){
ks0108_line(x-ay+bx+ay+brenk);
ks0108_line(x-ay-bx+ay-brenk);
ks0108_line(x-by+ax+by+arenk);
ks0108_line(x-by-ax+by-arenk);
}
else{
ks0108_pixel(a+xb+yrenk);
ks0108_pixel(b+xa+yrenk);
ks0108_pixel(x-ab+yrenk);
ks0108_pixel(x-ba+yrenk);
ks0108_pixel(b+xy-arenk);
ks0108_pixel(a+xy-brenk);
ks0108_pixel(x-ay-brenk);
ks0108_pixel(x-by-arenk);
}
if(
0)
P+= a++;
else
P+= * (a++ - b--);
}
while(
<= 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 chipunsigned char veri);
extern unsigned char ks0108_read(unsigned char chip);
extern void ks0108_pixel(unsigned char xunsigned char yunsigned char renk);
extern void ks0108_fill(unsigned char renk);
extern void ks0108_line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2unsigned char renk);
extern void ks0108_rect(unsigned char x1unsigned char y1unsigned char x2unsigned char y2unsigned char doluunsigned char renk);
extern void ks0108_circle(unsigned char x,unsigned char yunsigned char runsigned char doluunsigned 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.

RaMu

void ks0108_pixel(unsigned char xunsigned char yunsigned char renk)
{
unsigned char verikay=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=0sat <= 63sat++){  
    for(
sut=0sut <= 127sut++){ 
        
ks0108_pixel(sut,sat,0xff);
        
DelayMs(10);
    }
}

veya şu şekilde dene:
for(sut=0sut <= 127sut++){  
    for (
sat=0sat <= 63sat++){ 
        
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