Институт физики
КАЗАНСКОГО (ПРИВОЛЖСКОГО) ФЕДЕРАЛЬНОГО УНИВЕРСИТЕТА
Плеухова Л.Ф.
УПРАВЛЕНИЕ ПРИ ПОМОЩИ КЛАВИАТУРЫ ПЕРИФЕРИЙНЫМИ
УСТРОЙСТВАМИ ЛАБОРАТОРНОГО МАКЕТА 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
……….