Обычно требуется использовать 8 выводов микроконтроллера, чтобы подключить один лишь индикатор, что неэкономично. Для экономии выводов добавим к схеме еще сдвиговый регистр, например 74нс164. Теперь вместо восьми выводов нам понадобится всего 4:
На тактирование.
На сброс.
На данные.
На питающий транзистор.
Работа сдвигового регистра широко известна, здесь мы ее описывать не будем, всегда можно заглянуть в даташит – там все предельно понятно расписано. Тестовая схема приведена на рисунке:
Пример кода для компилятора 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().