Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ассемблере для PIC2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.27 Mб
Скачать

Пример 4. Отслеживание нажатия кнопки

Рассмотрим следующую программу, которая по нажатии кнопки будет включать индикатор, а после того как кнопка будет отпущена индикатор будет выключен.

LIST P=PIC16F84A

__CONFIG H3FF1

STATUS EQU H0003

TRISA EQU H0005

PORTA EQU H0005

TRISB EQU H0006

PORTB EQU H0006

org 0 ; начало программы

; подготовительные моменты

bsf STATUS,5 ; переход в Банк 1

movlw b00011111

movwf TRISA

clrf TRISB

bcf STATUS,5 ; переход назад в Банк 0

clrf PORTB ; очистка порта

; отслеживание нажатия кнопки

m1 btfsc PORTA,2 ; бит-проверка ножки RA2

goto m1

movlw .255

movwf PORTB

clrf PORTB

goto m1

end ; конец программы

Далее текст прошивки:

:020000040000FA

:1000000083161F3085008601831286010519062894

:08001000FF308600860106287E

:02400E00F13F80

:00000001FF

На нашем макете имеется три кнопки. Физически они подключены к линиям RA2, RA3, RA4, которые внешними подтягивающими резисторами соединены с плюсом питания (о подтягивающих резисторах см. "Теория и практика работы портов"). В нашей программе мы решили отслеживать кнопку на линии RA3.

В шапке программы появились описании регистров касающихся работы ножек порта А, а именно TRISA и PORTA.

В разделе подготовительных моментов мы указали для порта А работу всех ножек на вход (а их у нас 5 штук), записав число b00011111. Старшие три бита для регистров TRISA и PORTA не являются значащими и, следовательно, с таким же успехом можно записать число b11111111. Строго говоря, в данном примере в регистрах TRISA и PORTA нас интересует только второй бит, касающийся работы ножки RA2 и, следовательно, для определения направления работы ножки можно было бы использовать всего лишь одну команду bsf TRISA,2 .

Перед началом отслеживания кнопки мы очистили порт B и тем самым погасили все сегменты индикатора.

Нажатие кнопки мы отслеживаем с помощью команды btfsc PORTA,2 , которую мы называем командой бит-проверки. Если кнопка не нажата, то на RA2 присутствует высокий уровень сигнала за счет подтягивающего резистора и, соответственно этот факт приводит к выполнению следующей команды – переход по метке m1. В этом месте программа зацикливается до тех пор, пока не будет сделано нажатие на кнопку. После нажатия кнопки на RA2 устанавливается низкий уровень сигнала, что приводит к изменению хода программы, а именно к пропуску команды перехода по метке m1. Далее записывается число в порт, производится включение сегментов индикатора на 1 мкс. Затем порт очищается, индикатор выключается. Затем производится зацикливание.

Таким образом, пока нажата кнопка индикатор периодически включается и выключается. За счет высокой скорости работы МК (1 млн. операций в секунду) у нас создается впечатление что индикатор светится, а не мигает. Необходимо отметить, что индикатор светится не на полную яркость и объяснение этому простое – в выключенном состоянии он находится гораздо большее время. Звуковой излучатель на моей макетной плате вообще не подает признаков жизни.

Пример рассматриваемой программы специально упрощен, для того, чтобы вам было проще понять механизм работы. Такой подход пригоден для учебных целей, но на практике следует делать иначе.

Рассмотрим модифицированный фрагмент

; отслеживание нажатия кнопки

m1 clrf PORTB

m2 btfsc PORTA,2 ; бит-проверка ножки RA2

goto m1

movlw .255

movwf PORTB

goto m2

Сначала выполняется очистка порта B. Затем выполняется бит проверка: если кнопка не нажата – переход по метке m1 для очистки порта и дальнейшее зацикливание. Если кнопка нажата – пропускается переход по метке m1 и выполняется запись числа в порт B. Затем осуществляется переход на очередную бит-проверку и дальнейшее зацикливание.

Как видим, процедуры записи в порт и очистки порта у нас разнесены и не накладываются друг на друга, что приводит к полноценной работе ножек порта.