avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] Bug? with switch statement


From: E. Weddington
Subject: Re: [avr-gcc-list] Bug? with switch statement
Date: Fri, 13 Dec 2002 13:11:20 -0700

On 13 Dec 2002 at 12:06, Hendrix, Jeff wrote:

> I'm compiling the code below with 2002-06-25 release from avrfreaks. I
> was originally testing this code on a mega128, the I tried in in avr
> studio with the same results. I also tried compiling it to an 8515
> target and still get the same results. What's happening is the switch
> statement will only ever take the last case. To simulate this, you
> need to turn on the high nibble on port C pins (to simulate the
> pullups), and then turn off one of the bits in the high nibble. The
> only time it takes one of the case paths is when bit 8 is off (0x70),
> all the other times it just ignores the other cases. Anyone have any
> ideas?
> 
> thanks
> -jeff
> 
> #include <io.h>
> 
> char ReadKeyPad(void)
> {
>    char readPort = 0;
>    char curKey = 0;
> 
>    // check ROW1
>  PORTC = 0xfe;  // turn on pull ups and ground row 1
>  readPort = PINC&0xf0;   // check just the high nibble
>  switch (readPort) {
>  case 0xe0:     // key 1 held down
>   curKey = 1;
>   break;
>  case 0xd0:     // key 2 held down
>   curKey = 2;
>   break;
>  case 0xb0:     // key 3 held down
>   curKey = 3;
>   break;
>  case 0x70:     // key 4 held down
>   curKey = 4;
>   break;
>  }

Well if PINC returns what you wrote on PORTC then

PORTC = 0xFE;
readPort = PINC & 0xF0;

will give you readPort == 0xF0

which does not match anything in your switch cases.

Eric



> 
>  PORTC = 0;
>    return curKey;
> }
> 
> 
> int main(void)
> {
>  char kp;
>  DDRC = 0x0f;
>  PORTC = 0x00;
> 
>    while (1) {
>   kp = ReadKeyPad();
>  }
>  return 0;
> }
> avr-gcc-list at http://avr1.org


avr-gcc-list at http://avr1.org



reply via email to

[Prev in Thread] Current Thread [Next in Thread]