md; Установка курсораZL, Low (izm2) ZH, High (izm2) WriteLn; Висновок 2-й рядка
; ***************************************** *****************************
; Ініціалізація LCD
;**********************************************************************_LCD16S2D:R16,0portC,R16Delay40mksb1,16ZL,Low(LCD_INIT_DATA*2)ZH,High(LCD_INIT_DATA*2)_next0:portC,r0 ; TempZL, 1; AddImmedaiate to Word. Інкремент слово. ; Не менш 40нсportC, 4; Не менш 230нс
nopportC, 4Delay40mksb1Init_next0Delay1500mks
; ***************************************** *****************************
; Пауза 40 мксек
;**********************************************************************mks:TempTemp,0:TempLoopTemp
; ***************************************** *****************************
; Пауза +1500 мксек
;**********************************************************************mks:Tempb1Temp,0b1,20:TempLoop3b1Loop3b1Temp
ret
; ***************************************** *****************************
; Установка адреси для подальших операції і
; вибір оласті DDRAM.
; Вхідні дані: R16 (Temp) - адреса DDRAM + 0x80.
; Змінюється регістр R16 (Temp).
; ***************************************** *****************************:
push TempTempTemp, 0b00001111portC, Temp; Не менш 40нс
nopportC, 4; Не менш 230нс
nopportC, 4
nop; Не менш 270нс
nopTempTemp, 0b00001111portC, Temp
nop; Не менш 40нсportC, 4; Не менш 230нс
nopportC, 4
rcall Delay40mks
; ***************************************** *****************************
; Висновок текстового рядка на дисплей.
; Вхідні дані: регістр Z - адреса рядка в
; програмної пам'яті. $ - Кінець рядка.
; Змінюється регістр R16 (Temp), Z.
; ***************************************** *****************************:
; lpmtemp, zTemp, $ WriteLnEndZL, 1TempTempTemp, 0b00001111Temp, 0b00100000portC, Temp; Не менш 40нс
nopportC, 4; Не менш 230нс
nopportC, 4
nop; Не менш 270нс
nopTempTemp, 0b00001111Temp, 0b00100000portC, Temp; Не менш 40нс
nopportC, 4; Не менш 230нс
nopportC, 4Delay40mksWriteLn:
ret
; ***************************************** *****************************
; обробник переривання від перемикачів
; ***************************************** ***************************** _ INT0: temp2 temp, pinb; дізнаємося яка з кнопок була нажатаtemp, 0b00111100; порівнюючи поточне положення переклббчателей з попереднім (flag)
andi flag, 0b00111100flag, temp
; залежно від натиснутої кнопки переходимо до обробника
sbrc flag, 2but0flag, 3but1flag, 4but2flag, 5foto_int0:
in flag, pinb; заносимо в прапор поточний стан кнопок
; ********:; обробник натискання на кнопку 1pind, 2; якщо кнопка була відпущена виходимо з прериваніяexit_int0temp2,0x01; натиснута 1-я кнопкаPCICR, temp; дозвіл переривань при зміні стану на входах порту Dtemp, 0b00100000; завдання маски для активації прериванійPCMSK0, temp; переривання дозволені при зміні стану на вході 5 порту D
sbi portD, 1; включаємо передатчікtimer_clear_start; обнуляем таймер і запускаемportD, 0; вилючаем передатчікexit_int0:; обробник натискання на кнопку 2pinD, 3; якщо кнопка була відпущена виходимо з прериваніяexit_int0temp2,0x02; натиснута 2-я кнопкаPCICR , temp; дозвіл переривань при зміні стану на вході 5 порту Dtemp, 0b00100000; завдання маски для активації прериванійPCMSK0, temp; переривання дозволені при зміні стану на вході 5 порту D
sbi portD, 1; включаємо передатчікtimer_clear_start; обнуляем таймер і запускаємо
sbi portD, 0; вилючаем передатчікexit_int0:; обробник натискання на кнопку 3pinD, 4; якщо кнопка була відпущена виходимо з прериваніяexit_int0; обнуляем результати вимірювання в ОЗУ для 2-х рядків
ldi temp, 0x30zh, high (izm1 + 3) zl, low (izm1 + 3) zerowrtemp, 0x30zh, high (izm2 + 3)...