GLCD Menu Gecis Yavasligi

Başlatan M_B, 30 Ekim 2016, 12:44:31

M_B

Merhaba Aradaslar;
Pic18f4620 ve KS0108 128x64  ekranla menu üzerine calısmalar yapıyorum.
Video daki gibi gecislerde yavaslık var. Bunu nasıl cozebilirim.
Ekran dan kaynaklanıyor dersem nette bu tur uygulama yapanlarda sorun yok.
mikroC kullandığım icin kutuphaneler kapalı :(
Bu yuzden bu derleyiciyi bırakacam. ( Aklın yolu bir )
bu arada elinde Ks0108 xc8 kutuphanesi olan varsa paylasabilirmi ?

Teşekkürler

Video:
https://www.youtube.com/watch?v=Pwm6et_wNRI&feature=youtu.be





#include "hardware.h"


#define INVERT 2
#define CLEAR  0
#define BLACK  1
#define EkranSil Glcd_Fill(0x00)        // ekran temizlendi


sbit YUKARI at RA0_bit;
sbit ASAGI at  RA1_bit;
sbit SAG   at  RA2_bit;
sbit SOL   at  RA3_bit;
sbit ENTER at  RA4_bit;


const char  ctext[] = "mikroElektronika";

char *someText;

char Durum;
char Str1;
char Str2;


void Goster(char y,char x);
void ShowMenu(void);
void MenuCubugu(char x, char y);
void Cerceve(void);
void Line(char x, char renk);
void ShowPrgMenu(void);
void OkYonu(void);
void MainMenu(void);
void ProgramMenu(void);
void PrgPage(char page);
void SatirLariSil(void);




 char *Menu[]=
{
  "           MENU         ",
  "  PROGRAM               ",
  "  MANUEL                ",
  "  AYAR                  ",
  "  CIKIS                 ",
  "                        "
};


 char *PrgMenu[]=
{
  "        PROGRAM         ",  // 0
  "  PROGRAM -1            ",  // 1
  "  PROGRAM -2            ",  // 2
  "  PROGRAM -3            ",  // 3
  "  PROGRAM -4            ",  // 4
  "  PROGRAM -5            ",  // 5
  "  CIKIS                 ",  // 6
  "                        "   // 7
};



void main() {

  ADCON1 |= 0x0F;         // AN pinleri dijital giriş/çıkış
  CMCON  |= 7;            // komparatörler disable edildi
  TRISA=0x1F;
  Glcd_Init();            // KS108 GLCD yapılandırıldı
  Glcd_Fill(0x00);        // ekran temizlendi
  Glcd_Write_Text("    MENU UYGULAMA  ", 0, 0, 1);      // text ekrana
  Glcd_Write_Text("  Test . ver.1 ", 0, 3, 1);          // gönderiliyor
  Glcd_Write_Text("                      ", 0, 7, 1);      //
  Delay_ms(1000);
  Glcd_Fill(0);                 // Ekrani siliyor

  

  while(1) {
            MainMenu();
            Delay_ms(50);
           }
}

/*******************************************************************************
                       ANA MENU
*******************************************************************************/
void MainMenu(void)
{
char MenuCikis=1;
char MenuNo=1;
ShowMenu();
Cerceve();
MenuCubugu(1, INVERT);   // ilk acilista program secili
while(MenuCikis)
                {
                if(ASAGI){
                           MenuCubugu(MenuNo, INVERT);   // secili olan siliniyor
                           MenuNo++;
                          if(MenuNo==5){
                                        MenuNo=1;
                                        MenuCubugu(MenuNo, INVERT);        // Bir sonraki seciliyor
                                        }else
                                             {
                                             MenuCubugu(MenuNo, INVERT);   // Bir sonraki seciliyor
                                             }
                          while(ASAGI);
                          }
                /******************************************************/
                
                if(YUKARI){
                           MenuCubugu(MenuNo, INVERT);   //secili olan siliniyor
                           MenuNo--;
                         if(MenuNo==0){
                                        MenuNo=4;
                                        MenuCubugu(MenuNo, INVERT);        // Bir sonraki seciliyor
                                        }else
                                             {
                                             MenuCubugu(MenuNo, INVERT);   // Bir sonraki seciliyor
                                             }
                          while(YUKARI);
                          }
                 
                 /******************************************************/
                 if(ENTER){
                 

                           if(MenuNo==1)  // Program
                                          {
                                          ProgramMenu();
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          MenuCikis=0;
                                          }
                 
                           if(MenuNo==4)  // Cikis
                                          {
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          MenuCikis=0;
                                          }
                 

                 
                 
                          } // ENTER sonu.
                 


                }  // while MenuCikis end.

EkranSil;
Glcd_Write_Text(" MENU DEN CIKILDI  ", 0, 0, 1);      // text ekrana
Delay_ms(250);
Delay_ms(500);
EkranSil;

}


/******************************************************************************/
void MenuCubugu(char x, char renk)
{
  Glcd_Box(18, (x*13),100, ((x*13)+9), renk);               // dikdortgen.
}

/******************************************************************************/
void ShowMenu(void)
{
char i;
char x;
char y;
x=0;
y=0;
for(i=0;i<5;i++)
                {
                Glcd_Write_Text_Adv(Menu[i], 22, x);  // Yazi
                x=x+13;
                }
}

/******************************************************************************/
 void Cerceve(void){
  Glcd_Box(0, 0,126, 9, 2);               // dikdortgen. 18->0 oldu
  Glcd_Box(0, 11, 126, 11, 2);           // ince cizgi   100->126  oldu
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Bu tür uygulamalarda GLCD için bir Frame_Buffer ayırmak işleri çok hızlandırır. Heleki Max 10mips hızda çalışan bir mcu için.

Şuanda Anladığım kadarıyla menü geçişi için İnvert yapma ters yazma gibi işlemleri tekrar tekrar yapman gerekiyor. Bu işlemleri Doğrudan GLCD üzerinde yapmak yerine 128*64 GLCD için Ram'den 512 Byte'lık alan üzerinde yapmak geçiş yavaşlıklarının önüne geçer. Ekranla ilgili bütün işlemleri bunun üzerinde yapıp sonra tek seferde bütün ekranın datasını güncellemek daha hızlı olur. Güncelleme işleminde hızlıca RAM'deki değerleri ekrana göndereceksin.



ErsinErce

sıkıntı delay ve while kullanımlarında

delay kullanaktan vazgeçip state machine yapısı uygulayın

aynı şey while (button) içinde geçerli
bir kişi butona saniyede 1000 defa basamaz belirli bir zaman için 3-4 defa butondan giriş okuduğunuzda işlemi gerçekleştirecek hale getirin

GLCD rutinleriniz piksel tabanlı mı çalışıyor? genelde bu sebeple çok yavaş oluyor.

ayrıca bu kodu neden böyle yazmıyorsunuz?
if(MenuNo==5){
     MenuNo=1;
     MenuCubugu(MenuNo, INVERT);
} else {
    MenuCubugu(MenuNo, INVERT);
}


    if(MenuNo==5) MenuNo=1;
    MenuCubugu(MenuNo, INVERT);