litceyvib.ru 1

Московский государственный институт электроники и математики


Кафедра Информационно-Коммуникационных Технологий


Курсовая работа по дисциплине:

Микропроцессорные системы


Выполнил: Новиков Р.О.

Преподаватель: Гудков Ю.И.


Москва 2008

Содержание

стр.

1. Техническое задание

3

2. Анализ технического задания

4

3. Алгоритм работы программы

5

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

5

3.2. Алгоритм работы обработчика прерываний таймера

6

3.3. Алгоритм работы обработчика прерываний PC клавиатуры

7

4. Листинг

8



1. Техническое задание

Реализовать программу на языке Assembler , которая по нажатию клавиши на стандартной матричной клавиатуре (16 клавиш) выводит слово из некоторого набора слов. Смена набора слов осуществляется нажатием клавиши на клавиатуре персонального компьютера. Количество слов в наборе и количество наборов слов равно десяти.

Программа разрабатывается для микроконтроллера серии MCS-51.


2.
Анализ технического задания

Работу программы можно представить в виде нескольких параллельных процессов: ожидание нажатия клавиши на клавиатуре ПК и последующее переключение набора слов, и ожидание нажатия клавиши на матричной клавиатуре и последующий вывод слова на экран.


Прерывание от таймера T2 будет определять нажатие клавиши на матричной клавиатуре. Вывод символа осуществляется через COM порт (TI).

Программа задействует только 10 клавиш матричной клавиатуры. Слова расположены в памяти последовательно по десять слов (один набор). Каждый из наборов слов задается меткой. Длина каждого слова будет равна 10 символам.

Слово будет выводиться последовательно с помощью цикла. Чтобы узнать, из какого именно набора слов необходимо вывести слово будет задействован регистр набора слов. Его значение будет изменяться пользователем при нажатии клавиш на PC клавиатуре. Напомним, что данные (слова) внутри набора слов расположены последовательно. Фактически, набор слов представляет собой строку, длиной 100 символов (количество слов в наборе = 10, длина слова = 10). Для определения смещения относительно начала набора будем использовать регистр символьного сдвига.


3. Алгоритм работы программы

3.1. Алгоритм основной подпрограммы:
MAIN


Начало




Установка обработчиков прерываний

Прерывания от
COM порта и таймеров T2






Инициализация переменных

Установка регистра DPTR и регистра сдвига






MAIN

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





3.2. Алгоритм работы обработчика прерываний таймера T2


Нет

Регистр символьного сдвига = 10?

Вывод символа из набора, на который указывает регистр набора слов, со сдвигом относительно начала набора на значение регистра символьного сдвига

Инкрементировать регистр символьного сдвига

Регистр символьного сдвига = 0

Обработка данных от матричной клавиатуры

Нет

Да

Есть ли прерывание от матричной клавиатуры?

Начало




Да



Конец



3.3. Алгоритм работы обработчика прерываний от PC клавиатуры


Начало



Конец

Запись в регистр набора слов адреса метки, согласно нажатой клавише

Обработка данных (анализ нажатой клавиши)

Нет

Да

Есть ли прерывание на COM порте?



4. Листинг

;=================================================

;ИНИЦИАЛИЗАЦИЯ

;=================================================

org 8000h


;Установка обработчиков прерываний

;-------------------------------------------------


;Обрботчик COM порта - PC клавиатуры

org 8023h

ljmp PCKEY


org 8033h; P1.0

ljmp HNDL_P1


org 803Bh; P1.1

ljmp HNDL_P1


org 8043h; P1.2

ljmp HNDL_P1


org 804Bh; P1.3

ljmp HNDL_P1

;Прочая инициализация


;-------------------------------------------------

clr TI

clr RI


B0 equ 11111101b

B1 equ 11111110b

B2 equ 11110111b

B3 equ 11111011b


;=================================================

;ОСНОВНАЯ ПРОГРАММА

;=================================================


mov SBUF, ' '

mov DPTR, #s1

mov R1, #01b


MAIN:

clr TI

clr RI

TM2IR equ 0C8h;interrupt flag register


IEN1 equ 0E8h;T2 interrupt enable register;

TM2CON equ 0EAh;T2 config register;

IP1 equ 0F8h ;interrupt priority

CTCON equ 0EBh; capture control



mov IEN1, #0Fh

mov CTCON, #10101010b ;falling 0-3 bits in P1 if interupt occured

;mov TM2IR, #00Fh;enable T2 capture register (for P1)

mov TM2CON, #00000011b; Timer T2 mode select ;;;;;?

mov IP1, #00h


mov P1, #0Fh


setb IE.7 ;enable interrupt

setb IE.4;enable interrupt from COM - por

;mov SBUF, #'1'

;call WAIT

;clr TI


jmp MAIN


;=================================================

;ОБРАБОТЧИК МАТРИЧНОЙ КЛАВИАТУРЫ

;=================================================


MKEY:

;ЛИНИЯ 1

mov A, P1

anl A, #B0

mov P1 , A

call SUB_REF_0 ;Обработка первой линии

call SLEEP


mov P1, #0ffh ;первод порта P1 в исходное состояние



;ЛИНИЯ 2

mov A, P1

anl A, #B1

mov P1 , A

call SUB_REF_1

call SLEEP

mov P1, #0ffh ;первод порта P1 в исходное состояние


;ЛИНИЯ 3

mov A, P1

anl A, #B2

mov P1 , A

call SUB_REF_2

call SLEEP

mov P1, #0ffh ;первод порта P1 в исходное состояние



ret


;Обработка ПЕРВОЙ линии (клавиши: 1, 4, 7, 0)

;-------------------------------------------------

SUB_REF_0:

jnb P1.5, L0

jnb P1.4, L1

jnb P1.7, L2

jnb P1.6, L3

jmp BACK



;КЛАВИША 1

L0:

call mt1

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK



;КЛАВИША 4

L1:

call mt4

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK


;КЛАВИША 7

L2:

call mt7

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK


;КЛАВИША 0

L3:

call mt0

call WAIT


mov SBUF, #' ' ;перевод строки

call WAIT


jmp BACK

BACK:

ret


;Обработка ВТОРОЙ линии (клавиши 2, 5, 8)

;-------------------------------------------------

SUB_REF_1:

jnb P1.5, L0_1

jnb P1.4, L1_1

jnb P1.7, L2_1

jmp BACK1


;КЛАВИША 2

L0_1:

call mt2

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK1



;КЛАВИША 5

L1_1:

call mt5

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK1



;КЛАВИША 8

L2_1:

call mt8

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK1

BACK1:

ret


;Обработка ТРЕТЬЕЙ линии (клавиши 3, 6, 9)

;-------------------------------------------------

SUB_REF_2:

jnb P1.5, L0_2

jnb P1.4, L1_2

jnb P1.7, L2_2

jmp BACK2


;КЛАВИША 3

L0_2:

call mt3

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK2



;КЛАВИША 6

L1_2:


call mt6

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK2


;КЛАВИША 9

L2_2:

call mt9

call WAIT

mov SBUF, #' ' ;перевод строки

call WAIT

jmp BACK2


BACK2:

ret


;Действия для нажатий клавиш на матричной клавы 0-9 (какое именно слово выводить из подмножества)

;-------------------------------------------------

mt0:

mov R1, #1010b

call jj

ret


mt1:

mov R1, #0001b

call jj

ret


mt2:

mov R1, #0010b

call jj

ret


mt3:

mov R1, #0011b

call jj

ret


mt4:

mov R1, #0100b

call jj

ret


mt5:

mov R1, #0101b

call jj

ret


mt6:

mov R1, #0110b

call jj

ret


mt7:

mov R1, #0111b

call jj

ret


mt8:

mov R1, #1000b

call jj

ret


mt9:

mov R1, #1001b

call jj

ret


;=================================================

;ОБРАБОТКА PC КЛАВИАТУРЫ

;=================================================



PCKEY:

jnb RI, IN_REF


;КЛАВИША 1

mov A, SBUF

xrl A, #'1'

jz pc1


;КЛАВИША 2

mov A, SBUF

xrl A, #'2'

jz pc2


;КЛАВИША 3

mov A, SBUF

xrl A, #'3'

jz pc3


;КЛАВИША 4

mov A, SBUF

xrl A, #'4'

jz pc4


;КЛАВИША 5

mov A, SBUF

xrl A, #'5'

jz pc5


;КЛАВИША 6

mov A, SBUF

xrl A, #'6'

jz pc6


;КЛАВИША 7

mov A, SBUF

xrl A, #'7'

jz pc7


;КЛАВИША 8

mov A, SBUF

xrl A, #'8'

jz pc8


;КЛАВИША 9

mov A, SBUF

xrl A, #'9'

jz pc9


;КЛАВИША 0

mov A, SBUF

xrl A, #'0'

jz pc0



clr RI

IN_REF:

reti


;Действия для нажатий клавиш на PC клавы 0-9 (какое именно слово выводить из подмножества)

;-------------------------------------------------

pc1:

mov DPTR, #s1

clr RI

ret


pc2:

mov DPTR, #s2

clr RI

ret

pc3:


mov DPTR, #s3

clr RI

ret


pc4:

mov DPTR, #s4

clr RI

ret


pc5:

mov DPTR, #s5

clr RI

ret


pc6:

mov DPTR, #s6

clr RI

ret


pc7:

mov DPTR, #s7

clr RI

ret


pc8:

mov DPTR, #s8

clr RI

ret


pc9:

mov DPTR, #s9

clr RI

ret


pc0:

mov DPTR, #s0

clr RI

ret


;=================================================

;ВЫВОД НА ЭКРАН

;=================================================


jj:

mov R5, DPL

mov R6, DPH

ii:

mov R2, #10

call cc

djnz R1, ii

call ShowMessage

mov DPL, R5

mov DPH, R6

ret


cc:

inc DPTR

djnz R2, cc

ret


;Вывод на экран слова из DPTR

;-------------------------------------------------

ShowMessage:

mov R7, #10

clr A

movc A, @A + DPTR

lbNextSymbol: call waitForTi

mov SBUF, A

inc DPTR

clr A

movc A, @A + DPTR

djnz R7, lbNextSymbol

ret

;Ожидание

;-------------------------------------------------

waitForTi:

jnb TI, $; зациклить, пока TI=0

clr TI

ret


;=================================================

;МАССИВ СЛОВ

;=================================================


s1: db '0000000000', '1-1Bbbbbb2', '1-2cccccc3', '1-3dddddd4', '1-4iiiiiii', '1-5aaaddd0', '1-6aaaddd0', '1-7aaaddd0', '1-8aaaddd0', '1-9aaaddd0', '1-0Xaaddd0'

s2: db '0000000000', '2-1Bbbbbb2', '2-2cccccc3', '2-3dddddd4', '2-4iiiiiii', '2-5aaaddd0', '2-6aaaddd0', '2-7aaaddd0', '2-8aaaddd0', '3-9aaaddd0', '2-0Xaaddd0'

s3: db '0000000000', '3-1Bbbbbb2', '3-2cccccc3', '3-3dddddd4', '3-4iiiiiii', '3-5aaaddd0', '3-6aaaddd0', '3-7aaaddd0', '3-8aaaddd0', '4-9aaaddd0', '3-0xaaddd0'

s4: db '0000000000', '4-1Bbbbbb2', '4-2cccccc3', '4-3dddddd4', '4-4iiiiiii', '4-5aaaddd0', '4-6aaaddd0', '4-7aaaddd0', '4-8aaaddd0', '5-9aaaddd0', '4-0xaaddd0'

s5: db '0000000000', '5-1Bbbbbb2', '5-2cccccc3', '5-3dddddd4', '5-4iiiiiii', '5-5aaaddd0', '5-6aaaddd0', '5-7aaaddd0', '5-8aaaddd0', '5-9aaaddd0', '5-0xaaddd0'

s6: db '0000000000', '6-1Bbbbbb2', '6-2cccccc3', '6-3dddddd4', '6-4iiiiiii', '6-5aaaddd0', '6-6aaaddd0', '6-7aaaddd0', '6-8aaaddd0', '7-9aaaddd0', '6-0xaaddd0'

s7: db '0000000000', '7-1Bbbbbb2', '7-2cccccc3', '7-3dddddd4', '7-4iiiiiii', '7-5aaaddd0', '7-6aaaddd0', '7-7aaaddd0', '7-8aaaddd0', '8-9aaaddd0', '7-0xaaddd0'

s8: db '0000000000', '8-1Bbbbbb2', '8-2cccccc3', '8-3dddddd4', '8-4iiiiiii', '8-5aaaddd0', '8-6aaaddd0', '8-7aaaddd0', '8-8aaaddd0', '9-9aaaddd0', '8-0xaaddd0'

s9: db '0000000000', '9-1Bbbbbb2', '9-2cccccc3', '9-3dddddd4', '9-4iiiiiii', '9-5aaaddd0', '9-6aaaddd0', '9-7aaaddd0', '9-8aaaddd0', '0-9aaaddd0', '9-0xaaddd0'

s0: db '0000000000', '0-1Bbbbbb2', '0-2cccccc3', '0-3dddddd4', '0-4iiiiiii', '0-5aaaddd0', '0-6aaaddd0', '0-7aaaddd0', '0-8aaaddd0', '0-9aaaddd0', '0-0xaaddd0'


end