Страница: 6/8
m1:
in r30,PinC ; программа опроса клавиатуры и флагов
ldi r31,FEh
cp r30,r31 ;если равно, то переходим на подпрограмму ввода
rcall vvod
ldi r31,FDh
cp r30,r31 ;если равно, то переходим на подпрограмму вывода
rcall vyvod
ldi r31,7Fh
cp r30,r31 ;если равно, то переходим на подпрограмму сброса
rcall sbros
sbrc USR,RxC ; проверяем если бит USR,RxC=1, то переходим на
подпрограмму приема данных от компьютера, если не
равен то пропускаем следующую команду
rcall priem ; подпрограмма приема данных, после своего окончания
работы она скидывает флаг USR,RxC
sbrs flagdan ; проверяем если 0, то переход на m2, если нет, то
пропускаем следующую команду
rjmp m2
sbrs flagpr
rjmp m2
rcall outdan ; подпрограмма выдачи данных на компьютер, после
выполнения выдачи данных сбрасывает флаг данных и
приемника
m2:
rjmp m1
init:
ldi r31,ramend ; указываем стек
out SPL,r31
ldi r31,ffh ; порт B настроить на вывод
out ddrb,r31
ldi r31, 00h ; Port С to ввод
out DDRС, r31
ldi r31,FFh ; подключаем резисторы
out PortС, r31
ldi tmp,00011101 ; инициализация UART
out UCR,tmp ; ldi tmp,25 ;9600 бит/сек при fclk=4МГц
out UBBR,tmp ;
;инициализация встроенного АЦП
set ADCSR.ADEN ;разрешаем работу АЦП
set ADCSR.ADFR ;устанавливаем режим циклического преобразования
ldi ADPS,05H ;устанавливаем тактовую частоту 125 KHz при
;внешнем кварце 4MHz
ret
icom:
in r0,portA
sbi r0,2 ; установит RS в 1
out portA,r0
in r0,portA
сbi r0,1 ; установит W/R в 0
out portA,r0
in r0,portA
sbi r0,0 ; установит Е в 1
out portC,r0
out portB,r25 ;записать в ЖКИ команду из регистра r25
in r0,portA
cbi r0,0 ;сбросить Е в 0
out portA,r0
in r0,portA
sbi r0,1 ; установит W/R в 1
out portA,r0
ret
initlcd:
rcall del
ldi r25,30h
rcall icom ; осуществляем запись команды в регистр ЖКИ
rcall del
ldi r25,30h
rcall icom ; осуществляем запись команды в регистр ЖКИ
rcall del
ldi r25,30h
rcall icom
ldi r25,38h ; устанавливаем разрядность шины данных=8,
количество строк =2, шрифт 5х7 точек
rcall icom ; осуществляем запись команды в регистр ЖКИ
ldi r25,08h ; включить дисплей, зажечь курсор
rcall icom
ldi r25,01h ; очистить дисплей и установить курсор в нулевую позицию
rcall icom
ldi r25,06h ;устанавливаем направление сдвига курсор в право,
запретить сдвиг дисплея вместе со сдвигом курсора
rcall icom
ret
del:
ldi r17,150 ;задержка ~15 ms при кварце 4 МГц
l: ldi r18,200 ;
l1: dec r18 ;
brne l1 ;
dec r17 ;
brne l ;
ret
vvod:
rcall del ;делаем задержку
ldi r31,FEh ;проверяем есть ли действительно в регистре r30
указанные числа(таким образом устраняем дребезг
контактов)
cp r30,r31 ;если равно, то выполняем следующую программу
in r29,PinC ; программа опроса клавиатуры и флагов
ldi r31,FBh
cp r29,r31 ;если равно, то в r28 записываем адрес ячейки памяти
ldi r28,0060h
ldi r31,F7h
cp r29,r31
ldi r28,0070h
ldi r31,EFh
cp r29,r31
ldi r28,0080h
ldi r31,DFh
cp r29,r31
ldi r28,0090h
ldi r31,BFh
cp r29,r31
ldi r28,00A0h
rcall zapis
ret
vyvod:
rcall del ;делаем задержку
ldi r31,FDh ;проверяем есть ли действительно в регистре r30
указанные числа(таким образом устраняем дребезг
контактов)
cp r30,r31 ;если равно, то выполняем следующую программу
in r29,PinC ;программа опроса клавиатуры и флагов
ldi r31,FBh
cp r29,r31 ; если равно, то в r28 записываем адрес ячейки
ldi r28,0060h
ldi r31,F7h
cp r29,r31
ldi r28,0060h
ldi r31,ЕFh
cp r29,r31
ldi r28,0060h
Реферат опубликован: 4/04/2010