Czemu ten kod działa tak bardzo średnio?

0
#include < avr / io.h > 
#include < util / delay.h >

#define RS 1
# define E 0
# define KEY1(1 << PC2)
void send_a_command(unsigned char command);
void send_a_character(char * character);
void init();

int main(void) {
   int i = 0, key_lock1 = 0, licznik = 0;
   DDRD = 0xFF;
   DDRB = 0xFF;
   PORTC |= KEY1;
   char cha1[] = "CH_1";
   char cha2[] = "CH_2";
   char cha3[] = "CH_3";
   init();
   send_a_character(cha1);

   while (1) {
      if (!key_lock1 && !(PINC & KEY1)) {
         licznik++;
         if (licznik == 4) {
            licznik = 1;
         }

         switch (licznik) {
         case 1:
            send_a_command(0x01);
            send_a_character(cha2);
            break;

         case 2:
            send_a_command(0x01);
            send_a_character(cha3);
            break;

         case 3:
            send_a_command(0x01);
            send_a_character(cha1);
            break;
         }

      } else if (key_lock1 && (PINC & KEY1)) key_lock1++;
   }
}

void send_a_command(unsigned char command) {
   PORTD = command;
   PORTB &= ~(1 << RS);
   PORTB |= (1 << E);
   _delay_ms(50);
   PORTB &= ~(1 << E);
   PORTD = 0;
}

void send_a_character(char * character) {
   int i = 0;

   while (character[i] != 0) {
      PORTD = character[i];
      PORTB |= (1 << RS);
      PORTB |= (1 << E);
      _delay_ms(50);
      PORTB &= ~(1 << E);
      PORTD = 0;
      i++;
   }

}

void init() {
   _delay_ms(20);
   send_a_command(0x01);
   _delay_ms(20);
   send_a_command(0x38);
   _delay_ms(20);
   send_a_command(0x0E);
   _delay_ms(20);
}

Coś jest nie tak z tym switchem. Chodzi o to, że nie każdy klik działa. Czasami kliknę i zmiana jest od razu, a czasem potrzeba 2-3 kliknięć, w dodatku czasami przechodzi w drugą stronę np. Po CH_2 jest znów CH_1, albo po CH_3 znów _CH_2. W czym może być problem?

0

Drgania styków?

1

A ten key_lock1 na 1 gdzieś ustawiasz? No własnie nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1