Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 7. Система команд АVR 1 71 в РОН или РВВ. Основные из них: пары команд sbrs / sbrc (для РОН) и sЬis / sЬic (для РВВ) . С последними вы уже знакомы по программам нажатия кнопки в пре дыдущей гла в е . Они очень удобны для организации процедур, аналогичных опера тору выбора CASE в языках высокого уровня, но, к сожалению, обладают непривыч ной логикой: «пропустить следующую команду, если условие выполняется», и по тому для новичка могут показаться слишком заумными. Чтобы их лучше понять, приведем дополнительный пример достаточно сложной по логике работы, но характерной для микроконтроллерной техники процедуры, в которой задача фор мулируется так: при наступлении некоторого условия мигать попеременно зеленым и красным светодиодами (Led). Введем несколько предположений: О условие миганИя задается состоянием бита з в некоем рабочем регистре, кото рый, как и в предыдущей главе, назовем регистром флагов 1 - Flag. Если бит з регистра Flag равен единице (установлен) - надо мигать, если нет (сброшен) оба светодиода погашены; О красный светодиод подсоединен к выходу порта D номер 7, а зеленый - к выходу порта В номер О (они на АTmega8 находятся рядом: выводы 1 3 и 1 4. Разумеется, это могут быть любые другие выводы других портов); О текущее состояние светодиодов задается битом 4 в том же регистре флагов Flag. Для реализации мигания можно, разумеется, и обойтись без дополнительного бита состояния светодиодов (Led) в регистре флагов, если вместо него отслеживать те кущее состояние непосредственно выводов портов, но мы сейчас хотим проиллю стрировать именно применение команд sbrs / sbrc, а к командам sЬis / sЬic вернемся позже. Алгоритм работы такой программы реализуется типичным вложенным опе ратором выбора, код программы на языке высокого уровня приведен в листинге 7 .5 (здесь и далее подобные фрагменты будут приводиться в Раsсаl-подобном псевдо коде, который легче читать, чем С) . case <бит 3 рег . Flag> of О : <погасить оба Led> 1 : case <бит 4 рег . Flag> of 1 : <устанавливаем PortC , вых . 7 > ; / /зажечь зеленый Led <сбрасываем PortD , вых . 7 > ; / /погасить красный Led <сбрасываем бит 4 Flag> ; { следуIОJ1111Й раз горим красным} О : <устанавливаем PortD, вых . 7 > ; / /зажечь красный Led <сбрасываем PortC , вых . 7 > ; / /погасить зеленый Led <устанавливаем бит 4 Flag> ; / /следУIОШ/ЛЙраз горим зеленым end; end ; 1 Не путать с «официальным» регистром флагов SREG, описанным ранее.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==