- •Задание на курсовую работу
- •2. Описание алгоритма программы
- •2.1 Использование ресурсов
- •2.2 Основная программа
- •2.3 Подпрограмма обработки прерывания таймера
- •2.4 Подпрограмма обработки прерывания таймера 0. Режимы работы устройства
- •2.5. Подпрограммы индикации
- •2.6. Подпрограмы счета времени
- •2.7. Опрос клавиатуры
- •3. Дополнительное задание
2.6. Подпрограмы счета времени
Рис.2.6.1- Подпрограмма счета времени TIMEHOD
В этой подпрограмме в регистре r1 (secund) содержится число секунд, в r2 (minut) – число минут и в r3 (hour) – число часов. r9 (tcount) – это счетчик, который инкрементируется каждый раз при вызове подпрограммы по переполнению таймера 0, т.е. r9 увеличивается каждые 5 мс. Таким образом, когда r9 достигает 200 (проходит 1 сек) происходит увеличение текущего числа секунд на 1. Также выполняется проверка секунд на равенство 60 и, если необходимо, увеличиваются минуты и часы. Так же происходит проверка на достижение таймера заданного времени. Если заданное время достигнуто то происходит переход во 2-ой режим.
При организации индикации существует следующая проблема: в r3 хранится текущее число часов в двоичном виде. А необходимо отдельно выводить число десятков и число единиц на первый и второй разряды индикатора. Чтобы разделить десятки и единицы числа r3 нужны две следующие подпрограммы.
Рис.2.6.2 – подпрограммы разделения десятков и единиц HOURS MINUTES
В данных подпрограммах используются вспомогательные регистры r16 и r17. В r17 будут содержаться десятки, а в r16-единицы. В r3 (hour) исходное число часов, в r2 (minut) исходное число минут.
2.7. Опрос клавиатуры
Клавиатура сканируется с помощью логического “0”, который подается на соответствующую линию при выводе на индикацию. Далее требуется опросить 3 младших разряда порта D, и если один из них равен “0”, то это является признаком нажатия соответствующей кнопки. В этой подпрограмме также требуется реализовать процедуру антидребезга.
На рисунке 2.7.1 показан дребезг контактов при нажатии на кнопку. Как видно из рисунка в результате дребезга контактов кнопки происходит имитация ее многократного нажатия. Для того чтобы избежать неправильного декодирования, считывание скан-кода производится через некоторое время после фиксации факта изменения состояния.
Рис. 2.7.1 – Дребезг контактов
Рис.2.7.2- Подпрограмма SCAN
На риc.2.7.2 изображена подпрограмма SCAN. Эта подпрограмма вызывается каждые 5 мс. Работа ее заключается в том, чтобы посылать на каждую строку клавиатуры (1-2-3, 4-5-6, 7-8-9, *-0-#) посылать сигнал, а потом подпрограмма OPROSKLAVI будет сканировать столбец клавиатуры, и в зависимости от того с какого номера придет сигнал программа будет знать, что в таком-то столбце и в такой-то строке нажата кнопка. Каждые 5 мс значение регистра R10 (stroka) увеличивается на 1 пока не дойдет до значения 4, потом он обнулится. Каждый раз проверяется, если значение r10 (stroka) равно 0 то посылается сигнал на первую строку клавиатуры, если 1 , то на вторую строку и т.д.
Рис.2.7.3- Подпрограмма OPROSKLAVI
На рис.2.7.3 изображена подпрограмма OPROSKLAVI. В этой подпрограмме проверяется порты D.0, D.1, D.2 (нажата ли кнопка на клавиатуре). Если нажата, то 0 записывается в r5, это означает, что одна из клавиш была нажата. Дальше мы делаем условие, чтоб регистр R6 (drin) четыре раза увеличился на 1 это даст нам время в 20 мс – проверка на дребезг. Далее идет проверка не нажата ли еще какая-нибудь кнопка – регистр R28 (fblock). Идет проверка на отжатие. Это занимает те же 20мс. Если все эти проверки пройдут, то мы записываем значение в регистр R11 (stolb) соответствующее номеру опрашиваемого порта. То есть в программе SCAN мы находили строку клавиатуры, а здесь столбец, так мы можем определить: на какую клавишу нажали. Вызываем подпрограмму KLAV, присваиваем регистрам нужные значения. В конце подпрограммы идет проверка на нажатия более 1 кнопки. И так для каждого опрашиваемого порта.
Рис.2.7.4- Подпрограмма KLAV
В подпрограмме KLAV вначале в r30 записывается значение нажатой клавиши. Потом проверяем на нажатие «0», если он нажат то присваиваем r15=0, иначе прибавляем к r15 единицу. После проверки на нажатие нуля идет проверка на нажатие на «*». Если нажата «*» то r25 (regim) присваивается 0. Дальше идет проверка регистра r29 (mode): в зависимости от того в какой разряд индикатора вводится значение с клавиатуры. Если в данный момент вводятся десятки часов, то мы можем ввести только 0, 1, 2. Поэтому стоит условие на проверку нажатия этих клавиш. Если нажаты они, то к r18 прибавляется нужное количество раз число 10, и, после выделение подпрограммой HOURS единиц (r16), прибавляем к r18 регистр r16, и записываем r18 в r3 (hour), обнуляется r1 (secund), инкрементируется r29 (mode). После увеличения r29, когда в подпрограмму заходим второй раз, то работаем с единицами часов. Далее идет работа с десятками минут и с единицами минут.
