Lcd menu keypad Sorunu

bearzalk

Üye
Katılım
19 Kas 2019
Mesajlar
6
Puanları
1
Yaş
31
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:
Konuya pek hakim değilim ne yazık ki, yardım edebilir misiniz lütfen?
 
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.
 
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.
 
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
 
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:
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.

Kod:
/**

  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.
 

Forum istatistikleri

Konular
127,960
Mesajlar
913,920
Kullanıcılar
449,607
Son üye
sinan343834

Yeni konular

Geri
Üst