Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦМПУ / Новая папка (1) / ЦИМПУ(atmega 128).doc
Скачиваний:
102
Добавлен:
16.04.2015
Размер:
4.2 Mб
Скачать

9.2.11 Общие сведения о работе клавиатуры

Во многих применениях МК работают автономно по заранее заданной программе без вмешательства человека. Наряду с этим существуют интерактивные МК-системы, включающие в контур управления человека-оператора. Простейший пример интерактивной управляющей системы − обслуживаемый МК, требующий ввода оперативной информации и ее отображения.

В качестве устройств ввода/вывода информации наиболее широкое распространение в МК-системах получил цифровые, алфавитно-цифровые и специальные клавиатуры.

На плате эмулятора применена некодирующая (матричная) клавиатура, которая представляет собой простую матрицу двоичных переключателей (размерностью 3 на 4, т.е. на двенадцать клавиш), включенных на пересечении строк и колонок матрицы. Идентификация (кодирование) нажатой клавиши в клавиатуре выполняется программой.

9.2.12 Ввод кода нажатой клавиши

Для обслуживания клавиатуры в МК-системе используется процедура ввода кода нажатой клавиши.

Процедура осуществляет циклический опрос клавиатуры до тех пор, пока не будет нажата клавиша. Будучи встроена в основную программу, она блокирует процесс выполнения команд основной программы и вспомогательных процедур на время ожидания нажатия клавиши. После нажатия какой-либо клавиши (кроме клавиши S10 − “Сброс”) клавиатуры управление будет передано на другие процедуры.

Рассмотрим, как осуществляется процедура ввода информации с матричной клавиатуры 3x4, включающей 10 цифровых клавиш (0 − 9) и 1 управляющую (клавиша “Ввод”). Способ подключения клавиатуры к МК представлен на рисунке 9.9.

Рис. 9.9Схема электрическая принципиальная подключения клавиатуры к МК

Подключение клавиатуры организовано через порт E микроконтроллера. Линии PE0 − PE3 порта E используются для сканирования, а линии PE4 − PE6 того же порта − для опроса матрицы клавиш. Каждая клавиша в такой матрице имеет свой номер, соответствующий ее местоположению. Клавиша S10 (“Сброс”) не сканируется, а S12 (“Ввод”) имеет свой номер, но по функциональному назначению отличается от цифровых клавиш – она служит для завершения процедуры ввода цифры. Диоды обеспечивают защиту от замыкания между собой сканирующих линий в случае одновременного нажатия более чем одной клавиши.

Процедура ввода кода нажатой клавиши состоит из последовательности частных процедур: сканирования матрицы клавиш, устранения дребезга контактов (рис. 9.9) и идентификации кода нажатой клавиши. Процедура сканирования совмещена с процедурой идентификации.

Рассмотрим отдельно каждую из перечисленных частных процедур.

9.2.13 Сканирование и идентификация

Частная процедура сканирования служит для обнаружения нажатой клавиши и последующей ее идентификации. Процедура сводится к поочередному обнулению каждой из линий сканирования и опросу линий возврата. В линии порта E PE0 − PE3 выдается байт сканирования (БС), содержащий 0 только в одном бите. Если на пересечении линии сканирования и линии возврата находится нажатая клавиша, то в соответствующем бите байта возврата (БВ), принимаемого в линиях PE4 − PE6, будет находиться 0.

Последовательность байтов сканирования представляет собой код "бегущий нуль"; формирование очередного байта сканирования осуществляется путем сдвига его предыдущего значения. Направление сдвига определяет последовательность опроса клавиш. Схема алгоритма процедуры сканирования представлена на рисунке9.10. Если при полном цикле сканирования не было обнаружено нажатой клавиши, то процедура сканирования повторяется сначала.

Каждой клавише клавиатуры поставлен в соответствие код (ее вес), являющийся функцией номеров линии сканирования (С) и линии возврата (В), на пересечении которых нажата клавиша. Поскольку процедура идентификации нажатой клавиши совмещена с процедурой сканирования, то после выхода из процедуры Scan в регистре Scancode будет размещен код нажатой клавиши. Получаемый код на линиях сканирования и возврата представлен в таблице 9.17. Также в таблице показано значение регистра Scancode при различных кодовых комбинациях на порте E.

Рис. 9.10 Анализ наличия нажатой клавиши с одновременной ее идентификацией

Таблица 9.17 Коды, получаемые с порта Е

Клавиша

Линии порта Е

Scancode

PЕ6

PЕ5

PЕ4

PЕ3

PЕ2

PЕ1

PЕ0

S1

1

1

0

1

1

1

0

1

S2

1

0

1

1

1

1

0

2

S3

0

1

1

1

1

1

0

3

S4

1

1

0

1

1

0

1

4

S5

1

0

1

1

1

0

1

5

S6

0

1

1

1

1

0

1

6

S7

1

1

0

1

0

1

1

7

S8

1

0

1

1

0

1

1

8

S9

0

1

1

1

0

1

1

9

S11

1

0

1

0

1

1

1

A

S12

0

1

1

0

1

1

1

C

Кроме того, процедура Scan осуществляет защиту от одновременного нажатия нескольких клавиш. Порядок анализа клавиш таков, что при одновременном нажатии клавиша с большим кодом игнорируется.

После выхода из процедуры Scan управление передается частной процедуре устранения дребезга контактов Delay. Устранение дребезга контактов при вводе символа с клавиатуры осуществляется программной реализацией временной задержки 10 мс.

Пример программы

Рассмотренная ниже программа демонстрирует работу клавиатуры и организацию программных таймеров Т0 и Т1 с 8-разрядным счетным регистром. С использованием таймера Т0 программа формирует сигнал, частоту которого можно задать на клавиатуре, и выдает его на линию PB0 порта В. Каждой клавише клавиатуры назначена своя частота, которая может принимать значения от 800 Гц до 8 кГц. Значения частот для каждой клавиши и счетного регистра приведены в таблице 9.18.

Таблица 9.18 Задание частот клавишам

Клавиша на клавиатуре в VMLAB

0

1

2

4

5

6

8

9

A

D

Клавиша на клавиатуре эмулятора

1

2

3

4

5

6

7

8

9

11

Частота, Гц

800

1600

2400

3200

4000

4800

5600

6400

7200

8000

Значение счетного регистра TCNT0

$D9

$ED

$F3

$F7

$F9

$FA

$FB

$FC

$FD

$FE

Кроме того программа формирует ШИМ-сигнал с использованием таймера 1 и выдает на линию PB1 порта В импульсы заданной частотой (8 кГц) и с изменяемой скважностью. Длительность импульса также, как и с таймером Т0, можно изменять с помощью клавиатуры. Значения длительности импульса для каждой клавиши и регистра сравнения приведены в таблице 9.19.

Таблица 9.19 Задание частот клавишам

Клавиша на клавиатуре в VMLAB

0

1

2

4

5

6

8

9

A

D

Клавиша на клавиатуре эмулятора

1

2

3

4

5

6

7

8

9

11

Длительность,

мкс

12

24

36

48

60

72

84

96

108

120

Значение регистра сравнения OCR1L

$18

$30

$48

$60

$78

$90

$AB

$C0

$D8

$F0

Схема подключения клавиатуры к МК в симуляторе VMLAB изображена на рисунке 9.11.

Рис. 9.11 Схема подключения клавиатуры к МК

Описание алгоритма программы

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

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

Основная часть программы (рис. 9.12) начинается с таблицы переходов системы сброса и прерываний. Собственно программа начинается с адреса $20 обнулением и используемых регистров. После этого вызываются процедуры работы с клавиатурой (рис. 9.13). Процедуры работы с клавиатурой подробно рассмотрены выше, поэтому нет необходимости их повторно описывать. Далее загрузкой регистров управления для таймера Т0 указывается коэффициент деления тактовой частоты, а для таймера Т1 указывается режим 8-разрядного ШИМ с низким уровнем выходного сигнала при совпадении (счетчика и уставки) и счете вверх (рис. 9.15). Тактовая частота для таймера Т1 определена равной СК (системная частота). Таймер Т0 загружается значением частоты в cчетный регистр (TCNT0) , а таймер Т1 – значением длительности сигнала в регистр сравнения (OCR1АL), заданных в предыдущих процедурах. Загрузка регистра TIMSK кодом $1 разрешает прерывания по переполнению таймера Т0, а установка битов 4 регистра направления DDRD и 5 регистра направления DDRB определяет выводы PD4 и PB5 как выходы. В конце основной программы устанавливается общий флаг разрешения прерываний. Далее программа зацикливается, и все действия выполняются по запросу прерываний от таймера Т0.

Процедура обработки прерываний по переполнению таймера Т0 начинается с сохранения в стеке регистра temp, а затем через регистр frec перезагружается счетный регистр таймера T0 (TCNT0) и далее в регистре temp сохраняется содержимое SREG. На выводе PD4 появляется сигнал низкого уровня, если присутствовал сигнал высокого уровня и наоборот. Таким образом, на выводе PD4 будет импульсный сигнал с заданной частотой. В завершении процедуры восстанавливаются значения SREG и регистра temp.

Таймер Т1 работает непрерывно в режиме 8−разрядного ШИМ с накоплением счетного регистра до значения $FF (255) и последующим убыванием его до $00, после чего цикл снова повторяется. При равенстве счетного регистра и регистра сравнения уровень сигнала сменяется на противоположный. Таким образом, задавая разные значения в регистре сравнения, можно изменять длительность с постоянным периодом следования импульсов. Выходной сигнал снимается с вывода PB5 микроконтроллера.

Алгоритм и листинг программы см. ниже.

Рис. 9.12 Алгоритм основной программы

Рис. 9.13 Процедура сканирования клавиатуры

Рис. 9.14 Процедура устранения дребезга контактов

Рис. 9.15 Процедура задания сигналам частоты и длительности

Задание частоты:

Клавишами 0,1,2,4,5,6,8,9,A,D – задается частоты сигнала

Клавиша 0 - Задать частоту сигнала 800 Гц

Клавиша 1 - Задать частоту сигнала 1600 Гц

Клавиша 2 - Задать частоту сигнала 2400 Гц

Клавиша 4 - Задать частоту сигнала 3200 Гц

Клавиша 5 - Задать частоту сигнала 4000 Гц

Клавиша 6 - Задать частоту сигнала 4800 Гц

Клавиша 8 - Задать частоту сигнала 5600 Гц

Клавиша 9 - Задать частоту сигнала 6400 Гц

Клавиша A - Задать частоту сигнала 7200 Гц

Клавиша D - Задать частоту сигнала 8000 Гц

После выбора частоты необходимо нажать ввод, за который отвечает клавиша E.

Если частота выбрана неправильно до нажатия ввода (Клавиши Е) можно выполнить сброс клавишей C и после этого можно выбрать необходимую частоту.

Листинг программы №9

; BASIC .ASM template file for AVR

; ******************************************************

; Define here the variables

;

.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С

.def scancode=r16

.def schscan=r17

.def schopr=r18

.def code=r19

.def keycode=r20

.def temp=r21

.def frec=r22

.def dlit=r23

.def zader=r24

.def zader1=r25

;Основная программа

;Определение таблицы переходов

.ORG $0 ;Начало таблицы переходов

reset: ; начальная метка

rjmp Start ;Переход на метку Start основной программы

reti ; Addr $01

reti ; Addr $02

reti ; Addr $03 Вектора прерываний МК ATmega128.

reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.

reti ; Addr $05 Полностью вектора прерываний представлены

reti ; Addr $06 в приложении с назначением прерываний

reti ; Addr $07 (внешних и внутренних).

reti ; Addr $08

reti ; Addr $09

reti ; Addr $0A

reti ; Addr $0B

reti ; Addr $0C

reti ; Addr $0D

reti ; Addr $0E

reti ; Addr $0F

reti ; Addr $10

.ORG $20 ;Вектор прерывания при переполнении таймера T0

rjmp IntT0

.ORG $22 ;Начальный адрес основной пpогpаммы

Start:

ldi temp,high(RAMEND) ; Установка указателя стека в конце ОЗУ out SPH,temp

ldi temp,low(RAMEND) ; Установка указателя стека в конце ОЗУ out SPL,temp

rcall Scan ;Вызвать процедуру работы с клавиатурой

Frec: out TCNT0,frec ;Установить заданную частоту сигнала

ldi temp,$4 ;Запустить таймер T0, fck/64

out TCCR0,temp ;Задание значения $4 в регистр управления таймером Т0

out OCR1AL,dlit ;Установить заданную длительность сигнала ldi temp,$81 ;Настроить таймер T1, PWM 8 бит

out TCCR1A,temp ;Задание значения $81 в регистр А управления таймером Т1

ldi temp,$1 ;Запустить таймеp T1, fck/1

out TCCR1B,temp ;Задание значения $1 в регистр В управления таймером Т1

ldi temp,$1 ;Разрешить прерывания от таймера Т0

out TIMSK,temp

ldi temp,$F0 ;Конфигурирование линии PB5 на вывод

out DDRB,temp ;Задание значения $20 в регистр направления данных порта В sei ;Разрешить все пpеpывания

ldi temp,$10 ;Конфигурирование линий PD4 на вывод

out DDRD,temp ;Задание значения $10 в регистр направления данных порта D sei ;Разрешить все пpеpывания

Work:

rjmp Work ;Рабочий цикл пpогpаммы, ничего не делаем

;Процедура cканирования клавиатуры

Scan: clr scancode ;Сброс scancode

ldi temp,$0F ;Конфигурирование 4-х выводов порта E на вывод

out ddre,temp ;и 4-х выводов на ввод

Stklav: sec ;Установить флаг переноса

ldi temp,$1 ;Назначить кл. S1 число 1

ldi schscan,$44 ;Загрузка счетчика сканирования

ldi code,$FE ;Загрузка исходного байта сканирования

Schs: out porte,code ;Вывод байта сканирования в порт E

rol code ;Сдвиг байта сканирования

in keycode,pine ;Ввод байта сканирования

swap keycode ;Поменять местами 4-е разряда байта возврата

ldi schopr,$3 ;Загрузка счетчика опросов

Scho: ror keycode ;Сдвиг байта возврата

brcc Oprkl ;Выход из прочедуры при обнаружении нажатой ;клав.

If0: inc temp ;Инкремент scancode

dec schopr ;Уменьшить счетчик опросов

brne Scho ;Если schopr=0, то перейти на метку Sсho

dec schscan ;Уменьшить счетчик сканирований

brne Schs ;Если schscan=0, то перейти на метку Sсhs

rjmp Stklav ;иначе перейти на метку Klav

Oprkl: cpi temp,$C ;При обнаружении нажатой кл. "Ввод"

breq Delay ;перейти на процедуру устранения дребезга контактов

mov scancode,temp ;иначе сохранить значение нажатой кл.в ;scancode

rjmp If0 ;и продолжить сканирование клавиатуры

;Процедура устранения дребезга контактов клавиш

;Задержка около 10 мс

Delay: clr zader

ldi zader1,$96

Delay1: dec zader

brne Delay1

dec zader1

brne Delay1

;Процедура задания сигналам частоты и длительности

Setkl: cpi scancode,$0 ;Если нажата только кл. "Ввод", то

breq If0 ;снова сканировать клавиатуру

cpi scancode,$1

ldi frec,$D9 ;Задать частоту сигнала 800 Гц

ldi dlit,$18 ;и длительность импульса ШИМ-сигнала 12 мкс breq Endkl

cpi scancode,$2

ldi frec,$ED ;Задать частоту сигнала 1600 Гц

ldi dlit,$30 ;и длительность импульса ШИМ-сигнала 24 мкс breq Endkl

cpi scancode,$3

ldi frec,$F3 ;Задать частоту сигнала 2400 Гц

ldi dlit,$48 ;и длительность импульса ШИМ-сигнала 36 мкс

breq Endkl

cpi scancode,$4

ldi frec,$F7 ;Задать частоту сигнала 3200 Гц

ldi dlit,$60 ;и длительность импульса ШИМ-сигнала 48 мкс

breq Endkl

cpi scancode,$5

ldi frec,$F9 ;Задать частоту сигнала 4000 Гц

ldi dlit,$78 ;и длительность импульса ШИМ-сигнала 60 мкс

breq Endkl

cpi scancode,$6

ldi frec,$FA ;Задать частоту сигнала 4800 Гц

ldi dlit,$90 ;и длительность импульса ШИМ-сигнала 72 мкс

breq Endkl

cpi scancode,$7

ldi frec,$FB ;Задать частоту сигнала 5600 Гц

ldi dlit,$A8 ;и длительность импульса ШИМ-сигнала 84 мкс

breq Endkl

cpi scancode,$8

ldi frec,$FC ;Задать частоту сигнала 6400 Гц

ldi dlit,$C0 ;и длительность импульса ШИМ-сигнала 96 мкс

breq Endkl

cpi scancode,$9

ldi frec,$FD ;Задать частоту сигнала 7200 Гц

ldi dlit,$D8 ;и длительность импульса ШИМ-сигнала 108 мкс

breq Endkl

ldi frec,$FE ;Задать частоту сигнала 8000 Гц

ldi dlit,$F0 ;и длительность импульса ШИМ-сигнала 120 мкс

Endkl: ret

;Пpоцедуpа пpеpывания по пеpеполнению таймеpа T0

IntT0: push temp ;Сохранить temp в стеке

out TCNT0,frec ;Пеpезагpузить таймер Т0

in temp,SREG ;Сохранить SREG

sbis pind,4 ;Если на PD4 был "0", то установить "1"

rjmp Ust1 ;и наоборот

cbi portd,4

rjmp EndT0

Ust1: sbi portd,4

EndT0: out SREG,temp ;Восстановление SREG

pop temp ;Выгрузить данные из стека

reti ;Выйти из процедуры

Соседние файлы в папке Новая папка (1)