Вы находитесь на странице: 1из 2

После первых шагов в освоении микроконтроллеров начинающий

микроконтроллерщик начинает пытаться применять свои познания в первых


самостоятельных поделках, часто пытаясь "моргать светодиодами" в зависимости
от состояния входных портов например. Вот про опрос состояния входных портов
мы и поговорим.

Рассмотрим в среде CodeVisionAVR

За состояние порта ввода отвечает регистр PINB, который работает только на


чтение, опросив который можно узнать состояние входа. Опросить конкретный вход
можно командой PINB.x, где "х" — это номер порта.

if(PINB.0==0) {делаем дело}; // если входной пин порта PB0 равен нулю, то делаем
дело.

Если нужно опросить несколько входов и сделать одно дело в зависимости от


состояния по нужным входам, то применяют логические операции:

конъюнкция:
if(PINB.0==0&&PINB.2==1) {делаем дело}; // если входной пин порта PB0 равен
нулю и пин порта PB2 равен единице, то делаем дело.

дизъюнкция:
if(PINB.0==0||PINB.2==1) {делаем дело}; // если входной пин порта PB0 равен
нулю или пин порта PB2 равен единице, то делаем дело.

Учите логические операции и данными можно вертеть как захочешь.

Задача: сделать опрос кнопок, подключенных к порту PB5 PB6 PB7, при этом любая
комбинация логического состояния на этих входах должна быть записана в
переменную в которой будет хранится результат до следующего опроса

Как видно порты PB0-PB4 чем то заняты, а к портам PB5 PB6 PB7 подключены кнопки.
unsigned char input; // создаем переменную, в которой будет храниться данные
опроса входа
input=~PINB&0xE0;
input=input>>5;

Теперь разберем подробнее:

input=~PINB&0xE0;

Здесь мы видим переменную input, далее знак = присвоения этой переменной


значения выражения справа ~PINC&0xE0

Выражение ~PINB&0xE0 состоит из регистра входного порта PINB, слева от


которого стоит знак операции побитного инвертирования ~ Это значит, что каждое
значение отдельного бита порта PORTB, будет перевернут наоборот, то есть, если
было число 01101001, то будет 10010110 (зачем это нужно — далее будет
понятно) . Справа от регистра входного порта PINB стоит знак побитного И & и
шестнадцатеричное число 0xE0, что дает нам маску опроса битов входного
регистра PINB. Если разложить число 0xE0 в двоичную систему, то получим число
0b11100000 При применении операции побитного И там, где стоят единички будет
разрешен опрос входных пинов порта PINB, там где нули — запрещен. Получается
маска. То есть в итоге в переменную input запишется число, которое содержит
перевернутое число состояния входов PB5 PB6 PB7 регистра PINB

input=input>>5; Операция побитного логического сдвига числа, которое хранится в


переменной в сторону младших разрядов на пять разрядов. Получим например из
числа 11100000>> 00000111. теперь мы имеет удобную переменную, в которой
находится число от нуля до семи, которая отображает любую комбинацию нажатия
кнопок. При этом ноль в переменной говорит о том, что кнопки не нажаты, а при
нажатие всех кнопок содержится число 7. Если б мы не сдвинули число в младшие
разряды, то переменная содержала бы данные кратные 32, то есть 32, 64, 96 и т.д.,
то немного неудобно для последующих манипуляций, если б не не сделали
побитное инвертирование, то переменная бы содержала данные наоборот, то есть
отжаты кнопки — число 7, нажаты все — 0.

А в коментах продвинутые кодеры наверняка напишут, как input=~PINB&0xE0;


input=input>>5; написать одной строчкой)