Смекни!
smekni.com

Цифровой термометр на микропроцессоре AVR-MEGA 128 (стр. 4 из 4)

JZ L$01 ; Если «0» ничего не делать

ADD TEN_K,MRESLT_LW ;Если «1»добавить множитель к резул

ADDC MLTPLR_HW,MRESLT_HW

L$01 RLA TEN_K ; Множитель X 2

RLC MLTPLR_HW

RLA BITTEST ; Проверить следующий бит

JNC L$002 ;Если бит в CARRY: завершить

; Подпрограмма беззнакового деления 32–бита на 16-бит

; Использованы регистры (MSTACK+2),MRESLT_LW,RESULT, LPCNTR, MRESLT_HW

; MRESLT_HW MRESLT_LW / (MSTACK+2) RESULT Остаток в MRESLT_HW

; По выходу: CARRY = 0: OK CARRY = 1: Частное > 16 Бит

DIVIDE CLR RESULT ; Очистить RESULT

MOV #17,LPCNTR ; Инициализация счётчика

DIV1 CMP MSTACK+2,MRESLT_HW

JLO DIV2

SUB MSTACK+2,MRESLT_HW

DIV2 RLC RESULT

JC RES_2_F ;Ошибка: RESULT > 16 Бит

DEC LPCNTR ; Декремент счётчика

JZ DIV3 ; 0: выход без ошибки

RLA MRESLT_LW

RLC MRESLT_HW

JNC DIV1

SUB MSTACK+2,MRESLT_HW

SETC

JMP DIV2

DIV3 CLRC ;Ошибки нет, C = 0

; Перевод сопротивления датчика в градусы Цельсия для отображения RES_2_F

CLR R12 ;Указат.на значение в табл.R

MOV #064H,R13 ;Поместить мин.темп.-1 в индик

JMP FIRST_CMP ;При первом сравн.1 не добав.

CHECK_R INCD R12 ;INC указат.на знач.в таб.cопрот.

DADD #1,R13 ;Десятичный инкремент счётчика

FIRST_CMP CMP RESIS_TAB(R12),RESULT

;Сравнить табличное значение с вычисленным сопротивлением

JNC CHECK_R ;Переход,если R датч.<табличного

;по адресу указателя

;Отобразить ”С” и знак «°» на ЖКИ

DISPLAY MOV.B #A+E+F+D,LCDM1+1 ;”С” ? дисплейная память ЖК

MOV.B #A+B+F+D,LCDM1+2 ;” °” (знак градуса)

; Отобразить значение, хранящееся в R13 в формате BCD на ЖКИ

MOV R13,R12 ;Копир.число в виде BCD в R12

MOV #LCDM1+4,R14 ;Младшая цифра в памяти ЖКИ; R14

BIC #0FFF0H,R13 ;Погасить всё,кроме младшей цифры

MOV.B LCD_TAB(R13),0(R14) ; Отпр.мл.цифру в ЖКИ

MOV R12,R13 ; Восстановить значение в R13

RRA R13 ; 4 сдвига

RRA R13

RRA R13

RRA R13

BIC #0FFF0H,R13 ; Погасить всё, кроме млад.цифры

MOV.B LCD_TAB(R13),1(R14) ;Отправить старшую цифру в ЖКИ

JMP BEGIN ; Переход к началу программы

; ЖКИ модуля STK

LCD_TYPE

A EQU01H

B EQU02H

C EQU10H

D EQU04H

E EQU80H

F EQU20H

G EQU08H

H EQU40H

LCD_TAB BYTE A+B+C+D+E+F ; Отображает”0”

.BYTE B+C ; Отображает”1”

.BYTE A+B+D+E+G ; Отображает”2”

.BYTE A+B+C+D+G ; Отображает”3”

.BYTE B+C+F+G ; Отображает”4”

.BYTE A+C+D+F+G ; Отображает”5”

.BYTE A+C+D+E+F+G ; Отображает”6”

.BYTE A+B+C ; Отображает”7”

.BYTE A+B+C+D+E+F+G ; Отображает”8”

.BYTE A+B+C+D+F+G ; Отображает”9”

; Табл.сопротив.30–40 °C. Значения = KОмыX1000–в 3 децимальных цифры

.EVEN ; Выравнивание по чётному адресу

RESIS_TAB

.WORD 12953 ;300C

.WORD 12666

.WORD 12378

.WORD 12090

.WORD 11858

.WORD 11626

.WORD 11393

.WORD 11161

.WORD 10929

.WORD 10353 ;400C

; Вектора прерываний

.EVEN ; Выравнивание по чётному адресу

.SECT ”INT_VECT”,I_VECTORS–31

.WORD RESET ; PORT0, Биты 2 .. 7

.WORD BTINT ; BASIC TIMER

.WORD RESET ; Нет источника

.WORD RESET ; Нет источника

.WORD RESET ; Нет источника

.WORD TPINT ; TIMER PORT

.WORD RESET ; Нет источника

.WORD RESET ; Нет источника

.WORD RESET ; Нет источника

.WORD RESET ; Нет источника

.WORD RESET ; WATCHDOG/TIMER, Режим таймера

.WORD RESET ; Нет источника

.WORD RESET ; UART

.WORD RESET ; P0.0

.WORD RESET ; NMI, Сбой генератора

.WORD RESET ; POR,Внеш. Reset, WATCHDOG

.END