1. Aşağı Yukarı Sayıcı

Bu örnek iki buton ile 0 - 999 sayıcı örneğidir. 7 segment BCD Örnek-2’den otomatik artırım kısmını miras almıştır.

  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
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#define DISPLAY_DATA_YON_REGISTER         DDRD
#define DISPLAY_DATA_REGISTER             PORTD
#define DISPLAY_CONTROL_YON_REGISTER      DDRB
#define DISPLAY_CONTROL_DATA_REGISTER     PORTB

#define LED_PIN                     (13U)
#define DISPLAY_DATA_MASKE         (0X7F)
#define DISPLAY_CONTROL_MASKE      (0X07)

#define DISPLAY_SAYISI               (3U)

#define YUKARI_DUGME                (11U)
#define ASAGI_DUGME                 (12U)

#define SAYAC_MAKSIMUM             (999U)
#define SAYI_TABANI                 (10U)
#define DEGISIM_ZAMAN_FARKI_MS     (500U)
#define DISPLAY_BEKLEME_US        (1750U)

static const unsigned char numaralar[] = {
//    0     1     2     3     4     5     6     7     8     9
   0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};

void setup() 
{
   DISPLAY_CONTROL_DATA_REGISTER = 6;
   pinMode(YUKARI_DUGME, INPUT_PULLUP);
   pinMode(ASAGI_DUGME, INPUT_PULLUP);
   pinMode(LED_PIN, OUTPUT);
   DISPLAY_DATA_YON_REGISTER = DISPLAY_DATA_MASKE;
   DISPLAY_DATA_REGISTER     = numaralar[0];
   DISPLAY_CONTROL_YON_REGISTER  = DISPLAY_CONTROL_MASKE;
}

void loop() 
{
   static unsigned int sayac = 0;
   static unsigned char asagi_basili;
   static unsigned char yukari_basili;
   static unsigned long asagi_artis_bekleme;   
   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(sayac);
}

void Yazdir (const unsigned int sayi)
{
   unsigned int i;
   unsigned char display;
   unsigned int numara;
   unsigned int sayi_ic = sayi;
   
   for (i = 0; i < DISPLAY_SAYISI; i++)
   {
      display = (~(1U << i)) & DISPLAY_CONTROL_MASKE;
      numara = sayi_ic % SAYI_TABANI;
      DISPLAY_CONTROL_DATA_REGISTER = (DISPLAY_CONTROL_DATA_REGISTER & ~DISPLAY_CONTROL_MASKE) | display;
      DISPLAY_DATA_REGISTER = numaralar[numara];
      sayi_ic /= SAYI_TABANI;
      delayMicroseconds(DISPLAY_BEKLEME_US);
   }
}