|
1. Найти произведение двух 4-разрядных чисел: первое число вводится в РА0…РА3, второе РВ0…РВ3. Результат выводится в порт D.(проверено!!!)
.include "m8535def.inc"
.cseg
.org 0
reset: ldi r16,0x0F; порты А и В на вход
out DDRA,r16
out DDRB, r16
ser r16; порт D на выход (ser- установить все биты регистра)
out DDRD,r16
main: in r16, PINA; загрузить данные из порта А в регистр 16
in r17, PINB; загрузить данные из порта А в регистр 17
mul r16, r17; беззнаковое умножение двух чисел (логическое =AND)
out PORTD, r16; вывести в порт D
rjmp main
2. Найти сумму двух 4-разрядных чисел: первое число вводится в РА0…РА3, второе РВ0…РВ3. Результат выводится в порт С.(проверено!!!)
.include "m8535def.inc"
.cseg
.org 0
reset:
ldi r16,0x0F; порты А и В на вход
out DDRA,r16
out DDRB, r16
ser r16; порт D на выход (ser- установить все биты регистра)
out DDRC,r16
main: in r16, PINA; загрузить данные из порта А в регистр 16
in r17, PINB; загрузить данные из порта А в регистр 17
or r16, r17;логическое сложение двух чисел (если арифметическое то ADC)
out PORTC, r16; вывести в порт D
rjmp main
3. Программа бегущий огонь с использованием программной задержки.
PD5…PD7(проверенно)
.include "m8535def.inc"
.cseg
.org 0
reset:
ldi r16, low (RAMEND)
ldi r17, high (RAMEND)
out spl, r16; установка стека
out sph, r17
ldi r16,0xF0; порт D на выход
out DDRD,r16
main: ldi r20, 0x10; PD5
out PORTD, r20
rcall delay
ldi r20, 0x20; PD6
out PORTD, r20
rcall delay
ldi r20, 0x40; PD7
out PORTD, r20
rcall delay
rjmp main
delay:;подпрограмма №1
clr r18;очистка регистра r18
met1:
rcall delay1;переход на delay2
inc r18;инкремент r18
cpi r18,0x64;сравнение значения r18 с числом
brne met1;если значение в r18≠200, то переход на met1
ret;иначе – возврат в основную программу
delay1:
clr r19
met2:
rcall delay2
inc r19
cpi r19,0x64
brne met2
ret
delay2:
clr r20
met3:
inc r20
cpi r20,0x64
brne met3
ret
4. Программа бегущий огонь с использованием задержки по таймеру PA0…PA4
(проверенно)
include"m8535def.inc"
.org 0
rjmp reset
.org $009
rjmp T0
.cseg
.org 20
reset:
ldi r16,0х00
out TCCR0,r16
ldi r16,$ВА; fзад = 8000000/(kд(256-TCNT0)) = 450
out TCNT0,r16
ldi r16,0х04; kд = 256
out TCCR0,r16
ldi r16,0х01;разрешение прерывания
out TIMSK,r16;по переполнению таймераТ0
ldi r16,low(RAMEND);инициализация стека
ldi r17,high(RAMEND)
out spl,r16
out sph,r17
ldi r16,0хFF;инициализация портов
out DDRA,r16;порт А выход
clr r25
sei
main:
rjmp main
T0:
rol r25
out PORTA, r25
ret
5. Используя динамическую индикацию с программной задержкой вывести число «1309». (проверенно)
.include "m8535def.inc"
.cseg
.org 0
reset:
ldi r16,$5F
ldi r17,$02
out spl,r16
out sph,r17
ldi r16,0xFF
out DDRC,r16;порт C устанавливаем полностью на вывод
out DDRD,r16;порт D устанавливаем полностью на вывод
;счетный регистр
ldi r21,0x01
ldi r22,$06
ldi r23,$4F
ldi r24,$3F
ldi r25,$6F
main:
in r17,SREG
rcall delay1
out SREG,r17
rol r21;циклический сдвиг влево через флаг переноса
cpi r21,0x10
brne m1;если лишний сдвиг то вернуть начальное значение
ldi r21,0x01
m1:
out PORTD,r21;на PORTD выводим номер индикатора
cpi r21,0x01;если первый индикатор
brne m2;то выдать на него
out PORTC,r25;соответствующий символ
rjmp main
m2:
cpi r21,0x02;если второй индикатор
brne m3
out PORTC,r24
rjmp main
m3:
cpi r21,0x04;если третий индикатор
brne m4
out PORTC,r23
rjmp main
m4:
out PORTC,r22
rjmp main
delay1:;подпрограмма №1
clr r18;очистка регистра r18
met1:
rcall delay2;переход на delay2
inc r18;инкремент r18
cpi r18,0x09;сравнение значения r18 с числом
brne met1;если значение в r18≠200, то переход на met1
ret;иначе – возврат в основную программу
delay2:
clr r19
met2:
rcall delay3
inc r19
cpi r19,0x09
brne met2
ret
delay3:
clr r20
met3:
inc r20
cpi r20,0x09
brne met3
ret
6. Используя динамическую индикацию с задержкой по таймеру вывести число «6543».(проверенно)
; Порт А на вход для задания символов
; Порт С на выход сегментов
; Порт Д на выход для питания индикаторов
.include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org 8; прерывание по переполнению таймера Т1
rjmp t1
reset:
ldi r16,$5F
ldi r17,$02
out spl,r16
out sph,r17
ldi r16,0xFF
out DDRC,r16;порт C устанавливаем полностью на вывод
out DDRD,r16;порт D устанавливаем полностью на вывод
;инициализация таймера Т1
clr r16
out TCCR1B,r16
out TCCR1A,r16; начальное значение таймера Т1 56124 $DB3C
ldi r21,$DB
ldi r22,$3C
out TCNT1H,r21;fзад = 8000000/(kд(65536-TCNT1)) = 850
out TCNT1L,r22
ldi r16, 0x00; 00 00 00 00
out TCCR1A, r16; срабатывание прерывания по совпадению с каналом В
ldi r16, 0x01; 0000 0001;kд = 1
out TCCR1B, r16; режим работы по переполнению
ldi r16, 0x04
out TIMSK, r16; маска прерывания по переполнению
sei
;счетный регистр
ldi r20,0x01
ldi r16,$7D
ldi r17,$6D
ldi r18,$66
ldi r19,$4F
main:
rjmp main
t1:
in r0,SREG;сохраняем значение регистра статуса
ldi r21,$DB
ldi r22,$3C
out TCNT1H,r21
out TCNT1L,r22
rol r20;циклический сдвиг влево через флаг переноса
cpi r20,0x10
brne m1;если лишний сдвиг то вернуть начальное значение
ldi r20,0x01
m1:
out PORTD,r20;на PORTD выводим номер индикатора
cpi r20,0x01;если первый индикатор
brne m2;то выдать на него
out PORTC,r19;соответствующий символ
reti
m2:
cpi r20,0x02;если второй индикатор
brne m3
out PORTC,r18
reti
m3:
cpi r20,0x04;если третий индикатор
brne m4
out PORTC,r17
reti
m4:
out PORTC,r16
reti
7. Используя прерывание по переполнению таймера Т0 написать прогу’на генератора прямоугольных 50 Гц импульсов
include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org 9; прерывание по переполнению таймера Т0
rjmp t0
reset:
ldi r16,$5F
ldi r17,$02
out spl,r16
out sph,r17
ldi r16,$FF
out DDRC,r16;порт C устанавливаем полностью на вывод
;инициализация таймера Т0
ldi r16,0
out TCCR0,r16;начальное значение таймера
ldi r16,$B2;fзад = 8000000/(kд(256-TCNT0)) = 100 Гц
out TCNT0,r16;установка начального значения частоты TCNT0=178 $B2
ldi r16,5;kд = 1024
out TCCR0,r16;установка предделителя частоты
ldi r16,$1;
out TIMSK,r16;разрешение прерывания таймера Т0
SEI;глобальное разрешение прерываний
clr r16
main:
rjmp main
t0:
ldi r17,$B2
out TCNT0,r17;установка начального значения частоты TCNT0=178 $B2
com r16
andi r16,1
out PORTC,r16
ret
ldi r16,$0
out TCCR1A,r16
ldi r16,$02
out TCCR1B,r16;начальное значение таймера
ldi r16,$D8;fзад = 8000000/(kд(65536-TCNT1)) = 100 $D8F0
out TCNT1H,r16;установка начального значения частоты TCNT1=55536=$D
ldi r16,$F0;kд = 8
out TCNT1L,r16;установка предделителя частоты
ldi r16,$4;
out TIMSK,r16;разрешение прерывания таймера Т1 по совпадению
SEI;глобальное разрешение прерываний
clr r16
8. Используя прерывание по совпадению таймера Т0 написать прогу’на генератора прямоугольных 1000 Гц импульсов
include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org 13; прерывание по переполнению таймера Т0
rjmp t0
reset:
ldi r16,$5F
ldi r17,$02
out spl,r16
out sph,r17
ldi r16,$FF
out DDRC,r16;порт C устанавливаем полностью на вывод
;инициализация таймера Т0
ldi r16,0
out TCCR0,r16
out TCNT0,r16;начальное значение таймера
ldi r16,$7D;fзад = 8000000/(kд(256-TCNT0)) = 1000 Гц
out OCR0,r16;установка начального значения частоты OCR0=125 $7D
ldi r16,3;kд = 64
out TCCR0,r16;установка предделителя частоты
ldi r16,$2;
out TIMSK,r16;разрешение прерывания таймера Т0 по совпадению
SEI;глобальное разрешение прерываний
clr r16
main:
rjmp main
t0:
ldi r17,0
out TCNT0,r17
com r16
andi r16,1
out PORTC,r16
ret
9. Используя прерывание по совпадению и режим СТС таймера Т1 написать прогу’на генератора прямоугольных 1 Гц импульсов
include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org 6; прерывание по совпадению таймера Т1
rjmp t0
reset:
ldi r16,$5F
ldi r17,$02
out spl,r16
out sph,r17
ldi r16,$FF
out DDRC,r16;порт C устанавливаем полностью на вывод
;инициализация таймера Т0
ldi r16,$0
out TCCR1A,r16
ldi r16,$0B
out TCCR1B,r16;начальное значение таймера
ldi r16,$30;fзад = 8000000/(kд(65536-TCNT1)) = 1 Гц
out OCR1AH,r16;установка начального значения частоты OCR1A=12500=$30D4
ldi r16,$D4;kд = 64
out OCR1AL,r16;установка предделителя частоты
ldi r16,$10;
out TIMSK,r16;разрешение прерывания таймера Т1 по совпадению
SEI;глобальное разрешение прерываний
clr r16
main:
rjmp main
t0:
com r16
andi r16,1
out PORTC,r16
ret
10. Программа генерации быстрый ШИМ: в порт А дискретно задается скважность от 0 до 255. (проверенно)
.include "m8535def.inc"
.cseg
.org 0
rjmp rezet
.org $20
rezet:
ldi r16,low(RAMEND)
ldi r17,high(RAMEND)
out spl,r16
out sph,r17
ldi r16,0xFF
out DDRB,r16
out PORTA,r16
clr r16
out DDRA,r16
;инициализация Т0 в быстром ШИМ режиме
ldi r16,0x6B;Т0 в ШИМ режиме 0110 1011
out TCCR0,r16;быстрый ШИМ, сбрасывается в 0, Кд = 8
main:
in r16,PINA
out OCR0,r16
rjmp main
11. Программа генерации фазный ШИМ: в порт А дискретно задается скважность от 0 до 255. (проверенно)
.include "m8535def.inc"
.cseg
.org 0
rjmp rezet
.org $20
rezet:
ldi r16,low(RAMEND)
ldi r17,high(RAMEND)
out spl,r16
out sph,r17
ldi r16,0xFF
out DDRB,r16
out PORTA,r16
clr r16
out DDRA,r16
;инициализация Т0 в фазовом ШИМ режиме
ldi r16,0x69;Т0 в ШИМ режиме 0110 1001
out TCCR0,r16;быстрый ШИМ, сбрасывается в 0, Кд = 8
main:
in r16,PINA
out OCR0,r16
rjmp main
12. Программа генерации ШИМ в зависимости от значения трех битов РА0…РА2 с использованием Flash памяти. В ячейки памяти записаны произвольные значения скважности. (проверенно)
.include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org $20
reset:
ldi r16,low(RAMEND);стек
out spl,r16
ldi r16,high(RAMEND);или 0х025F
out sph,r16
ldi r16,0xFF;инициализация портов
out DDRB,r16;порт B на вывод
out PORTA,r16;подтягивающие резисторы порта A
clr r16;очистка регистра r16
out DDRA,r16;порт A на ввод
;Т0 в ШИМ режиме
ldi r16,0x6A
out TCCR0,r16
ldi r31,2;старший байт указателя устанавливаем в 1
clr r30
main:
in r16,PINA
andi r16,0x0F;4 младших бита
mov r30,r16
lpm
out OCR0,r0
rjmp main
.org 0x100;параметры FLASH памяти
.db 0, 85, 170, 255, 170, 85, 0, 0-если равнобедренный треугольник
.db 0, 36, 72, 108, 144, 180, 216, 255-если треугольник прямоугольный
14. В ячейках ОЗУ записать 8 чисел. Вывод их в двоичном коде выполняется в порт С в зависимости от состояния входов РА0…РА2.
(проверенно)
.include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org $20
reset:
ldi r16,0xFF;инициализация портов
out PORTA, r16
out DDRC,r16
clr r16
out DDRA,r16
;запись данных в ОЗУ
ldi r16,0;запишем 0
ldi r17,1;запишем 1
ldi r18,2;запишем 2
ldi r19,3;запишем 3
ldi r20,4;запишем 4
ldi r21,5;запишем 5
ldi r22,6;запишем 6
ldi r23,7;запишем 7
clr r31;установка
ldi r30,$60;начала ОЗУ
ST Z+,r16;записать значение регистра r16 в ячейку памяти
ST Z+,r17;записать значение регистра r17 в ячейку памяти
ST Z+,r18;записать значение регистра r18 в ячейку памяти
ST Z+,r19;записать значение регистра r19 в ячейку памяти
ST Z+,r20;записать значение регистра r20 в ячейку памяти
ST Z+,r21;записать значение регистра r21 в ячейку памяти
ST Z+,r22;записать значение регистра r22 в ячейку памяти
ST Z,r23;записать значение регистра r23 в ячейку памяти
Ldi r31,1
main:
in r30,PINA
andi r30,0x07
ld r16,z
out PORTC,r16
rjmp main
15. В 4 ячейках ОЗУ записать цифры от 0 до 3. Составить программу, которая принимает состояние битов РА0…РА1 и выдает на семисегментный индикатор соответствующую цифру. (проверенно)
.include "m8535def.inc"
.cseg
.org 0
rjmp reset
.org $20
reset:
ldi r16,0xFF;инициализация портов
out PORTA, r16;порт A на ввод
out DDRC,r16;порт C на вывод
out DDRD,r16;порт D на вывод
clr r16;очистка регистра r16
out DDRA,r16;подтягивающие резисторы порта А
;запись данных в ОЗУ
ldi r16,0x3F;код символа 0
ldi r17,0x06;код символа 1
ldi r18,0x5B;код символа 2
ldi r19,0x4F;код символа 3
clr r31
ldi r30,$100;установка начала ОЗУ
ST Z+,r16;записать значение регистра r16 в ячейку памяти 0
ST Z+,r17;записать значение регистра r17 в ячейку памяти 1
ST Z+,r18;записать значение регистра r18 в ячейку памяти 2
ST Z,r19;записать значение регистра r19 в ячейку памяти 3
Idi r31,1
main:
in r30,PINA
andi r30,0x03
ld r16,z
out PORTD,r16
out PORTC,rez
rjmp main
16. В 16 ячейках Flash памяти записать цифры от 0 до F. Составить программу, которая принимает состояние битов РВ0…РВ3 и выдает на семисегментный индикатор соответствующую цифру.
.include "m8535def.inc"
ldi r16,0x00
out DDRB,r16
ser r16
out DDRD,r16
out DDRC,r16
out PORTD,r16
ldi r31,2
main:
in PINB,r30
andi r30, $0F
lpm
out PORTC, r0
rjmp main
.org $100
.db 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
Дата добавления: 2015-11-04; просмотров: 54 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
Минимальное количество баллов, подтверждающих | | |