Подключение семисегментного индикатора через сдвиговый регистр

Shift register seven segmentОбычно требуется использовать 8 выводов микроконтроллера, чтобы подключить один лишь индикатор, что неэкономично. Для экономии выводов добавим к схеме еще сдвиговый регистр, например 74нс164. Теперь вместо восьми выводов нам понадобится всего 4:

На тактирование.
На сброс.
На данные.
На питающий транзистор.

 Работа сдвигового регистра широко известна, здесь мы ее описывать не будем, всегда можно заглянуть в даташит – там все предельно понятно расписано. Тестовая схема приведена на рисунке:

Shift register seven segment

Пример кода для компилятора HTC, который будет отображать наши цифры с периодом 1 с :

Отсчет начинается после нажатия кнопки.

#include htc.h
#define _XTAL_FREQ 4000000
#define CK RB2
#define RESET RB1
#define DATA RB3
#define TRIG RB7
__CONFIG(MCLREN &UNPROTECT & WDTDIS);
void tick() {
             CK = 1;
             __delay_us(100);
             CK = 0;
             __delay_us(100);
             }
void sendbyte(unsigned char digit[8]) {
  unsigned char i=0;
  TRIG = 0;
  for (i=0;i<8;i++) {
                  DATA = digit[i];
                  tick();
                  }
  TRIG = 1;
}
const char point[8] = {1,0,0,0,0,0,0,0};    // Точка
const char one[8] = {0,0,0,0,0,1,1,0};      // Один
const char two[8] = {0,1,0,1,1,0,1,1};      // Два
const char three[8] = {0,1,0,0,1,1,1,1};    // Три
const char four[8] = {0,1,1,0,0,1,1,0};     // Четыре
const char five[8] = {0,1,1,0,1,1,0,1};     // Пять
const char six[8] = {0,1,1,1,1,1,0,1};      // Шесть
const char seven[8] = {0,0,0,0,0,1,1,1};    // Семь
const char eight[8] = {0,1,1,1,1,1,1,1};      // Восемь
const char nine[8] = {0,1,1,0,1,1,1,1};      // Девять
const char zero[8] = {0,0,1,1,1,1,1,1};      // Ноль
void main() {
unsigned char i=0;
TRISB = 0b00000001;
DATA = 0;
RESET = 0;
tick();
RESET = 1;
for (;;) {
          if (RB0 == 0) {
                         __delay_ms(30); if (RB0 == 0) {
                         sendbyte(zero);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(one);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(two);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(three);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(four);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(five);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(six);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(seven);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(eight);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(nine);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                   }
          }
  }
}

В принципе, нам важна только функция отправки байта в сдвиговый регистр sendbyte().

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
#include htc.h
#define _XTAL_FREQ 4000000
#define CK RB2
#define RESET RB1
#define DATA RB3
#define TRIG RB7
__CONFIG(MCLREN &UNPROTECT & WDTDIS);
void tick() {
             CK = 1;
             __delay_us(100);
             CK = 0;
             __delay_us(100);
             }
void sendbyte(unsigned char digit[8]) {
unsigned char i=0;
TRIG = 0;
for (i=0;i<8;i++) {
                  DATA = digit[i];
                  tick();
                  }
TRIG = 1;
}
const char point[8] = {1,0,0,0,0,0,0,0};    // Точка
const char one[8] = {0,0,0,0,0,1,1,0};      // Один
const char two[8] = {0,1,0,1,1,0,1,1};      // Два
const char three[8] = {0,1,0,0,1,1,1,1};    // Три
const char four[8] = {0,1,1,0,0,1,1,0};     // Четыре
const char five[8] = {0,1,1,0,1,1,0,1};     // Пять
const char six[8] = {0,1,1,1,1,1,0,1};      // Шесть
const char seven[8] = {0,0,0,0,0,1,1,1};    // Семь
const char eight[8] = {0,1,1,1,1,1,1,1};      // Восемь
const char nine[8] = {0,1,1,0,1,1,1,1};      // Девять
const char zero[8] = {0,0,1,1,1,1,1,1};      // Ноль
void main() {
unsigned char i=0;
TRISB = 0b00000001;
DATA = 0;
RESET = 0;
tick();
RESET = 1;
for (;;) {
          if (RB0 == 0) {
                         __delay_ms(30); if (RB0 == 0) {
                         sendbyte(zero);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(one);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(two);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(three);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(four);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(five);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(six);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(seven);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(eight);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                         sendbyte(nine);
                         for(i=0;i<10;i++){ __delay_ms(100);    }
                   }
          }
  }
}
Загрузка...