2. Aşağı Yukarı Otomatik Sayıcı¶
Bir önceki örnekte arttırma ve azaltma için sürekli butona basıp bırakmak gerekiyor. Bu örnekte buton basılı tutulduğunda arttırma ve azaltmanın otomatik olarak nasıl arttırılabileceği ile ilgili bir örnek vereceğim. Bu örnek birkaç tane bug içermektedir. Bugları ve çözümünü bulmak size kalmış :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #define BIRLER_BASAMAGI_BASLANGIC (8U)
#define ONLAR_BASAMAGI_BASLANGIC (14U)
#define DISPLAY_PIN_SAYISI (4U)
#define YUKARI_DUGME (2U)
#define ASAGI_DUGME (3U)
#define LED_PIN (13U)
#define SAYAC_MAKSIMUM (99U)
#define SAYI_TABANI (10U)
#define DEGISIM_ZAMAN_FARKI_MS (500U)
void setup()
{
unsigned int i;
pinMode(YUKARI_DUGME, INPUT_PULLUP);
pinMode(ASAGI_DUGME, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
for (i = 0; i < DISPLAY_PIN_SAYISI; i++)
{
pinMode((BIRLER_BASAMAGI_BASLANGIC + i), OUTPUT);
pinMode((ONLAR_BASAMAGI_BASLANGIC + i), OUTPUT);
}
}
void loop()
{
static unsigned int sayac = 0;
static unsigned char asagi_basili;
static unsigned long asagi_artis_bekleme;
static unsigned char yukari_basili;
static unsigned long yukari_artis_bekleme;
const unsigned long yeni_zaman = millis();
if (LOW == digitalRead(ASAGI_DUGME))
{
if (false != asagi_basili)
{
asagi_basili = true;
sayac--;
asagi_artis_bekleme = yeni_zaman + DEGISIM_ZAMAN_FARKI_MS;
}
else
{
if (yeni_zaman >= asagi_artis_bekleme)
{
sayac--;
asagi_artis_bekleme = yeni_zaman + DEGISIM_ZAMAN_FARKI_MS;
}
}
if (SAYAC_MAKSIMUM < sayac)
{
sayac = 0;
}
}
else
{
asagi_basili = false;
}
if (LOW == digitalRead(YUKARI_DUGME))
{
if (false != yukari_basili)
{
yukari_basili = true;
sayac++;
yukari_artis_bekleme = yeni_zaman + DEGISIM_ZAMAN_FARKI_MS;
}
else
{
if (yeni_zaman >= yukari_artis_bekleme)
{
sayac++;
yukari_artis_bekleme = yeni_zaman + DEGISIM_ZAMAN_FARKI_MS;
}
}
if (sayac >= SAYAC_MAKSIMUM)
{
sayac = SAYAC_MAKSIMUM;
}
}
else
{
yukari_basili = false;
}
Yazdir(BIRLER_BASAMAGI_BASLANGIC, (sayac % SAYI_TABANI));
Yazdir(ONLAR_BASAMAGI_BASLANGIC, (sayac / SAYI_TABANI));
}
void Yazdir (unsigned int ondalik, unsigned int sayi)
{
unsigned int i;
for (i = 0; i < DISPLAY_PIN_SAYISI; i++)
{
digitalWrite(ondalik++, (sayi & (1U << i)) ? HIGH : LOW);
}
}
|