Cześć, za pomocą mikrokontrolera próbuję zrobić zegar. do nóżek PD2, PD3, PB6, PB7 podłączone 4 przyciski pierwszy ma służyć za wybór godzin/minut/sekund , drugi za zwiększanie wybranej pierwszym przyciskiem wartości, trzeci za zatrzymanie zegara aby móc ustawić czas, czwarty natomiast za zatwierdzenie wybranego czasu. Mam już prawie wszystko gotowe, muszę tylko wyeliminować drgania styków. Wiem, że można to robić na wiele sposobów, Z racji, że nie chcę angażować timera ponieważ wykorzystuję go już do liczenia czasu, a innych timerów nie mogę ustawić dokładnie na, np. 60ms to chcę to zrobić sposobem opisanym tutaj. Wtedy przycisku zachowują się dziwnie. Gdy klikam przycisk aby ustawić zegar na daną godzinę / minutę / sekundę to najpierw poprawnie zwiększa się ona co 1, ale gdy chcę kliknąć ponownie nic się nie dzieje. Wygląda to tak jakbym każdego klawisza mógł użyć tylko raz, bo pozostałe zachowują się podobnie: przy pierwszym kliknięciu normalnie działają, a po ponownym nie reagują. Dlaczego tak się dzieje i jak mam to naprawić? Przepraszam za jakość kodu, który tu wstawiam, lecz jest to mój pierwszy większy projekt i dopiero się uczę dlatego proszę o wyrozumiałość. Dzięki za wszelką pomoc.
/*
Digital clock
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <hd44780.c>
#include <stdio.h>
#include <stdlib.h>
volatile int modeFlag = 1;
volatile int ableToEdit = 1;
volatile int seconds = 0;
volatile int minutes = 0;
volatile int hours = 0;
uint8_t key_lock1;
uint8_t key_lock2;
uint8_t key_lock3;
uint8_t key_lock4;
char secondsBuffer[3];
char minutesBuffer[3];
char hoursBuffer[3];
void key1Pressed()
{
if(ableToEdit == 1)
{
if(!key_lock1 && !(PIND & (1 << PD2)))
{
key_lock1 = 1;
modeFlag++;
if (modeFlag > 3)
{
modeFlag = 1;
}
}
else if(key_lock1 && (PIND & (1 << PD2)))
{
key_lock1 ++;
}
}
}
void key2Pressed()
{
if(ableToEdit == 1)
{
if(!key_lock2 && !(PIND & (1 << PD3)))
{
key_lock2 = 1;
switch(modeFlag)
{
case 1:
if(hours == 24)
{
hours = 0;
}
hours ++;
break;
case 2:
if(minutes == 60)
{
minutes = 0;
}
minutes ++;
break;
case 3:
if(seconds == 60)
{
seconds = 0;
}
seconds ++;
break;
}
}
else if(key_lock2 && (PIND & (1 << PD3)))
{
key_lock2 ++;
}
}
}
void key3Pressed()
{
if(!key_lock3 && !(PINB & (1 << PB6)))
{
key_lock3 = 1;
ableToEdit = 1;
TCCR1B &= ~(1 << CS12);
TCCR1B &= ~(1 << CS10);
}
else if(key_lock3 && (PINB & (1 << PB6)))
{
key_lock3 ++;
}
}
void key4Pressed()
{
if(!key_lock4 && !(PINB & (1 << PB7)))
{
key_lock4 = 1;
ableToEdit = 0;
TCCR1B |= (1 << CS12) | (1 << CS10);
}
else if(key_lock4 && (PIND & (1 << PB7)))
{
key_lock4 ++;
}
}
ISR(TIMER1_COMPA_vect)
{
seconds++;
if(seconds == 60)
{
seconds = 0;
minutes ++;
if(minutes == 60)
{
seconds = 0;
minutes = 0;
hours ++;
if(hours == 24)
{
hours, minutes, seconds = 0;
}
}
}
}
int main(void)
{
DDRD &= ~(1 << PD2);
DDRD &= ~(1 << PD3);
DDRB &= ~(1 << PB6);
DDRB &= ~(1 << PB7);
PORTD |= (1 << PD2);
PORTD |= (1 << PD3);
PORTB |= (1 << PB6);
PORTB |= (1 << PB7);
_delay_ms(20);
// LCD init
LCD_Initalize();
// Timer init
TCCR1B |= (1 << WGM12);
OCR1A = 977;
TIMSK |= (1 << OCIE1A);
sei();
while(1)
{
key1Pressed();
key2Pressed();
key3Pressed();
key4Pressed();
if(hours == 24)
{
hours = 0;
}
if(minutes == 60)
{
minutes = 0;
}
if(seconds == 60)
{
seconds = 0;
}
itoa(seconds, secondsBuffer, 10);
itoa(minutes, minutesBuffer, 10);
itoa(hours, hoursBuffer, 10);
LCD_Clear();
LCD_GoTo(0, 0);
LCD_WriteText("Aktualna godzina");
LCD_GoTo(4, 1);
switch(hours)
{
case 24:
LCD_WriteText("00");
break;
case 0:
LCD_WriteText("00");
break;
case 1:
LCD_WriteText("01");
break;
case 2:
LCD_WriteText("02");
break;
case 3:
LCD_WriteText("03");
break;
case 4:
LCD_WriteText("04");
break;
case 5:
LCD_WriteText("05");
break;
case 6:
LCD_WriteText("06");
break;
case 7:
LCD_WriteText("07");
break;
case 8:
LCD_WriteText("08");
break;
case 9:
LCD_WriteText("09");
break;
default:
LCD_WriteText(hoursBuffer);
}
LCD_GoTo(6, 1);
LCD_WriteText(":");
LCD_GoTo(7, 1);
switch(minutes)
{
case 0:
LCD_WriteText("00");
break;
case 1:
LCD_WriteText("01");
break;
case 2:
LCD_WriteText("02");
break;
case 3:
LCD_WriteText("03");
break;
case 4:
LCD_WriteText("04");
break;
case 5:
LCD_WriteText("05");
break;
case 6:
LCD_WriteText("06");
break;
case 7:
LCD_WriteText("07");
break;
case 8:
LCD_WriteText("08");
break;
case 9:
LCD_WriteText("09");
break;
default:
LCD_WriteText(minutesBuffer);
}
LCD_GoTo(9, 1);
LCD_WriteText(":");
LCD_GoTo(10, 1);
switch(seconds)
{
case 0:
LCD_WriteText("00");
break;
case 1:
LCD_WriteText("01");
break;
case 2:
LCD_WriteText("02");
break;
case 3:
LCD_WriteText("03");
break;
case 4:
LCD_WriteText("04");
break;
case 5:
LCD_WriteText("05");
break;
case 6:
LCD_WriteText("06");
break;
case 7:
LCD_WriteText("07");
break;
case 8:
LCD_WriteText("08");
break;
case 9:
LCD_WriteText("09");
break;
default:
LCD_WriteText(secondsBuffer);
}
_delay_ms(200);
}
return 0;
}