Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_klaviatura_окончат.doc
Скачиваний:
6
Добавлен:
10.02.2015
Размер:
401.92 Кб
Скачать

Институт физики

КАЗАНСКОГО (ПРИВОЛЖСКОГО) ФЕДЕРАЛЬНОГО УНИВЕРСИТЕТА

Плеухова Л.Ф.

УПРАВЛЕНИЕ ПРИ ПОМОЩИ КЛАВИАТУРЫ ПЕРИФЕРИЙНЫМИ

УСТРОЙСТВАМИ ЛАБОРАТОРНОГО МАКЕТА LABKIT08

НА БАЗЕ МИКРОКОНТРОЛЛЕРА 68НС908 (MOTOROLA)

Описание к лабораторной работе

Казань 2010

Печатается по решению Редакционно – издательского совета Института физики Казанского (Приволжского) Федерального университета

УДК 621.375(03)

Плеухова Л.Ф. Управление при помощи клавиатуры периферийными устройствами лабораторного макета LabKit08 на базе микроконтроллера 68НС908 (Motorola). Описание к лабораторной работе. 2010.– 42 с.

Цель работы: изучение процедур параллельного ввода-вывода данных в цифровых системах на базе микроконтроллера MC68HC908GP32 и процедур использования клавиатуры для управления периферийными устройствами.

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

Рецензент: профессор кафедры радиоастрономии Казанского (Приволжского) Федерального университета, д.ф-м.н. Хуторова О.Г.

© Институт физики Казанского (Приволжского) Федерального университета, 2010

Введение

Обмен данными между микроконтроллером MC68HC908GP32 и периферийными устройствами осуществляется посредством четырёх параллельных портов A, B, C, D и последовательного порта Е. Все параллельные порты ввода-вывода являются двунаправленными и могут программироваться на ввод или на вывод данных. Некоторые выводы параллельных портов совмещены с выводами периферийных устройств, входящих в состав микроконтроллера MC68HC908GP32, поэтому в случае использования таких устройств соответствующие выводы не могут служить для ввода-вывода данных. В данной работе рассматриваются особенности применения параллельных портов ввода-вывода в микроконтроллере MC68HC908GP32 (Motorola).

Параллельный ввод-вывод данных

Каждый параллельный порт ввода-вывода имеет регистр данных PTx и регистр направления DDRx, где x = A, B, C или D. В регистре направления DDRx задается настройка каждого вывода порта, конфигурирующая соответствующую линию на ввод или на вывод данных. Если бит в регистре направления имеет значение 0, то данный вывод порта является входом, а если 1 – выходом. Считывание или запись данных в порт осуществляется путем соответственно чтения или записи в регистр данных PTx. Обращение к регистрам портов производится с помощью команд пересылки данных. Например, команда STA позволяет записать содержимое регистра A в нужный регистр порта.

После запуска микроконтроллера все выводы конфигурируются на работу в качестве входов, т.е. все биты в регистрах направления принимают значение 0. В случае использования выходов порта для вывода данных, необходимо установить 1 в соответствующих битах регистров направления DDRx.

Для некоторых портов существует возможность подключения подтягивающих резисторов, если соответствующие выводы сконфигурированы на ввод данных. Эти настройки задаются в специальных регистрах включения подтягивающих резисторов PTxPUE. Подключение подтягивающих резисторов позволяет устранить неоднозначность считывания состояния линии в момент отсутствия сигнала от внешних устройств.

Характеристики параллельных портов ввода-вывода, входящих в состав микроконтроллера MC68HC908GP32 приведены в таблице 1.

Таблица 1. Характеристики параллельных портов MC68HC908GP32

Порт

Регистр

данных

Регистр

направления

Регистр

Резисторов

Особенности

A

PTA

($0000)

DDRA ($0004)

PTAPUE ($000D)

8-разрядный порт, совмещенный с выводами блока KBI08(клавиатура)

B

PTB

($0001)

DDRB ($0005)

---

8-разрядный порт, совмещенный с выводами блока ADC08

C

PTC

($0002)

DDRC ($0006)

PTCPUE ($000E)

7-разрядный порт, совмещенный с выводами ЖКИ (жидко-кристал- лического индикатора)

D

PTD

($0003)

DDRD ($0007)

PTDPUE ($000F)

8-разрядный порт, совмещенный с выводами блоков TIM1, TIM2 (таймерами)

Ввод данных с клавиатуры

Одним из наиболее распространенных устройств ввода команд и данных в цифровую систему является клавиатура. На панели макета LabKit08 расположена 12-кнопочная клавиатура (4 ряда по 3 кнопки), которая подключена к выводам PTA1-PTA7 порта A. Считывать код нажатой кнопки можно путем опроса клавиатуры или по запросу прерывания. Схема подключения выводов клавиатуры к выводам микроконтроллера показана на рис. 1.

Если контроль состояния клавиатуры осуществляется по опросу, то необходимо сконфигурировать выводы управления строками PTA4-PTA7 на ввод данных, а выводы управления столбцами PTA1-PTA3 на вывод данных. Для этого следует в регистре направления DDRA установить значения битов DDRA4-DDRA7 равными 0, а значения битов DDRA1-DDRA3 равными 1. Далее, необходимо разрешить подключение подтягивающих резисторов на выводах управления строками PTA4-PTA7, путем установки в регистре PTAPUE значений битов PTAPUE4-PTAPUE7 равными 1. Тогда, если кнопки не нажаты, на выводах PTA4-PTA7 будет присутствовать высокий потенциал, что соответствует состоянию логической 1.

Впроцедуре опроса клавиатуры на выводы управления столбцамиPTA1-PTA3 следует последовательно подавать низкий потенциал (логический 0), и считывать состояние клавиатуры с выводов управления строками PTA4-PTA7. Это осуществляется путем установки и считывания соответствующих битов в регистре PTA. В случае нажатия клавиши на соответствующем выводе PTAi установится состояние логического 0, а на остальных выводах сохранится состояние логической 1.

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

Рассмотрим подробнее метод опроса состояния клавиатуры.

Во – первых, для осуществления программного опроса клавиатуры необходимо выполнить соответствующие настройки. Ниже приведён фрагмент программы, демонстрирующий один из способов, позволяющих настроить 12 – ти кнопочную клавиатуру макета на ввод.

Клавиатура макета LabKit08 подключена к 8–ми разрядному порту А так, что четыре строки клавиш подключены к четырём старшим разрядам порта А, а три столбца клавиш подключены к трём младшим разрядам этого порта. Нулевой разряд порта не используется.

Фрагмент программы, демонстрирующий один из способов, позволяющих настроить 12 – ти кнопочную клавиатуру макета на ввод:

$Include 'gpgtregs.inc'

RAMST EQU $0040

ROMST EQU $8000

VECTORST EQU $FFDC

ORG ROMST

PROGRAM_INIT:

LDA #$0F ; Программирование линий порта на ввод

STA DDRA

MOV #$F0,PTAPUE ; Подключение подтягивающих резисторов

………………….

RTI

ORG VECTORST

………………….

Для программирования старших разрядов порта А на ввод, а младших разрядов порта – на вывод используется специальный регистр направления DDRA. Однозначность формируемого кода нажатой клавиши достигается за счёт использования подтягивающих резисторов (регистр PTAPUE) и программной засылкой в нулевой разряд порта значения 0.

Очевидно, что, если кнопки не нажаты, на выводах PTA4-PTA7 будет присутствовать высокий потенциал, что соответствует состоянию логической 1, и в этих разрядах порта установятся правильные значения сразу после нажатии клавиши. Для определения значений в младшей тетраде кода нужно программно проанализировать состояние выходных разрядов порта. Если ни одна клавиша не нажата на клавиатуре, порт будет содержать значение F0.

Во – вторых, перед программой опроса клавиатуры необходимо использовать подпрограмму временной задержки [6], которая будет давать пользователю время на то, чтобы нажать клавишу:

WAIT: CLRA

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

В этой подпрограмме происходит циклическая засылка в порт клавиатуры кода $00 и в случае отсутствия нажатия хотя бы одной клавиши из порта приходит код $F0. Если происходит нажатие клавиши, то один из битов в старшей тетраде сбрасывается в ноль и получаемое из порта число будет заведомо меньше числа $F0. Выход из подпрограммы ожидания происходит только в случае нажатия какой – нибудь клавиши на клавиатуре (т. е. обнаружения прихода числа меньшего $F0). При этом будем иметь сформированное в соответствии с нажатой клавишей значение старшей тетрады кода и далее необходимо выполнить уточнение значения младшей тетрады кода.

В – третьих, для анализа состояния выходных разрядов порта и уточнения кода нажатой клавиши, в зависимости от номера столбца, в котором эта клавиша находится необходимо осуществить сканирование клавиатуры путём поочерёдной засылки сканирующих кодов в порт, к которому подключена клавиатура. Выбор определённого столбца клавиатуры осуществляется подачей на него логического нуля, то есть код $0C (0706050413120100) выбирает первый столбец клавиатуры (клавиши "1", "4", "7", и "*"), код $0A (0706050413021100) – второй столбец клавиатуры (клавиши "2", "5", "8" и "0") и код $06 (0706050403121100) – третий столбец клавиатуры (клавиши "3", "6", "9" и "#").

Процесс сканирования клавиатуры и определения кода нажатой клавиши можно запрограммировать следующим образом:

LDA #$0C

JSR ANALYSIS

LDA #$0A

JSR ANALYSIS

LDA #$06

JSR ANALYSIS

………………….

ANALYSIS: STA PTA

LDA PTA

STA RAMStart

CMP #$F0

BLO END

RTS ,

где END – это метка команды, к которой нужно перейти в случае определения кода нажатой клавиши.

Полученный в результате анализа код нажатой клавиши можно записать в регистр А, или в другие регистры процессора, или в ячейки памяти или использовать для решения задач управления.

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

Ниже приведена ПРОГРАММА 1, позволяющая записать код нажатой клавиши в регистр А. Программа начинается с директивы $Include, которая позволяет активизировать библиотеку функций работы с периферийными устройствами микроконтроллера. Сама библиотека располагается в файле gpgtregs.inc, поэтому все программы, управляющие работой периферийных устройств, должны начинаться с команды $Include 'gpgtregs.inc'.

ПРОГРАММА 1.

$Include 'gpgtregs.inc'

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

org ROMStart

; Ожидание нажатия какой-либо клавиши

WAIT: CLRA

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

;Анализ присутствия нуля в старшей тетраде поступившего кода

ANALYSIS: STA PTA

LDA PTA

STA RAMStart

CMP #$F0

BLO END

RTS

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

Program_Init:

LDA #$0F ; Программирование линий порта

STA DDRA ; на ввод/вывод

MOV #$F0,PTAPUE;подключение подтягивающих резисторов к старшей тетраде

BEGIN: JSR WAIT ; ожидание нажатия клавиши

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

LDA #$0C ;проверка принадлежности нажатой клавиши 1 столбцу клавиатуры

JSR ANALYSIS

LDA #$0A ; проверка принадлежности нажатой клавиши 2 столбцу клавиатуры

JSR ANALYSIS

LDA #$06 ; проверка принадлежности нажатой клавиши 3 столбцу клавиатуры

JSR ANALYSIS

END: LDA RAMStart ; передача кода нажатой клавиши в регистр А

STOP

dummy_isr:

RTI; return

org VectorStart

dw dummy_isr; Time Base Vector

dw dummy_isr; ADC Conversion Complete

dw Program_Init; Reset Vector

…………………………..

Несколько слов необходимо сказать о задаче последовательного нажатия нескольких клавиш. Эта задача предполагает наличие временной задержки между нажатиями клавиш, что должно найти своё отражение и в программе. Программа ожидания окончания нажатия (отжатия) клавиши практически идентична подпрограмме ожидания нажатия клавиши, отличаясь от неё лишь условием выхода из подпрограммы. Возврат из подпрограммы "отжатия" происходит только в том случае, если считанный из порта код совпадает с числом $F0.

WAIT_END_PRESSING:

CLRA

STA PTA

LDA PTA

CMP #$F0

BNE WAIT_END_PRESSING

RTS .

ПРОГРАММА 2, осуществляет запись кодов последовательно нажатых клавиш клавиатуры в ячейки ОЗУ.

$Include 'gpgtregs.inc'

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

org ROMStart

;Ожидание нажатия клавиши

WAIT: CLRA

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

;Ожидание окончания нажатия клавиши

WAIT_END_PRESSING: CLRA

STA PTA

LDA PTA

CMP #$F0

BNE WAIT_END_PRESSING

RTS

; Анализ наличия нуля в старшей тетраде поступившего кода

ANALYSIS: STA PTA

LDA PTA

STA RAMStart

CMP #$F0

BLO RETURN

RTS

;Сканирование клавиатуры, анализ получаемых кодов и их передача в аккумулятор

GETCODE: LDA #$0C

JSR ANALYSIS

LDA #$0A

JSR ANALYSIS

LDA #$06

JSR ANALYSIS

RTS

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

PROGRAM_INIT:

LDA CONFIG1 ;отключение сторожевого таймера

ORA #1

STA CONFIG1

LDA #$0F ; программирование линий порта

STA DDRA ; на ввод/вывод

MOV #$F0,PTAPUE ; подключение подтягивающих резисторов к старшей тетраде

LDHX #$100

MOV #$0C,$41

BEGIN: JSR WAIT

JSR GETCODE

RETURN: LDA RAMStart

STA ,X

INCX

JSR WAIT_END_PRESSING ; Ожидание окончания нажатия клавиши

DEC $41 ; декремент содержимого счётчика

BNE BEGIN

STOP

dummy_isr:

RTI

org VectorStart

dw dummy_isr; Time Base Vector

dw dummy_isr; ADC Conversion Complete

…………………………..

На рис. 1. представлена копия экрана системы проектирования, где в ячейках памяти, начиная с адреса 100, зафиксированы коды 12 – ти кнопок клавиатуры, полученные с помощью программы 2.

Рис. 2. Копия экрана системы проектирования, где зафиксированы

коды 12 – ти кнопок клавиатуры

В результате работы этой программы в порт А, а затем и в ячейки памяти последовательно записываются коды нажатых клавиш.

Таблица.2. Коды всех клавиш лабораторного макета LabKit08

Клавиша

1

2

3

4

5

6

7

8

9

*

0

#

Код

клавиши

EC

EA

E6

DC

DA

D6

BC

BA

B6

7C

7A

76

Алгоритмы управления периферийными устройствами с помощью одной клавиши или последовательности нажатых клавиш достаточно очевидны и сводятся к сравнению с заранее заданным кодом клавиши или к последовательному сравнению с заранее заданной последовательностью кодов клавиш.

Сначала рассмотрим примеры программ включения светового и звукового индикаторов при нажатии любой клавиши макета (ПРОГРАММА 3 и ПРОГРАММА 4).

В начале программы необходимо выполнить некоторые начальные установки:

  • отключить сторожевой таймер,

  • выключить светодиод, занесением единицы в пятый разряд порта D, к которому подключен светодиод,

  • записать единицу в пятый разряд регистра DDRD, сконфигурировав эту линию на вывод,

  • сконфигурировать выводы управления строками PTA4-PTA7 клавиатуры на ввод данных, а выводы управления столбцами PTA1-PTA3 на вывод данных.

Ожидание нажатия клавиши реализуется подпрограммой WAIT. Как только зафиксировано нажатие, занесением нуля в соответствующий разряд порта D включается светодиод. Длительность горения светодиода определяется подпрограммой формирования временной задержки Delay. В нашем случае эта задержка составляет 2 с, поскольку длительность внутреннего цикла L1 составляет примерно 0,01 с, а переменной time присвоено число 200. По истечении 2 с, происходит возврат в основную программу и выключение светодиода.

ПРОГРАММА 3, реализует включение светодиода при нажатии любой клавиши:

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

$Include 'gpgtregs.inc'

org RAMStart

TIME DS 1

T1 DS 1

org ROMStart

WAIT: CLRA ;ожидание нажатия клавиши

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

VAR_DELAY: ; формирование задержки,

; внутренний цикл по L2 равен 100мкс

MOV #100T,T1 ; цикл L1 равен 0,01с

L1: LDA #33T

L2: DECA

BNE L2

DEC T1

BNE L1

DEC TIME

BNE VAR_DELAY

RTS

MAIN_INIT:

RSP ; восстановление стека

LDA CONFIG1 ; отключение сторожевого таймера

ORA #1

STA CONFIG1

MOV #$20,PORTD ; выключение светодиода

MOV #$20,DDRD ; пятый бит порта D конфигурируется на выход

LDA #$0F ;программирование порта на ввод-вывод

STA DDRA

MOV #$F0,PTAPUE ;подключение подтягивающих резисторов

MOV #200T,TIME

JSR WAIT

MOV #$00,PORTD ; включение светодиода

BSR VAR_DELAY ; обращение к подпрограмме задержки

MOV #$20,PORTD ; выключение светодиода

dummy_isr: rti

org VectorStart

dw Dummy_Isr ; Time Base Vector

dw Dummy_Isr ; ADC Conversion Complete

……….

ПРОГРАММА 4, реализует включение звука при нажатии любой клавиши:

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

$Include 'gpgtregs.inc'

org ROMStart

A: BCLR 7,T2SC ; обнуление бита переполнния 2-го таймера

LDA T1SC

EOR #$30

STA T1SC ; остановка и обнуление обоих таймеров

LDA T2SC

EOR #$30

STA T2SC

DELAY:

MOV #$4B,T2MODH ; время звучания ноты

MOV #$00,T2MODL

MOV #$06,T2SC

LOOP2:

NOP

BCLR 7,T1SC0

BRCLR 7,T2SC,LOOP2

BCLR 7,T2SC

LDA T2SC

EOR #$30

STA T2SC

RTS

B: ; включение 1-го и 2-го таймера

MOV #$14,T1SC0

MOV #$96,T2MODH ; частота звука

MOV #$00,T2MODL

MOV #$06,T2SC

MOV #$06,T1SC

LOOP:

NOP

BCLR 7,T1SC0

BRCLR 7,T2SC,LOOP ; проверка бита переполнения

JSR A

RTS

NOTA_MI:

PSHA

MOV #$00,T1MODH ; включение ноты ми

MOV #$75,T1MODL

MOV #$00,T1CH0H

MOV #$3A,T1CH0L

JSR B

JMP DELAY

PULA

WAIT: CLRA ;ожидание нажатия клавиши

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

MAIN_INIT:

RSP ;отключение сторожевого таймера

LDA CONFIG1

ORA #1

STA CONFIG1

LDA #$0F ;программирование порта на ввод-вывод

STA DDRA

MOV #$F0,PTAPUE

JSR WAIT

JSR NOTA_MI

Dummy_Isr: rti

org VectorStart

dw Dummy_Isr ; Time Base Vector

dw Dummy_Isr ; ADC Conversion Complete

……….

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

Фрагменты ПРОГРАММЫ 5, позволяющей включить световой индикатор при нажатии клавиши "1" на клавиатуре:

DIOD: ;подпрограмма включения светодиода

…………………..

MOV #$20,PORTD

MOV #$20,DDRD

…………………..

MAIN_LOOP:

MOV #$00,PORTD

BSR LED_DELAY ;подпрограмма, задающая время работы светодиода

MOV #$20,PORTD

BSR LED_DELAY

BRA MAIN_LOOP

WAIT: CLRA ;подпрограмма ожидания нажатия клавиши

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

…………………..

MOV #$EC,$0040 ;задание кода клавиши "1", равного числу $EC

BEGIN: JSR WAIT ; и обращение к подпрограмме ожидания нажатия клавиши,

ANALYSIS:

STA PTA

LDA PTA

CMP #$F0

BLO END

RTS

…………………..

END: CBEQ $0040,DIOD ;сравнение с кодом клавиши"1" и включение светодиода

…………………..

Фрагменты ПРОГРАММЫ 6, позволяющей включить звуковой индикатор при нажатии клавиши "5" на клавиатуре:

WAIT:

CLRA ;подпрограмма ожидания нажатия клавиши

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

…………………..

ZWUK:

MOV #$14,T1SC0 ;формирование звука

MOV #$00,T1MODH

MOV #$94,T1MODL

MOV #$00, T1CH0H

MOV #$4A, T1CH0L

RTS

ANALYSIS: STA PTA

LDA PTA

CMP #$F0

BLO END

RTS

…………………..

MOV #$DA,$ 40 ;задание кода клавиши "5", равного числу $DA

JSR WAIT

…………………..

LDA #$0C ; определение кода нажатой клавиши и

JSR ANALYSIS ; передача кода нажатой клавиши из регистра A

LDA #$0A ; в ячейку памяти с адресом 40

JSR ANALYSIS

LDA #$06

JSR ANALYSIS

END:

CBEQ $40, ZWUK

…………………..

Взяв за основу, рассмотренные выше фрагменты программ, можно для управления периферийными устройствами использовать заданные последовательности клавиш.

ПРОГРАММА 7, реализует включение звука при нажатии заданной последовательности клавиш:

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

$Include 'gpgtregs.inc'

ORG ROMSTART

A: LDA T1SC ; остановка и обнуление обоих таймеров

EOR #$30

STA T1SC

RTS

PAUSE:

DEC $0075

LDA $0075

CMP #$00

BNE PAUSE

MOV #$FF,$0075

DEC $0070

LDA $0070

CMP #$00

BNE PAUSE

RTS

WAIT: CLRA

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

WAIT_END_PRESSING:

CLRA

STA PTA

LDA PTA

CMP #$F0

BNE WAIT_END_PRESSING

RTS

GETCODE:

LDA #$0C ;определение кода нажатой клавиши

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

LDA #$0A

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

LDA #$06

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

RET: RTS

NOTA_DO: MOV #$FF,$0075

MOV #$FF,$0070

MOV #$00,T1MODH ;задание частоты звука

MOV #$94,T1MODL

;MOV #$00,T1CH0H

;MOV #$4A,T1CH0L

MOV #$14,T1SC0 ;режим выдачи ШИМ-сигнала

MOV #$06,T1SC ;задание коэффициента деления тактовой частоты

JSR PAUSE

JSR A

STOP

MAIN_INIT:

RSP

LDA CONFIG1

ORA #1

STA CONFIG1

MOV #$FF,$0075

MOV #$FF,$0070

JSR A

JSR PAUSE

LDA #$0F

STA DDRA

MOV #$F0,PTAPUE

BEGIN1: JSR WAIT

JSR GETCODE

RETURN: LDA RAMSTART

CBEQA #$EC,BEGIN2 ; клавиша "1"

BEGIN2: JSR WAIT

JSR GETCODE

RETURN2: LDA RAMSTART

CBEQA #$DC,BEGIN3 ; клавиша "4"

BEGIN3: JSR WAIT

JSR GETCODE

RETURN3: LDA RAMSTART

CBEQA #$BC,NOTA_DO ; клавиша "7"

END: JSR WAIT_END_PRESSING

JSR A

JMP BEGIN1

dummy_isr: rti

org VectorStart

dw dummy_isr ; Time Base Vector

dw dummy_isr ; ADC Conversion Complete

……….

ПРОГРАММА 8, реализует различные варианты мерцания светодиода при нажатии различных последовательностей клавиш:

RAMStart EQU $0040

ROMStart EQU $8000

VectorStart EQU $FFDC

$Include 'gpgtregs.inc'

org ROMStart

A:

LDA T1SC ; остановка и обнуление обоих таймеров

EOR #$30

STA T1SC

RTS

PAUSE:

DEC $0075

LDA $0075

CMP #$00

BNE PAUSE

MOV #$FF,$0075

DEC $0070

LDA $0070

CMP #$00

BNE PAUSE

RTS

WAIT: CLRA

STA PTA

LDA PTA

CMP #$F0

BEQ WAIT

RTS

WAIT_END_PRESSING:

CLRA

STA PTA

LDA PTA

CMP #$F0

BNE WAIT_END_PRESSING

RTS

GETCODE:

LDA #$0C ;определение кода нажатой клавиши

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

LDA #$0A

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

LDA #$06

STA PTA

LDA PTA

STA RAMSTART

CMP #$F0

BLO RET

RET: RTS

SWET: MOV #$00,PORTD

JSR PAUSE

JSR A

MOV #$20,PORTD

RTS

SWET2: JSR SWET

JSR PAUSE

JSR SWET

RTS

SWET3: JSR SWET

JSR PAUSE

JSR SWET

JSR PAUSE

JSR SWET

RTS

MAIN_INIT:

RSP

LDA CONFIG1

ORA #1

STA CONFIG1

MOV #$FF,$0075

MOV #$FF,$0070

JSR A

JSR PAUSE

MOV #$20,PORTD

MOV #$20,DDRD

LDA #$0F

STA DDRA

MOV #$F0,PTAPUE

BEGIN1: JSR WAIT

JSR GETCODE

RETURN: LDA RAMSTART

CBEQA #$EC,BEGIN2

CBEQA #$EA,BEGIN2

CBEQA #$E6,BEGIN2

BEGIN2: JSR WAIT

JSR GETCODE

RETURN2: LDA RAMSTART

CBEQA #$DC,BEGIN31

CBEQA #$DA,BEGIN32

CBEQA #$D6,BEGIN33

BEGIN31: JSR WAIT

JSR GETCODE

RETURN31: LDA RAMSTART

CBEQA #$BC,SWET ;

BEGIN32: JSR WAIT

JSR GETCODE

RETURN32: LDA RAMSTART

CBEQA #$BA,SWET2

BEGIN33: JSR WAIT

JSR GETCODE

RETURN33: LDA RAMSTART

CBEQA #$B6,SWET3

END: JSR WAIT_END_PRESSING

JSR A

JMP BEGIN1

dummy_isr: rti

org VectorStart

dw dummy_isr ; Time Base Vector

dw dummy_isr ; ADC Conversion Complete

……….

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]