При разработке электронных устройств иногда бывает ситуация, когда выводов микроконтроллера не хватает, а использовать другой чип нет возможности. В таких случаях обычно прибегают к схемотехническим трюкам или используют дополнительные внешние микросхемы, например, расширители портов, сдвиговые регистры или мультиплексоры.
   Расширители портов позволяют добавить микроконтроллеру “полноценные”  выводы, работающие как на выход, так и на вход, и, как правило, управляются с помощью стандартных интерфейсов - SPI  или I2C. Это очень удобно, но подобные микросхемы не из дешевых. 
   Бюджетный вариант – использование сдвиговых регистров и мультиплексоров, однако в этом случае полученные дополнительные выводы будут работать только на выход или на вход (исключение составляют универсальные сдвиговые регистры). Впрочем, в большинстве приложений этого вполне достаточно.  
   В этой статье мы рассмотрим расширение портов микроконтроллера с помощью сдвигового регистра 74HC595.  Им можно управлять как стандартными выводами  микроконтроллера, так и с помощью SPI модуля. Также его можно каскадировать, соединяя несколько микросхем в один большой регистр. 
   Чтобы пример был наглядным, с помощью регистров 74HC595 к микроконтроллеру будет подключен семисегментный индикатор. 


   Теперь вы имеете общее представление о последовательном периферийном интерфейсе и можно перейти к рассмотрению SPI модуля. 
   SPI модуль микроконтроллера AVR atmega16 использует для своей работы 4 вывода - MOSI, MISO, SCK и SS. Когда модуль не задействован, эти выводы являются линиями портов ввода/вывода общего назначения. Когда модуль включен, режим работы этих выводов переопределяются.

   Микроконтроллеры AVR имеют в своем составе модули, реализующие стандартные интерфейсы. Эти модули используются для обмена данными с различными периферийными устройствами, например, цифровыми датчиками, микросхемами памяти, ЦАП, АЦП, другими микроконтроллерами и так далее. В этой статье, на примере микроконтроллера atmega16, мы разберемся, как работать с модулем последовательного периферийного интерфейса или модулем SPI (serial peripheral interface).