Lcd menu keypad Sorunu

bearzalk

Üye
Katılım
19 Kas 2019
Mesajlar
6
Puanları
1
Yaş
26
Keypad'de en son basılan tuş ile Lcd de ekran değişimi ile menu tasarlamaya çalışıyorum. Yazdığım kod bu şekilde:
Kod:
char K;



char T;



void MainMenu()

{

do

{

K = kbd_getc();

T = K - 48;

lcd_gotoxy(1,1);

printf(lcd_putc,"A)MOD B)SET HOUR");

delay_ms(5);

if((K=='A') || (K=='B') ||(K=='C') || (K=='D'))

{

printf(lcd_putc,"\f U is zero now");

U=0;

}

}while(U==1);

}



void AltMod()

{

lcd_gotoxy(21,1);

printf(lcd_putc, "\fPRESS * FOR MAIN MENU\n");

delay_ms(5);



lcd_gotoxy(1,2);

printf(lcd_putc,"ENTER NUM=>\n");



}



void AltModRun()

{

do

{

K = kbd_getc();

T = K - 48;

if((K!=0) && (K!='A') && (K!='B') && (K!='C') && (K!='D')&& (K != '*') && (K != '#'))

{

A = (A*10) + T;

//Don't add Y=20 here, it resets it to 20 in every cycle

Y++;

lcd_gotoxy(Y,1);

printf(lcd_putc,"PRESS # FOR SUBMIT %d",T);

delay_ms(5);

}

if(K=='#')

{

num= A;

lcd_gotoxy(21,2);

printf(lcd_putc,"%d NUM IS CHOSEN", num);

delay_ms(5);

}



if(K == '*')

{

printf(lcd_putc,"\fINSIDE MOD STAR");

Y=20;

Z=0;

A=0;

}

}while(Z==1);





void main()

{

kbd_init();



port_b_pullups(true);



set_tris_b(0xF0);



rtc_init();

lcd_init();

MainMenu();//To display Main menu when program starts

while(true)

{



K = kbd_getc();

T = K - 48;



switch(K)

{



case 'D':

Z=1;

AltMod();

AltModRun();

break;





case '*':

U=1;

printf(lcd_putc, "\fINSIDE CASE STAR");

//MainMenu();

break;

}

}

}
Keypad'de A'ya basınca bir menüye, B'ye basınca başka bir menüye switch case ile geçebiliyorum, *'a basınca da ana menüye dönüyorum. *'a bastıktan sonra ana menüde rtc_get_time ile saniye bilgisinin güncellendiğini görüyorum.

case * 'ın içinde sadece printf olduğunda program istediğim gibi çalışıyor, fakat printf'i comment yapıp MainMenu()'yle çalıştırınca MainMenu'nun içinden çıkmıyor.

Program ilk çalıştığında D'ye basınca hemen geçiyor, * ile Main Menu'ye geçip oradan D'ye 17 kez ard arda basınca anca geçiyor main menüden alt menüye.
 
Moderatör tarafında düzenlendi:

by lent

Yönetici
Yönetici
Yönetici
Katılım
21 Nis 2009
Mesajlar
9,697
Puanları
2,508
Konu Sah
B

bearzalk

Üye
Katılım
19 Kas 2019
Mesajlar
6
Puanları
1
Yaş
26
Konuya pek hakim değilim ne yazık ki, yardım edebilir misiniz lütfen?
 

alarmko

Üye
Katılım
14 Ocak 2009
Mesajlar
428
Puanları
8
K = kbd_getc(); ile okudugun deger herhangibir sebeple yanlıs bir deger ise döngüye girer ve birdahada döngünün içinden cıkamazsın.onun için do while döngüsü yerine sadece while döngüsü kullan veya hatalı bir bilgi gelmissede u=0 yaparak cevrimden cıkmayı sagla.
sizin mantıgınızda bilginin sürekli olarak dogru geldigini varsaymıssınız,hatalı bilgide yapılacak işlem yok.
 
Konu Sah
B

bearzalk

Üye
Katılım
19 Kas 2019
Mesajlar
6
Puanları
1
Yaş
26
K = kbd_getc(); ile okudugun deger herhangibir sebeple yanlıs bir deger ise döngüye girer ve birdahada döngünün içinden cıkamazsın.onun için do while döngüsü yerine sadece while döngüsü kullan veya hatalı bir bilgi gelmissede u=0 yaparak cevrimden cıkmayı sagla.
sizin mantıgınızda bilginin sürekli olarak dogru geldigini varsaymıssınız,hatalı bilgide yapılacak işlem yok.
Hocam döngüye girdikten sonra yanlış tuşa basmasam, örneğin sadece A'ya bassam bile çıkmıyor, hangi tuşa basılırsa basılsın çıkmıyor döngüden. Diğer fonksiyonda da bu mantıkla çıkıyor döngüden, lcd menüsüne gelince çalışmıyor nedense.
 

alarmko

Üye
Katılım
14 Ocak 2009
Mesajlar
428
Puanları
8
birde case '*' icerisine mainMenu() ye yonlendirmeden,mainMenu nun icindekileri case nin içerisine dogrudan yapıstırıp denermisiniz.yani mainmenu cagrılmayacak,işlem case nin içinde yapılacak şekilde.

case '*'
do

{

K = kbd_getc();

T = K - 48;

lcd_gotoxy(1,1);

printf(lcd_putc,"A)MOD B)SET HOUR");

delay_ms(5);

if((K=='A') || (K=='B') ||(K=='C') || (K=='D'))

{

printf(lcd_putc,"\f U is zero now");

break;

}

}while(1);

}

bunu denermisiniz
 
Konu Sah
B

bearzalk

Üye
Katılım
19 Kas 2019
Mesajlar
6
Puanları
1
Yaş
26
case '*'
do

{

K = kbd_getc();

T = K - 48;

lcd_gotoxy(1,1);

printf(lcd_putc,"A)MOD B)SET HOUR");

delay_ms(5);

if((K=='A') || (K=='B') ||(K=='C') || (K=='D'))

{

printf(lcd_putc,"\f U is zero now");

break;

}

}while(1);

}

bunu denermisiniz
Deneyeceğim hocam, konuyu takipte kalır mısınız lütfen rica etsem, burada tıkandım ve yardıma çok ihtiyacım var.

Denedim dediğiniz yöntemi, ne yazık ki yine çalışmıyor, tek fark eskiden 20 kere D'ye basınca case '*' dan çıkarken şimdi 5 kez basınca çıkıyor.
 
Moderatör tarafında düzenlendi:

alarmko

Üye
Katılım
14 Ocak 2009
Mesajlar
428
Puanları
8
Kardeş,öncelikle devreyi debug modunda calıstır,her okunan degeri biryerlere yazdır.büyük ihtimalle hatalı bir okuma veya okuyamama problemi var.gercek devre üzerinde okuma yapıldıgında breakpoint noktası koy ve ne okundugunu kontrol et.interruplı okuma işlemi varsa interrup flaglarını silmeyi unutmus olmayasın.rs232 okuma işleminde sadece bir çeşit okumaya kilitlenme,alternatif okuma programlarını dene.entegren microchip veya arm ise okuma için alternatif program gönderebilirim.
 

alarmko

Üye
Katılım
14 Ocak 2009
Mesajlar
428
Puanları
8
/**
Section: Included Files
*/
#include "eusart2.h"

/**
Section: Macro Declarations
*/
#define EUSART2_TX_BUFFER_SIZE 16
#define EUSART2_RX_BUFFER_SIZE 16

/**
Section: Global Variables
*/

volatile uint8_t eusart2TxHead = 0;
volatile uint8_t eusart2TxTail = 0;
volatile uint8_t eusart2TxBuffer[EUSART2_TX_BUFFER_SIZE];
volatile uint8_t eusart2TxBufferRemaining;

//volatile uint8_t eusart2RxHead = 0;//header kismina tasiyip global yaptim
volatile uint8_t eusart2RxTail = 0;
volatile uint8_t eusart2RxBuffer[EUSART2_RX_BUFFER_SIZE];//header kismina tasiyip global yaptim
volatile uint8_t eusart2RxCount;

/**
Section: EUSART2 APIs
*/

void EUSART2_Initialize(void)
{
// disable interrupts before changing states
PIE4bits.RC2IE = 0;
PIE4bits.TX2IE = 0;

// Set the EUSART2 module to the options selected in the user interface.

// ABDOVF no_overflow; SCKP Non-Inverted; BRG16 16bit_generator; WUE disabled; ABDEN disabled;
BAUD2CON = 0x08;

// SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
RC2STA = 0x90;

// TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave;
TX2STA = 0x24;

// Baud Rate = 9600; SPBRGL 223;
SP2BRGL = 0xDF;

// Baud Rate = 9600; SPBRGH 1;
SP2BRGH = 0x01;


// initializing the driver state
eusart2TxHead = 0;
eusart2TxTail = 0;
eusart2TxBufferRemaining = sizeof(eusart2TxBuffer);

eusart2RxHead = 0;
eusart2RxTail = 0;
eusart2RxCount = 0;

// enable receive interrupt
PIE4bits.RC2IE = 1;
}

uint8_t EUSART2_Read(void)
{
uint8_t readValue = 0;

while(0 == eusart2RxCount)
{
}

readValue = eusart2RxBuffer[eusart2RxTail++];
if(sizeof(eusart2RxBuffer) <= eusart2RxTail)
{
eusart2RxTail = 0;
}
PIE4bits.RC2IE = 0;
eusart2RxCount--;
PIE4bits.RC2IE = 1;

return readValue;
}

void EUSART2_Write(uint8_t txData)
{
while(0 == eusart2TxBufferRemaining)
{
}

if(0 == PIE4bits.TX2IE)
{
TX2REG = txData;
}
else
{
PIE4bits.TX2IE = 0;
eusart2TxBuffer[eusart2TxHead++] = txData;
if(sizeof(eusart2TxBuffer) <= eusart2TxHead)
{
eusart2TxHead = 0;
}
eusart2TxBufferRemaining--;
}
PIE4bits.TX2IE = 1;
}

char getch(void)
{
return EUSART2_Read();
}

void putch(char txData)
{
EUSART2_Write(txData);
}

void EUSART2_Transmit_ISR(void)
{

// add your EUSART2 interrupt custom code
if(sizeof(eusart2TxBuffer) > eusart2TxBufferRemaining)
{
TX2REG = eusart2TxBuffer[eusart2TxTail++];
if(sizeof(eusart2TxBuffer) <= eusart2TxTail)
{
eusart2TxTail = 0;
}
eusart2TxBufferRemaining++;
}
else
{
PIE4bits.TX2IE = 0;
}
}

void EUSART2_Receive_ISR(void)
{

if(1 == RC2STAbits.OERR)
{
// EUSART2 error - restart

RC2STAbits.CREN = 0;
RC2STAbits.CREN = 1;
}

// buffer overruns are ignored
eusart2RxBuffer[eusart2RxHead++] = RC2REG;
if(sizeof(eusart2RxBuffer) <= eusart2RxHead)
{
eusart2RxHead = 0;
}
eusart2RxCount++;
}
/**
End of File
*/

benim microchip için kullandıgım rs232 programı bu ve hiçbir sıkıntı yaşamadan data alıp gönderebiliyorum.
 

Sponsor Bağlantı

Forum istatistikleri

Konular
106,859
Mesajlar
753,096
Kullanıcılar
396,974
Son üye
mehmetaliuzun647

Yeni konular

Üst