[Top][All Lists]
[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