Иногда возникает необходимость увеличить количество выходов микроконтроллера. Такая ситуация может возникнуть например при работе с микроконтроллерами серии tiny, например у attiny13 всего 8 ножек и в качестве выходов работают 5(6 если RESET с помощью фьюзов сделать входом/выходом ), и подключить к нему семисигментый индикатор не получится. Так вот используя одну дополнительную микросхему можно решить эту проблему и эта микросхема 74HC595.
74HC595 - это восьмиразрядный сдвиговый регистр с последовательным вводом и параллельным выводом информации.
Назначение выводов: 1-7, 15 - выходы 10 - сброс регистра 11 - вход для тактовых импульсов 12 - вход «защёлкивающий» данные 13 - вход, переводящий выходы рабочее состояние 14 - вход данных
Теперь коротенько, как это работает: наши данные подаются на вход DS одновременно с тактовыми импульсами на вход SH_CP, с каждым новым импульсом мы записываем в регистр 1 бит, сдвигая все записанные ранее. Передав 8 бит регистру, выставляем логическую 1 на вход ST_CP, и содержимое регистра выводится на выходы Qa-Qh. Все очень просто. Ну а теперь перейдем к практике:
подключение семисигментного индикатора к attiny13 cс помощью HC595
На схеме: семисигментный индикатор, который подключен к выходам сдвигового регистра. Входы DS, SH_CP, ST_CP подключены к PB0-2. Получается что используя сдвиговый регистр, для подключения семисигментного индикатора нужно уже не 8 а всего 3 выхода микроконтроллера, что очень удобно.
Ниже приведен код программы, которая выводит на семисигментный индикатор цифру 5:
#include ‹tiny13.h› #include ‹delay.h› #define CE PORTB.2 #define CL PORTB.1 #define DI PORTB.0 #define RS PORTB.3 #define pause delay_ms(10)
char data[8]={0,1,1,0,1,1,0,1};
int i;
void main(void) { #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0x00; DDRB=0xFF; TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; GIMSK=0x00; MCUCR=0x00; TIMSK0=0x00; ACSR=0x80; ADCSRB=0x00;
while (1) {
i=0; while(i<8){ DI=data[i]; CL = 1; RS=1; pause; DI=0; CL = 0; RS=0; pause; i++; }; CE=1; }; }
|