Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовой проект (8086)

.doc
Скачиваний:
38
Добавлен:
20.06.2014
Размер:
621.57 Кб
Скачать

  1. Листинг управляющей программы.

RAM0_BASE EQU 0x01000000 ;начальный адрес ОЗУ

ROM_BASE EQU 0x00000000 ;начальный адрес ПЗУ

IOR_BASE EQU 0x80000000 ;начальный адрес регистра ввода-вывода

KBD_IRQ_MASK EQU 0x02000000 ;маска прерывания клавиатуры

DISP_IRQ_MASK EQU 0x04000000 ;маска прерывания дисплея

KB_INT EQU 1 ;номер прерывания клавиатуры

DISP_INT EQU 2 ;номер прерывания дисплея

KB_BUF EQU 0 ;смещение буфера клавиатуры в ОЗУ

KBB_LEN EQU 128 ;смещение длины буфера в ОЗУ

KBB_CP EQU 132 ;смещение символа выводимого на дисплей в ОЗУ

excpt_tab:

B reset_handler ;RESET handler

B irq_fin ;Udefinde Instruction handler (fake)

B irq_fin ;SWI handler (fake)

B irq_fin ;PFA handler (fake)

B irq_fin ;DA handler (fake)

B irq_fin ;RESERVED handler (fake)

B irq_handler ;IRQ handler

B irq_fin ;FIQ handler (fake)

reset_handler:

MRS R0, CPSR ;R0<-CPRS (Current Process Status Register)

BIC R0, R0, 0x80 ;cброс флага I (7-ого бита в CPRS) (разрешение прерываний)

MSR CPSR, R0 ;CPSR<-R0

inf_loop:

B inf_loop ;put the processor into the infinite loop

B inf_loop

B inf_loop

B inf_loop

B inf_loop

B inf_loop

B inf_loop

; IOR structure:

; Bits Description

; 0-7 System control byte (Reserved)

; 8-15 keyboard buffer

; 16-23 interrupt numer

; 24-31 0

irq_handler:

MOV R8, IOR_BASE ;R8<-адрес регистра ввода-вывода

LDR R9, [R8] ;R9<-содержимое регистра ввода-вывода

MOV R10, R9, LSR 16 ;1-ый байт R10 содержит номер прерывания

CMP R10, KB_INT ;определение прерывания по номеру

BEQ kb_int

CMP R10, DISP_INT

BEQ disp_int

B irq_fin

kb_int:

MOV R10, R9, LSR 8 ;в 1-ый полубайт попадает состояние строк и столбцов клавиатурной матрицы

AND R10, R10, 0xFF ;extract keyboard buffer

MOV R10, R10, LSL 2 ;R10 = R10*4

ADD R10, R10, sat ;R10=R10+sat=индекс в таблице ASCII-кодов(scan-code to ASCII translation table)

LDR R11, [R10] ;R11<-ASCII-код

MOV R10, RAM0_BASE

ADD R10, R10, KBB_LEN

LDR R8, [R10] ;R8 = [KBB_LEN]

MOV R10, RAM0_BASE

ADD R10, R10, KB_BUF

ADD R10, R10, R8, LSL 2 ;в R10 свободная ячейка в буфере клавиатуры

CMP R11, 1 ;проверка на код клавиши Clear

BEQ transmit_cls

STR R11, [R10] ;записываем ASCII-код по адресу [R10]

MOV R10, RAM0_BASE

ADD R10, R10, KBB_LEN

ADD R8, R8, 1

STR R8, [R10] ;увеличиваем длину буфера на еденицу

B irq_fin

transmit_cls:

MOV R8, 254 ;escape code for LCD

STR R8, [R10] ;сохраняем escape code в ОЗУ по адресу [R10]

ADD R10, R10, 4 ;переходим в следующую ячейку ОЗУ

STR R11, [R10] ;store CLS

MOV R10, RAM0_BASE

ADD R10, R10, KBB_LEN

LDR R8, [R10] ;R8<-[R10]

ADD R8, R8, 2 ;R8=R8+2, т.к. в буфер сохранено 2 кода

STR R8, [R10] ;R8->[R10]

B irq_fin

disp_int:

MOV R8, RAM0_BASE

ADD R8, R8, KBB_LEN ;R8=адресс KBB_LEN в ОЗУ

LDR R9, [R8] ;R9<-[KBB_LEN]

CMP R9, 0

BEQ irq_fin ;длина буфера=0, след-но, нечего отображать

MOV R8, KBB_CP

ADD R8, R8, RAM0_BASE ;R8 = адресс KBB_CP в ОЗУ

LDR R9, [R8] ;R9=текущей позиции в клавиатурном буфере

MOV R9, R9, LSL 2 ;R9=смещение В ОЗУ текущей позиции в клавиатурном буфере

ADD R9, R9, RAM0_BASE

ADD R9, R9, KB_BUF ;R9=адрес в ОЗУ текущей позиции в клавиатурном буфере

LDR R10, [R9] ;R10<-ASCII-код текущего символа

MOV R11, IOR_BASE

ADD R11, R11, 1

STR R10, [R11] ;посылаем символ на дисплей

LDR R9, [R8] ;R9=смещение текущего символа в буфере клавиатуры

ADD R9, R9, 1 ;R9=R9+1

STR R9, [R8] ;смещаем текущую позицию в буфере

MOV R10, RAM0_BASE

ADD R10, R10, KBB_LEN

LDR R11, [R10] ;R11<-размер клавиатурного буфера

CMP R11, R9 ;[KBB_LEN] = [KBB_CP] ?

BNE irq_fin

MOV R8, 0

MOV R10, RAM0_BASE

ADD R11, R10, KBB_CP

STR R8, [R11] ;текущая позиция в буфере=0

ADD R11, R10, KBB_LEN

STR R8, [R11] ;длина буфера=0 (буфер пуст)

irq_fin:

SUBS R15, R14, 4

;возврат из IRQ_handler на команду, выполнявшуюся в момент прерывания, R15 - ip, R14 - регистр связи (содержит указатель на команду, следующую после команды, в момент выполнения которой произошло прерывание)

num: DW 0x4D

sat: DB '1', 0, 0, 0 ;scan-code to ASCII translation table

DB '5', 0, 0, 0

DB '9', 0, 0, 0

DB 'D', 0, 0, 0

DB '2', 0, 0, 0

DB '6', 0, 0, 0

DB 'A', 0, 0, 0

DB 'E', 0, 0, 0

DB '3', 0, 0, 0

DB '7', 0, 0, 0

DB 'B', 0, 0, 0

DB 'F', 0, 0, 0

DB '4', 0, 0, 0

DB '8', 0, 0, 0

DB 'C', 0, 0, 0

DB 1, 0, 0, 0 ;clear LCD

p_fin:

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

  1. Алиев, И. И. Виртуальная электротехника : Учеб. пособие [Текст] / И. И. Алиев. - М : РадиоСофт, 2003. - 112 с. - ISBN 5-93037-110-5. (621.3(07) А-50)

  2. Алексеенко, А. Г. Основы микросхемотехники [Текст] / А. Г. Алексеенко. - 3-е изд. перераб. и доп. - М : ЮНИМЕДИАСТАЙЛ, 2002. - 448 с. - ISBN 5-94774-002-8. (621.3(07) А479)

  3. Кузовкин, В. А. Электроника : Учебник [Текст] / В. А. Кузовкин. - М : Логос, 2005. - 328 с. - ISBN 5-98704-025-6. (621.3(07) К892)

  4. Петров, К. С. Радиоматериалы, радиокомпоненты и электроника : Учеб. пособие [Текст] / К. С. Петров. - СПб : Питер, 2004. - 522 с. - ISBN 5-94723-378-9. (621.3(07) П-305)

  5. Прянишников, В. А. Электроника : Полный курс лекций [Текст] / В. А. Прянишников. - 4-е изд. - СПб : КОРОНА принт, 2004. - 416 с. - ISBN 5-7931-0018-0. (621.3(07) П858)

  6. Степаненко, И. П. Основы микроэлектроники : Учеб. пособие для вузов [Текст] / И. П. Степаненко. - 2-е изд. перераб. и доп. - М. : Лаборатория базовых знаний, 2001. - 488 с. - ISBN 5-93208-045-0. (621.3(07) С794)

  7. Хоровиц, П. Искусство схемотехники [Текст]/ П. Хоровиц, У. Хилл. - Пер. с англ. - Изд. 6-е. - М. : Мир, 2003. - 704 с. - ISBN 5-03-003395-5. (621.3 Х80)

  8. Хотунцев, Ю. Л. Основы радиоэлектроники : Учеб. пособие [Текст] / Ю. Л. Хотунцев, А. С. Лобарев. - М. : Агар, 2000. - 288 с. - ISBN 5-89218-108-1. (621.3(07) Х855)

  9. Шевкопляс, Б. В. Микропроцессорные структуры. Инженерные решения : Справочник [Текст] / Б. В. Шевкопляс. - 2-е изд. перераб. и доп. - М. : Радио и связь, 1990. - 512 с. - ISBN 5-256-00460-3.