GP1 писал(а):Дано:
Студия 4.18 SP2 b.700
Камень?
GP1 писал(а):Дано:
Студия 4.18 SP2 b.700
Код: Выделить всё
ldi temp4, 15 ;При частоте кварца 8Мгц, прерывание по переполнению
out TCCR1B, temp4 ;таймера Т1 происходит раз в ~0,5 секунд. (8/16384)
ldi temp4, (1<<PLOCK)
out PLLCSR, temp4
ldi temp4, (1<<TOIE1) ;Включаем прерывание по переполнению.
out TIMSK, temp4
GP1 писал(а):мк - tiny24



Код: Выделить всё
;***************************************************************************
;* "bin2BCD16" - 16-bit Binary to BCD conversion
;*
;* This subroutine converts a 16-bit number (fbinH:fbinL) to a 5-digit
;* packed BCD number represented by 3 bytes (tBCD2:tBCD1:tBCD0).
;* MSD of the 5-digit number is placed in the lowermost nibble of tBCD2.
;*
;* Number of words :25
;* Number of cycles :751/768 (Min/Max)
;* Low registers used :3 (tBCD0,tBCD1,tBCD2)
;* High registers used :4(fbinL,fbinH,cnt16a,tmp16a)
;* Pointers used :Z
;***************************************************************************
;***** Subroutine Register Variables
.equ AtBCD0 =13 ;address of tBCD0
.equ AtBCD2 =15 ;address of tBCD1
.def tBCD0 =r13 ;BCD value digits 1 and 0
.def tBCD1 =r14 ;BCD value digits 3 and 2
.def tBCD2 =r15 ;BCD value digit 4
.def fbinL =r16 ;binary value Low byte
.def fbinH =r17 ;binary value High byte
.def cnt16a =r18 ;loop counter
.def tmp16a =r19 ;temporary value
;***** Code
bin2BCD16:
ldi cnt16a,16 ;Init loop counter
clr tBCD2 ;clear result (3 bytes)
clr tBCD1
clr tBCD0
clr ZH ;clear ZH
bBCDx_1:lsl fbinL ;shift input value
rol fbinH ;through all bytes
rol tBCD0 ;
rol tBCD1
rol tBCD2
dec cnt16a ;decrement loop counter
brne bBCDx_2 ;if counter not zero
ret ; return
bBCDx_2:ldi r30,AtBCD2+1 ;Z points to result MSB + 1
bBCDx_3:
ld tmp16a,-Z ;get (Z) with pre-decrement
subi tmp16a,-$03 ;add 0x03
sbrc tmp16a,3 ;if bit 3 not clear
st Z,tmp16a ; store back
ld tmp16a,Z ;get (Z)
subi tmp16a,-$30 ;add 0x30
sbrc tmp16a,7 ;if bit 7 not clear
st Z,tmp16a ; store back
cpi ZL,AtBCD0 ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1 ;1.Сдвигать в лево
;2.Прибавлять 3 к каждой BCD тетраде которая >=5
;Повторять столько раз сколько бит в числе
;в последнем цикле прибавлять 3 не нужно !!!
;Пример 8 бит число: $F9 в BCD
результат исходное
;0000 0000 0000 : 1111 1001
;0000 0000 0001 : 1111 0010 (сдвиг в лево)
;0000 0000 0011 : 1110 0100 (сдвиг в лево)
;0000 0000 0111 : 1100 1000 (сдвиг в лево)
;0000 0000 1010 : 1100 1000 (add 3)
;0000 0001 0101 : 1001 0000 (сдвиг в лево)
;0000 0001 1000 : 1001 0000 (add 3)
;0000 0011 0001 : 0010 0000 (сдвиг в лево
;0000 0110 0010 : 0100 0000 (сдвиг в лево)
;0000 1001 0010 : 0100 0000 (add 3)
;0001 0010 0100 : 1000 0000 (сдвиг в лево)
;0010 0100 1001 : 0000 0000 (сдвиг в лево)
;В результате получим BCD 249.
Gudd-Head писал(а):Сдвиг влево равносилен умножению на 2... Это, типа, перенос старшего разряда?
SII писал(а):там умножение будет не на 10, а на 2 (на то она и двоичная): 111 (7) => 1110 (14).
SII писал(а):здесь, возможно, комбинируется прибавление 3 и сдвиг влево, т.е. умножение на 2. Ну а детально разбираться в такую жару... нет уж, увольте
Код: Выделить всё
.def minL = R18
.dseg
num: .byte 2 ; эти байты потом загруженны
.cseg
lds temp, num+minL; и вот из-за этой строчки ошибка
ARV писал(а):LD R,+X
имелосьGudd-Head писал(а):По всей видимости, имелось в виду LD R,-X
ARV писал(а):когда за окном сплошной плюс, о минусах как-то только мечты...
Код: Выделить всё
;---------- Чтение из EEPROM (Инициализация)
INIT:
ldi ZH, High(memory)
ldi ZL, Low(memory)
ldi count, 0
INIT1:
out EEAR, count
sbi EECR, EERE
in temp0, EEDR
st Z+, temp0
inc count
cpi count, 45
brmi INIT1
sei
retКод: Выделить всё
;---------- Модуль извлечения нажатой кнопки клавиатуры
KEYREQ:
ldi ZL, Low(ARRKEY*2) ;Определение массива
ldi ZH, High(ARRKEY*2)
ldi count1, 0
KEYLOOP:
cpi count1, 17 ;Счётчик циклов чтения из массива.
brpl KEYEND
lpm temp0, Z
andi temp0, 0x0F
cpi status, 0xFF
brne KEYRQ
ldi temp1, (1<<PA4) ;В случае открытого замка
add temp0, temp1
KEYRQ:
out PortA, temp0
andi temp0, 0x0F
inc count1
inc ZL
sbic PinB, 6
rjmp KEYLP
rcall DELAY0
rjmp KEYLOOP
KEYLP:
rcall DELAY1
sbis PinB, 6
rjmp KEYLOOP
rcall BEEP
KEYLP1:
sbic PinB, 6 ;Ожидание отпускания кнопки и возврат значения нажатой кнопки
rjmp KEYLP1
ret
KEYEND:
ldi temp0, 0xFF ;Возврат значения 0xFF если не нажата ни одна из кнопок
ret
;---------- Массив таблицы истинности К155ИД3 \ К155КП1
ARRKEY:
.db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0
.db 0,0