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 (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
}
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.
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);