Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_ПМПС.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
16.39 Mб
Скачать

Приложение б (обязательное) Текст учебной программы на ассемблере для лабораторной работы №3

. include "can128def.inc"

.ORG 0x00

start:

; Инициализация стека

ldi r16,low(ramend)

out SPL,r16

ldi r16,high(ramend)

out SPH,r16

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

loop:

call ScanKey

call led_out

rjmp loop

jmp start

// данные в регистре r18

led_out:

push r16

// На вывод

ldi r16,0xFF

out DDRA,r16

out PORTA,r20

// Защёлка

sbi DDRG,3

sbi PORTG,3

cbi PORTG,3

// ----------------

pop r16

ret

// Функия задержки

delay:

push r18

push r19

push r20

ldi r18,0xFF

ldi r19,0xFF

ldi r20,0x03

dd:

dec r18

brne dd

dec r19

brne dd

dec r20

brne dd

pop r20

pop r19

pop r18

ret

//-------------------

// Функция чтения строки клавиатуры

// номер столбца - r17

// значение столбца - r18

ReadColumn:

ldi r16,0x0F

out DDRD,r16

out PORTD,r17

inc r17

in r18,PIND

andi r18,0xF0

swap r18

ret

// Функция преобразования кода клавиатуры в десятичный код

CodeSolve:

cpi r18,0x0E

brne next2

ldi r20,1

rjmp return

next2:

cpi r18,0x0D

brne next3

ldi r20,5

rjmp return

next3:

cpi r18,0x0B

brne next4

ldi r20,9

rjmp return

next4:

cpi r18,0x07

brne next5

ldi r20,13

rjmp return

return:

add r20,r17

dec r20

ldi r18,0xFF

next5:

ret

// Функция сканирования клавиатуры

ScanKey:

push r16

push r17

push r18

ldi r17,0

call ReadColumn

call CodeSolve

cpi r18,0xFF

breq end

call ReadColumn

call CodeSolve

cpi r18,0xFF

breq end

call ReadColumn

call CodeSolve

cpi r18,0xFF

breq end

call ReadColumn

call CodeSolve

cpi r18,0xFF

breq end

end:

pop r18

pop r17

pop r16

ret

Приложение в (справочное) Пример программы для вывода на жки

Пример приведен для микроконтроллера AT90CAN128, работающего на частоте 8 МГц с использованием NIMER0 в режиме CTC.

.include "can128def.inc"

.equ D7 = PD0

.equ D6 = PD1

.equ D5 = PD2

.equ D4 = PD3

.equ E = PD4

.equ RW = PD5

.equ RS = PD6

start:

; Инициализация стека

ldi r16,low(ramend)

out SPL,r16

ldi r16,high(ramend)

out SPH,r16

; На вывод

ldi r16,0xFF

out DDRD,r16

call delay ;Задержка 15 мс

; 1- я

ldi r16,(1<<D5)+(1<<D4)

out PORTD,r16

call delay ;Задержка 4.1 мс

; 2- я

ldi r16,(1<<D5)+(1<<D4)

out PORTD,r16

call delay ;Задержка 100 мкс

; 3- я

ldi r16,(1<<D5)+(1<<D4)

out PORTD,r16

; Блок

ldi r16,(1<<D5)+(1<<D4)

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,(1<<D5)

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,0

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,0

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,(1<<D7)

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,0

out PORTD,r16

call delay ;Задержка 100 мкс

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

ldi r16,0

out PORTD,r16

call delay ;Задержка 100 мкс

; Конец Инициализации

loop:

rjmp loop

// command

cbi PORTD,RS ; RS = 0

cbi PORTD,RW ; RW = 0

; Старшая часть

ldi r16,(0<<D4)+(0<<D5)+(0<<D6)+(0<<D7)

out PORTD,r16

sbi PORTD,E ; E = 1

cbi PORTD,E ; E = 0

; Младшая часть

ldi r16,(1<<D4)+(1<<D5)+(0<<D6)+(1<<D7)

out PORTD,r16

sbi PORTD,E ; E = 1

cbi PORTD,E ; E = 0

rjmp start

// Функия задержки

delay:

ldi r18,0xFF

ldi r19,0xFF

dd:

dec r18

brne dd

dec r19

brne dd

ret

Заказ № _______ от «_____» _______________ 20___ г. Тираж __________ экз.

Изд-во СевНТУ