www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flanken abfragen in C; MSP430 Olimex


Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community,

ich habe ein Olimexboard mit einem MSP430F449 mCPU.
Darauf sind vier Taster.
Ich will mit einen Taster wie die Tabulatortaste verwenden, sprich bei 
jedem Druck soll ein anderer Menupunkt angezeigt werden.
Dies habe ich bis jetzt so realisiert:
__________________________________________________________________
void Button1 ()
{ konst++;


  if (konst ==1)
  {Menu();
  }

  if (konst ==2)
  {Clock();
  }
  if (konst ==3)
  {Config();
  }
  if (konst ==4)
  {Timer();
  }
  if (konst ==5)
  {Sensor();
  }

  if (konst > 5)
  {konst=0;
  }
_____________________________________________________________________

Problem ist jetzt nur, dass konst so lange hochzählt wie ich den Taster 
halte. Sprich es ist zufall welcher Menupunkt angezeit wird....
Wie kann ich das Problem Softwareseitig beheben?

Danke für eure Hilfe

MfG
Styx

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal den Rest des Codes. So kann man auch nur Raten wo der 
Fehler liegt.
Auch die ISR ist in diesem Fall wichtig.
Du nutzt doch Interrupte oder etwa nicht?

Autor: J. M. (Firma: OCL) (lorcan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Code für die Flankenabfrage wäre wie gesagt interessant.
Außerdem solltest du davon ausgehen, das die Taster prellen und sich 
damit für einige Millisekunden in einem unbestimmten Zustand befinden.
Genaueresläßt sich aber nur mit deinem Code sagen.

Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also da ich sehr wenig Ahnung habe und trotzdem das für die Uni 
programmieren muss, hab ich die Beispielprogramme von Olimex und TI 
angeschaut und mir daraus mein eigenes zusammen gestrickt.

Ich hab noch kein Code für die Flankenabfragung geschrieben...
Habe leider keine Idee wie sowas aussehne soll...
Muss ich da die Baud-rate beachten?

Der Code sieht bis jetzt so aus:
#include  <msp430x44x.h>
//#include  <io430x44x.h>

#define          B1                 P3IN & BIT4       //B1 - P4.4
#define          B2                 P3IN & BIT5       //B2 - P4.5
#define          B3                 P3IN & BIT6       //B3 - P4.6
#define          B4                 P3IN & BIT7       //B4 - P4.7
#define          STATUS_LED         BIT3              //STATUS_LED - P1.3
#define          time               200
#define          time_s             200
#define          BUZ1_ON            P1OUT |= BIT0     //P4.2
#define          BUZ1_OFF           P1OUT &= ~BIT0    //P4.2
#define          BUZ2_ON            P1OUT |= BIT2     //P4.3
#define          BUZ2_OFF           P1OUT &= ~BIT2    //P4.3
#define          DALLAS             P2IN & BIT7       //P2.7 - DALLAS
#define          CR                 0x0d
#define          LF                 0x0a
#define          LED_OFF            P1OUT |= BIT3
#define          LED_ON             P1OUT &= ~BIT3


//LCD digit segments


unsigned char i,time_segment,TXData;
unsigned int j;
unsigned int konst=0;

const unsigned char UART_Message [] = "http://www.olimex.com/dev";


void Delay (unsigned int a);
void DelayX(unsigned int b);
void Clear_LCD(void);
void LCD_all(void);
void BUZZER (void);
void UART_transmit (unsigned char Transmit_Data);
void Menu(void);
void OK (void);
void Timer (void);
void An (void);
void Aus (void);
void Button1 (void);

void main(void)
{
//++++++++++++++++++++++++++++++
  WDTCTL = WDTPW | WDTHOLD;                      // stop watchdog timer

  FLL_CTL0 &= ~XTS_FLL;                           // XT1 as low-frequency
  _BIC_SR(OSCOFF);                               // turn on XT1 oscillator

  do                                             // wait in loop until crystal is stable
    IFG1 &= ~OFIFG;
  while (IFG1 & OFIFG);

  FLL_CTL1 &= ~FLL_DIV0;                              // ACLK = XT1
  FLL_CTL1 &= ~FLL_DIV1;


  IFG1 &= ~OFIFG;                                // clear osc. fault int. flag
  FLL_CTL1 &= ~SELM0;                             // set DCO as MCLK
  FLL_CTL1 &= ~SELM1;


//++++++++++++++++++++++++++++++



//  SVSCTL = 0x68;                                    //brown out

//  WDTCTL = WDTPW + WDTHOLD;                           // Stop watchdog timer

//  SCFI0 = BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7;  
//  SCFI0 |= FN_4;                            // x2 DCO frequency, 8MHz nominal DCO
//  SCFQCTL = SCFQ_1M;      

//  FLL_CTL0 = /*DCOPLUS + */XCAP10PF;                  //Set load Cap. for Cristal = 10pF                                  // x2 DCO frequency, 8MHz nominal DCO  

//  FLL_CTL1 |= SELM_XT2;                             //Select XT2 for CPU MCLK
//  SCFI1 = 0;
//  SCFQCTL = SCFQ_M | SCFQ_1M;                       //M=1, 1Mhz
//  _BIS_SR(SCG0+SCG1);                               //disable DCO in status_reg
//  DelayX(200);


//UART ini
  U1TCTL = SSEL0;                                     //UCLOCK = ACLK
  U1BR0 = 0x03;                                       //BAUD RATE = 9600
  U1BR1 = 0x00;
  U1MCTL = 0x4a;                                      //with modulation
  U1CTL = CHAR;                                       //Start 8bit 1stop, N
  ME2 = UTXE1 | URXE1;                                //enable RX and TX
  P4SEL |= BIT0 | BIT1;                               //select UART pins
  P4DIR |= BIT0;                                      //port direction for TXD0
  P4DIR &= ~BIT1;                                     //port direction for RXD0
//  IE1 |= URXIE0;                                    // Enable USART0 RX interrupt
//  _EINT();                                          // Enable interrupts
//  U1CTL &= ~SWRST;                                  //reset UART logic



//LCD ini
  Clear_LCD();
  TACTL = TASSEL0 | TACLR;                                //set timer_A
  LCDCTL = LCDON + LCD4MUX + LCDP0 + LCDP1 + LCDP2;       // STK LCD 4Mux, S0-S39
  BTCTL = BT_fLCD_DIV64;                                  // STK LCD freq ACLK/64
  P5SEL = 0xFC;                                           // Common and Rxx all selected

//IO port ini

  P1SEL=BIT5;                                             //p1.5 is 32768Hz
  P1DIR=BIT5 | BIT3 | BIT0 | BIT2;                        //BUZ,LED are outputs

  LCD_all();                                              //light all LCD segments

  for (i=0; i!=15; i++)
    {
      LED_ON;
      DelayX(60);
      LED_OFF;
      DelayX(60);
    }

  UART_transmit (CR);                                     //send message by RS232
  UART_transmit (LF);
  for (i=0; i!=26; i++)  UART_transmit (UART_Message[i]);
  UART_transmit (CR);
  UART_transmit (LF);

//---------------MAIN LOOP-----------------------------------

  while (1)
    {

     if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1);      //test RS 232 (echo+1)

     while ((DALLAS) == 0) BUZZER();                            //test DALLAS button

L1:  if ((B1) == 0) Clear_LCD();
     if ((B2) == 0) Button1();

     if ((B3) == 0)
       {
        time_segment=100;
        for (i=0; i!= 20; i++)
         {
           for (j=0; j!=9; j++)
            {
              LCDMEM[i] = (BIT0 << j);
              if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1);      //test RS 232 (echo+1)
              DelayX(time_segment);
              if((B1) == 0 ) goto L1;
              if((B2) == 0 ) goto L1;
              if((B4) == 0 )
                {
                  LCD_all();
                  goto L1;
                }
            }
         }
       }
      if((B4) == 0)
        {
           BUZZER();
           P1OUT &= ~STATUS_LED;                 //switch on status_led
        }
      else  P1OUT |= STATUS_LED;            //switch off status led
    }
}


void Delay (unsigned int a)                           //9+a*12 cycles
{
  unsigned int l;
  for (l=0 ; l != a; l++);
}

void Clear_LCD(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0x00;                  //clear Sxx
}

void LCD_all(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0xff;                  //turnon all LCD segments
}

void DelayX(unsigned int b)
{
unsigned int m;
for(m=0;m!=b;m++) Delay(255);
}

void BUZZER (void)
{
  BUZ1_OFF;
  BUZ2_ON;
  Delay(40);
  BUZ2_OFF;
  BUZ1_ON;
  Delay(40);
}

void UART_transmit (unsigned char Transmit_Data)              //UART1 Transmit Subroutine
{
  while ((IFG2 & UTXIFG1) == 0);                              //Wait for ready U1TXBUF
  U1TXBUF = Transmit_Data;                                    //send data
}

void Menu (void)
{
 Clear_LCD(); 
 LCDMEM[19]=0x68;  //M
 LCDMEM[18]=0x64;
 LCDMEM[17]=0x64;  //E
 LCDMEM[16]=0x90;
 LCDMEM[15]=0x68;  //N
 LCDMEM[14]=0x61;
 LCDMEM[13]=0x60;  //U
 LCDMEM[12]=0x70;
}

void OK (void)
{
  
 Clear_LCD(); 
 LCDMEM[19]=0x60;  // O
 LCDMEM[18]=0xF0;  // O
 LCDMEM[17]=0x64;  // K
 LCDMEM[16]=0x05;  // K

}

void Timer()
{
 Clear_LCD(); 
 LCDMEM[19]=0x01; //T
 LCDMEM[18]=0x88;
 LCDMEM[17]=0x01; //I
 LCDMEM[16]=0x08;
 LCDMEM[15]=0x68; //M
 LCDMEM[14]=0x64;  
 LCDMEM[13]=0x64; //E
 LCDMEM[12]=0x90;
 LCDMEM[11]=0x64; //R
 LCDMEM[10]=0xC3;
}

void An()
{
 Clear_LCD(); 
 LCDMEM[19]=0x64; //A
 LCDMEM[18]=0xE2;
 LCDMEM[17]=0x68; //N
 LCDMEM[16]=0x61; 
}

void Aus()
{
 Clear_LCD(); 
 LCDMEM[19]=0x64; //A
 LCDMEM[18]=0xE2;
 LCDMEM[17]=0x60; //U
 LCDMEM[16]=0x70; 
 LCDMEM[15]=0x44; //S
 LCDMEM[14]=0xB2;
}



void Button1 ()
{ konst++;
  
    
  if (konst ==1)
  {Menu();
  }

  if (konst ==2)
  {Aus();
  }
  if (konst ==3)
  {An();
  }
  if (konst ==4)
  {Timer();
  }
  if (konst ==5)
  {OK();
  }
  
  if (konst > 5)
  {konst=0;
  }
}

Letztendlich soll das eine Menuführung werden...

MfG
Styx

Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Thema Prellen hat mein Dozent gemeint die Taster seien schon 
entprellt...
Ich müsse mich darum nicht kümmern.

Autor: J. M. (Firma: OCL) (lorcan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flanken Abfrage:

Geh davon aus, dass der Button ungedrückt auf Null-Pegel ist.
Diesen Zusatnd speicherst du in einer Variable.
Beim nächsten Schleifendurchgang guckst du dir den Porteingang an. Wenn 
der Wert am Eingang nicht deinem gespeicherten Wert entspricht hast du 
ne Flanke. In diesem Fall speicherst du den neuen Wert / Zustand. 
Ansonsten lässt du die Variable wie sie ist.


Was an deinem Code ein bischen aufstösst sind die 'Goto'-Anweisungen. 
Das macht man eigentlich nicht mehr. Aber versuch erstmal die Flanken zu 
erfassen.

Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, super.

Danke für die schnelle Hilfe!

MfG

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viel einfacher wäre es du verwendets die Port Interrupt von Port 1 oder 
2.
Wenn dann eine Flanke an dem Pin anliegt kommt automatisch ein Interrupt 
in dem du dan deine Variable hochzählen kannst.

Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So also ich hab jetzt ne Flankenabfrage eingebaut.

Jetzt würde mich doch aber des mit den Interupts interessieren.

#include  <msp430x44x.h>
//#include  <io430x44x.h>

#define          B1                 P3IN & BIT4       //B1 - P4.4
#define          B2                 P3IN & BIT5       //B2 - P4.5
#define          B3                 P3IN & BIT6       //B3 - P4.6
#define          B4                 P3IN & BIT7       //B4 - P4.7
#define          STATUS_LED         BIT3              //STATUS_LED - P1.3
#define          time               200
#define          time_s             200
#define          BUZ1_ON            P1OUT |= BIT0     //P4.2
#define          BUZ1_OFF           P1OUT &= ~BIT0    //P4.2
#define          BUZ2_ON            P1OUT |= BIT2     //P4.3
#define          BUZ2_OFF           P1OUT &= ~BIT2    //P4.3
#define          DALLAS             P2IN & BIT7       //P2.7 - DALLAS
#define          CR                 0x0d
#define          LF                 0x0a
#define          LED_OFF            P1OUT |= BIT3
#define          LED_ON             P1OUT &= ~BIT3


// LCD Segmente
#define     lcd_a      (0x80)    // definitions for LCD seegments on the Olimex LCD. 4-Mux operation is assumed
#define     lcd_b      (0x40)    // For more details on 4-Mux operation, gather your LCD datasheet, 
#define     lcd_c      (0x20)    // TI's MSP430F449 User Guide (look for LCD Controller, then 4-Mux),
#define     lcd_d      (0x01)    // and MSP-449STK-2 schematic. You will need ALL these 3 when defining
#define     lcd_e      (0x02)    // each number or character. Remember, the Olimex LCD doesn't use a LCD driver!
#define     lcd_f      (0x08)    // You tell the LCD what characters to display. It's very time consuming!!
#define     lcd_g      (0x04)
#define     lcd_h      (0x10)

//LCD digit segments
char *LCD = LCDMEM;          // pointer to LCD Memory Segments. Pretty cool, got this idea from TI-website
//
unsigned char i,time_segment,TXData;
unsigned int j;
unsigned int konst=0;
unsigned int konst_2=0;
unsigned int Button= 0;
unsigned int Button_1= 0;
unsigned int zaehler= 0;
unsigned int Flanke_1= 0;
unsigned int Flanke_2= 0;
const unsigned char UART_Message [] = "http://www.olimex.com/dev";


void Delay (unsigned int a);
void DelayX(unsigned int b);
void Clear_LCD(void);
void LCD_all(void);
void BUZZER (void);
void UART_transmit (unsigned char Transmit_Data);
void Menu(void);
void OK (void);
void Timer (void);
void An (void);
void Aus (void);
void Button1 (void);
void Button2 (void);
void writeLetter(int position,char letter);     // displays a single character on the LCD

/// Tests
void Hallo(void);
void du(void);
void da(void);
void wie(void);

void main(void)
{
//++++++++++++++++++++++++++++++
  WDTCTL = WDTPW | WDTHOLD;                      // stop watchdog timer

  FLL_CTL0 &= ~XTS_FLL;                           // XT1 as low-frequency
  _BIC_SR(OSCOFF);                               // turn on XT1 oscillator

  do                                             // wait in loop until crystal is stable
    IFG1 &= ~OFIFG;
  while (IFG1 & OFIFG);

  FLL_CTL1 &= ~FLL_DIV0;                              // ACLK = XT1
  FLL_CTL1 &= ~FLL_DIV1;


  IFG1 &= ~OFIFG;                                // clear osc. fault int. flag
  FLL_CTL1 &= ~SELM0;                             // set DCO as MCLK
  FLL_CTL1 &= ~SELM1;


//++++++++++++++++++++++++++++++



//  SVSCTL = 0x68;                                    //brown out

//  WDTCTL = WDTPW + WDTHOLD;                           // Stop watchdog timer

//  SCFI0 = BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7;  
//  SCFI0 |= FN_4;                            // x2 DCO frequency, 8MHz nominal DCO
//  SCFQCTL = SCFQ_1M;      

//  FLL_CTL0 = /*DCOPLUS + */XCAP10PF;                  //Set load Cap. for Cristal = 10pF                                  // x2 DCO frequency, 8MHz nominal DCO  

//  FLL_CTL1 |= SELM_XT2;                             //Select XT2 for CPU MCLK
//  SCFI1 = 0;
//  SCFQCTL = SCFQ_M | SCFQ_1M;                       //M=1, 1Mhz
//  _BIS_SR(SCG0+SCG1);                               //disable DCO in status_reg
//  DelayX(200);


//UART ini
  U1TCTL = SSEL0;                                     //UCLOCK = ACLK
  U1BR0 = 0x03;                                       //BAUD RATE = 9600
  U1BR1 = 0x00;
  U1MCTL = 0x4a;                                      //with modulation
  U1CTL = CHAR;                                       //Start 8bit 1stop, N
  ME2 = UTXE1 | URXE1;                                //enable RX and TX
  P4SEL |= BIT0 | BIT1;                               //select UART pins
  P4DIR |= BIT0;                                      //port direction for TXD0
  P4DIR &= ~BIT1;                                     //port direction for RXD0
//  IE1 |= URXIE0;                                    // Enable USART0 RX interrupt
//  _EINT();                                          // Enable interrupts
//  U1CTL &= ~SWRST;                                  //reset UART logic



//LCD ini
  Clear_LCD();
  TACTL = TASSEL0 | TACLR;                                //set timer_A
  LCDCTL = LCDON + LCD4MUX + LCDP0 + LCDP1 + LCDP2;       // STK LCD 4Mux, S0-S39
  BTCTL = BT_fLCD_DIV64;                                  // STK LCD freq ACLK/64
  P5SEL = 0xFC;                                           // Common and Rxx all selected

//IO port ini

  P1SEL=BIT5;                                             //p1.5 is 32768Hz
  P1DIR=BIT5 | BIT3 | BIT0 | BIT2;                        //BUZ,LED are outputs

  LCD_all();                                              //light all LCD segments

  for (i=0; i!=15; i++)
    {
      LED_ON;
      DelayX(60);
      LED_OFF;
      DelayX(60);
    }

  UART_transmit (CR);                                     //send message by RS232
  UART_transmit (LF);
  for (i=0; i!=26; i++)  UART_transmit (UART_Message[i]);
  UART_transmit (CR);
  UART_transmit (LF);

//---------------MAIN LOOP-----------------------------------
Button_1 = B2;
Flanke_1=1;
Flanke_2=1;

    while (1)
    {
     
      
     if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1);      //test RS 232 (echo+1)

     while ((DALLAS) == 0) BUZZER();                            //test DALLAS button

L1:  if ((B2) == 0) //Clear_LCD();
    { 
      if (Flanke_2 == 1 )
       {
         zaehler = 0;
         Button2();
         Flanke_2 = 0;
       }
    }  
        else 
          {
            Flanke_2 = 1;
           }
    
     if ((B1) == 0) 
     {
       if (Flanke_1 == 1 )
       {
         zaehler = 0;
         konst_2 = 0;
         Button1();
         Flanke_1 = 0;
       }
       else
       { zaehler++;
       
         if (zaehler >= 30000)
         {
          zaehler = 0;
          konst =0;
          Clear_LCD();
          for (i=0; i!= 20; i++) BUZZER();
         }
       }
     }
     else 
     {
     Flanke_1 = 1;
     }
     if ((B3) == 0)
       {
        time_segment=100;
        for (i=0; i!= 20; i++)
         {
           for (j=0; j!=9; j++)
            {
              LCDMEM[i] = (BIT0 << j);
              if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1);      //test RS 232 (echo+1)
              DelayX(time_segment);
              if((B1) == 0 ) goto L1;
              if((B2) == 0 ) goto L1;
              if((B4) == 0 )
                {
                  LCD_all();
                  goto L1;
                }
            }
         }
       }
      if((B4) == 0)
        {
           BUZZER();
           Hallo();
           P1OUT &= ~STATUS_LED;                 //switch on status_led
        }
      else  P1OUT |= STATUS_LED;            //switch off status led
    }
}


void Delay (unsigned int a)                           //9+a*12 cycles
{
  unsigned int l;
  for (l=0 ; l != a; l++);
}

void Clear_LCD(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0x00;                  //clear Sxx
}

void LCD_all(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0xff;                  //turnon all LCD segments
}

void DelayX(unsigned int b)
{
unsigned int m;
for(m=0;m!=b;m++) Delay(255);
}

void BUZZER (void)
{
  BUZ1_OFF;
  BUZ2_ON;
  Delay(40);
  BUZ2_OFF;
  BUZ1_ON;
  Delay(40);
}

void UART_transmit (unsigned char Transmit_Data)              //UART1 Transmit Subroutine
{
  while ((IFG2 & UTXIFG1) == 0);                              //Wait for ready U1TXBUF
  U1TXBUF = Transmit_Data;                                    //send data
}

void writeLetter(int position,char letter) // writes a single character on the LCD. User can specify position as well
{
    // DO NOT PLAY WITH THE CODE BELOW ------------------------------------------------------------------------------
    if (position == 1)  {  position = position + 6; } // this is position adjustment for compatibility.
    else if (position == 2 || position == 3 || position == 4 || position == 5 || position == 6 || position == 7)
    {  position = ((position * 2) - 1) + 6; }  // adjust position
    // --------------------------------------------------------------------------------------------------------------

    switch(letter)                                  
    {
       // letter  // LCDM7                           // LCDM8                          // End
       case 'A':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_e;          LCD[position] = lcd_b + lcd_c + lcd_g;        break;                                                                        
       case 'B':  LCD[position-1] = lcd_c + lcd_h + lcd_e;                  LCD[position] = lcd_b + lcd_c + lcd_g;        break;  
       case 'C':  LCD[position-1] = lcd_a + lcd_h;                          LCD[position] = lcd_b + lcd_c;            break;  
       case 'D':  LCD[position-1] = lcd_b + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_c + lcd_g;            break;     
       case 'E':  LCD[position-1] = lcd_a + lcd_h + lcd_e;                  LCD[position] = lcd_b + lcd_c + lcd_g;        break;  
       case 'F':  LCD[position-1] = lcd_a;                                  LCD[position] = lcd_b + lcd_c + lcd_g;        break;  
       case 'G':  LCD[position-1] = lcd_a + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_b + lcd_c;            break; 
       case 'H':  LCD[position-1] = lcd_b + lcd_c + lcd_e;                  LCD[position] = lcd_b + lcd_c + lcd_g;        break;  
       case 'I':  LCD[position-1] = lcd_a + lcd_h + lcd_f;                  LCD[position] = lcd_d;                break;  
       case 'J':  LCD[position-1] = lcd_b + lcd_h + lcd_c;                  LCD[position] = lcd_c;                break;  
       case 'K':  LCD[position-1] = lcd_d + lcd_g;                          LCD[position] = lcd_b + lcd_c + lcd_g;        break;  
       case 'L':  LCD[position-1] = lcd_h;                                  LCD[position] = lcd_b + lcd_c ;           break;    
       case 'M':  LCD[position-1] = lcd_b + lcd_c + lcd_g;                  LCD[position] = lcd_b + lcd_c + lcd_f;        break;    
       case 'N':  LCD[position-1] = lcd_b + lcd_c + lcd_d;                  LCD[position] = lcd_b + lcd_c + lcd_f;        break;
       case 'O':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_h;          LCD[position] = lcd_b + lcd_c;            break;
       case 'P':  LCD[position-1] = lcd_a + lcd_b + lcd_e;                  LCD[position] = lcd_b + lcd_c + lcd_g;        break;
       case 'Q':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_h + lcd_d;  LCD[position] = lcd_b + lcd_c;            break;
       case 'R':  LCD[position-1] = lcd_a + lcd_b + lcd_d + lcd_e;          LCD[position] = lcd_b + lcd_c + lcd_g;        break;
       case 'S':  LCD[position-1] = lcd_a + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_b + lcd_g;            break;
       case 'T':  LCD[position-1] = lcd_a + lcd_f + lcd_b;                  LCD[position] = lcd_d + lcd_b;            break;
       case 'U':  LCD[position-1] = lcd_b + lcd_c + lcd_h;                  LCD[position] = lcd_b + lcd_c;            break;
       case 'V':  LCD[position-1] = lcd_g;                                  LCD[position] = lcd_b + lcd_c + lcd_e;        break;
       case 'W':  LCD[position-1] = lcd_b + lcd_c + lcd_d;                  LCD[position] = lcd_b + lcd_c + lcd_e;        break;
       case 'X':  LCD[position-1] = lcd_d + lcd_g;                          LCD[position] = lcd_e + lcd_f;            break;
       case 'Y':  LCD[position-1] = lcd_b + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_f;                break;
       case 'Z':  LCD[position-1] = lcd_a + lcd_h + lcd_g;                  LCD[position] = lcd_e;                break;      
       
       // number  // LCDM7                              // LCDM8                          // END
       case '0':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_h;          LCD[position] = lcd_b + lcd_c;            break;                            
       case '1':  LCD[position-1] = lcd_b + lcd_c;                                                                    break; 
       case '2':  LCD[position-1] = lcd_a + lcd_b + lcd_e + lcd_h;              LCD[position] = lcd_c + lcd_g;            break; 
       case '3':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_e + lcd_h;  LCD[position] = lcd_g;                    break; 
       case '4':  LCD[position-1] = lcd_b + lcd_c + lcd_e;                  LCD[position] = lcd_b + lcd_g;            break; 
       case '5':  LCD[position-1] = lcd_a + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_b + lcd_g;            break; 
       case '6':  LCD[position-1] = lcd_a + lcd_c + lcd_h + lcd_e;          LCD[position] = lcd_b + lcd_c + lcd_g;    break; 
       case '7':  LCD[position-1] = lcd_a + lcd_b + lcd_c;                                                            break;
       case '8':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_e + lcd_h;  LCD[position] = lcd_b + lcd_c + lcd_g;    break; 
       case '9':  LCD[position-1] = lcd_a + lcd_b + lcd_c + lcd_e ;         LCD[position] = lcd_b + lcd_g;            break; 
       
       // others
       case '.':                                        LCD[position] = lcd_h;                break;  // decimal point
       case '^':                                        LCDM2 = lcd_c;                        break;  // top arrow
       case '!':                                        LCDM2 = lcd_a;                        break;  // bottom arrow
       case '>':                                        LCDM2 = lcd_b;                        break;  // right arrow
       case '<':                                        LCDM2 = lcd_h;                        break;  // left arrow
       case '+':                                        LCDM20= lcd_a;                        break;  // plus sign
       case '-':                                        LCDM20= lcd_h;                        break;  // minus sign
       case '&':                                        LCDM2 = lcd_d;                        break;  // zero battery
       case '*':                                        LCDM2 = lcd_d + lcd_f;                    break;  // low battery
       case '(':                                        LCDM2 = lcd_d + lcd_f + lcd_g;                break;  // medium battery
       case ')':                                        LCDM2 = lcd_d + lcd_e + lcd_f + lcd_g;            break;  // full battery */
    }
}

void Menu (void)
{
 Clear_LCD(); 
 LCDMEM[19]=0x68;  //M
 LCDMEM[18]=0x64;
 LCDMEM[17]=0x64;  //E
 LCDMEM[16]=0x90;
 LCDMEM[15]=0x68;  //N
 LCDMEM[14]=0x61;
 LCDMEM[13]=0x60;  //U
 LCDMEM[12]=0x70;
}

void OK (void)
{
  
 Clear_LCD(); 
 LCDMEM[19]=0x60;  // O
 LCDMEM[18]=0xF0;  // O
 LCDMEM[17]=0x64;  // K
 LCDMEM[16]=0x05;  // K

}

void Timer()
{
 Clear_LCD(); 
 LCDMEM[19]=0x01; //T
 LCDMEM[18]=0x88;
 LCDMEM[17]=0x01; //I
 LCDMEM[16]=0x08;
 LCDMEM[15]=0x68; //M
 LCDMEM[14]=0x64;  
 LCDMEM[13]=0x64; //E
 LCDMEM[12]=0x90;
 LCDMEM[11]=0x64; //R
 LCDMEM[10]=0xC3;
}

void An()
{
 Clear_LCD(); 
 LCDMEM[19]=0x64; //A
 LCDMEM[18]=0xE2;
 LCDMEM[17]=0x68; //N
 LCDMEM[16]=0x61; 
}

void Aus()
{
 Clear_LCD(); 
 LCDMEM[19]=0x64; //A
 LCDMEM[18]=0xE2;
 LCDMEM[17]=0x60; //U
 LCDMEM[16]=0x70; 
 LCDMEM[15]=0x44; //S
 LCDMEM[14]=0xB2;
}

void Hallo()
{
  Clear_LCD(); 
  writeLetter(7,'H');
  writeLetter(6,'A');
  writeLetter(5,'L');
  writeLetter(4,'L');
  writeLetter(3,'O');
  writeLetter(1,'^');
  
}

void du()
{
  Clear_LCD(); 
  writeLetter(7,'D');
  writeLetter(6,'U');
    
}

void da()
{
  Clear_LCD(); 
  writeLetter(7,'D');
  writeLetter(6,'A');
  }

void wie()
{
  Clear_LCD(); 
  writeLetter(7,'W');
  writeLetter(6,'I');
 
}

void Button1 ()
{ konst++;
  
    
  if (konst ==1)
  {Menu();
  }

  if (konst ==2)
  {Aus();
  }
  if (konst ==3)
  {An();
  }
  if (konst ==4)
  {Timer();
  }
  if (konst ==5)
  {OK();
  konst=0;
  }
  
}

void Button2 ()
{  
  konst_2++;
  
  if (konst ==1)
  {
    if (konst_2 ==1)
    {
    Hallo();
    }
    
    if (konst_2==2)
    {
      du();
      
      konst_2 =0;
    }
  }

  if (konst ==2)
  {
    if (konst_2 ==1)
    {
    da();
    }
    
    if (konst_2==2)
    {
      wie();
      
      konst_2 =0;
    }
  }
  if (konst ==3)
  {An();
  }
  if (konst ==4)
  {Timer();
  }
  if (konst ==5)
  {OK();
  konst=0;
  }
  
}


Will noch n Timer einbauen der dann ein Interupt ausgibt wenn er 
abgelaufen ist und dann eine ISR aktiviert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ehe du das tust, solltest du den Code erst mal aufräumen.
Selten so etwas unnötig unübersichtlich komplexes gesehen.

Fang damit an, dir Ausgabefunktionen für Strings zu bauen (sowohl LCD 
als auch UART). Gut wäre es auch, wenn du die Sammlung an LCD-Funktionen 
bzw. UART Funktionen in jeweils ein eigenes *.c File auslagerst, damit 
du sie beim Editieren deines eigentlichen Source Codes aus dem Weg hast. 
Sowas kommt der Übersicht immer zugute, wenn man funktionierenden Code 
thematisch geordnet in einzelne *.c Files auslagert. Dann beschäftigt 
sich 1 *.c File mit 1 Thema und man wird nicht ständig abgelenkt.
void writeString( int Position, char* String )
{
  while( *String )
    writeLetter( Position--, *String++ );
}

Mit dieser kleinen Hilfsfunktion, vereinfacht sich zb dieser Code
void Hallo()
{
  Clear_LCD(); 
  writeLetter(7,'H');
  writeLetter(6,'A');
  writeLetter(5,'L');
  writeLetter(4,'L');
  writeLetter(3,'O');
  writeLetter(1,'^');
  
}
zu
void Hallo()
{
  Clear_LCD(); 
  writeString( 7, "Hallo^" );
}

oder dieser hier
void Timer()
{
 Clear_LCD(); 
 LCDMEM[19]=0x01; //T
 LCDMEM[18]=0x88;
 LCDMEM[17]=0x01; //I
 LCDMEM[16]=0x08;
 LCDMEM[15]=0x68; //M
 LCDMEM[14]=0x64;  
 LCDMEM[13]=0x64; //E
 LCDMEM[12]=0x90;
 LCDMEM[11]=0x64; //R
 LCDMEM[10]=0xC3;
}
zu
void Timer()
{
 Clear_LCD(); 
 writeString( 7, "Timer" );
}

und das ist dann schon viel einfacher zu verfolgen, als die 
Originalversion, bei der irgendwelche Konstanten, von denen keiner weiß, 
was sie bedeuten, in irgendwelche Arrayplätze geschrieben werden, die 
interessanterweise auch noch Indexmässig abnehmen und nicht, wie man das 
eigentlich meistens erwarten würde, zunehmen.

Autor: Styx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

Okay danke für den Tipp.
Hab alles zu LCD jetzt ausgelagert und das mit der Wortfunktion habe ich 
auch schon versucht nur ich wusste nicht wie ich ein Teil des Stings 
auswähle bzw. Abschneide.

Hab den Vorschlag eingefügt, aber er zeigt nur den 1. Buchstaben an.

Weiß aber nicht woran des liegt. Glaub er nimmt einfach den nächsten 
Buchstaben nicht an.

Hier der Teil aus dem LCD.c File

void writeString( int Position, char* String )
{
  while( *String)
    writeLetter( Position--, *String++ );
}



Hier der Teil aus dem Main.
void Button1 ()
{ konst++;
  
    
  if (konst ==1)
  {
    Clear_LCD();
    writeString(7, "Menu");
  }

  if (konst ==2)
  {Aus();
  }
  if (konst ==3)
  {An();
  }
  if (konst ==4)
  {Timer();
  }
  if (konst ==5)
  {OK();
  konst=0;
  }
  
}


MfG

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.