Друзья помогите пожалуйста, проблема с 7segment

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 8
Зарегистрирован: Чт окт 16, 2014 14:28:17

Сообщение djanchino »

.include "tn2313def.inc"

.ORG $0000
rjmp RESET
.ORG $0001
rjmp INT_0
.ORG $0002
rjmp INT_1


RESET:
ldi r16,255
out DDRB, r16
ldi r16, 0b01110000
out DDRD, r16
ldi r16,0b00001110
out PORTD,r16
ldi r16,0b11000000
out GIMSK,r16
ldi r16, RAMEND
out SPL, r16
ldi r27,200

rcall nisher
mov r19, r21
rcall get_segcode
mov r24,r19
mov r19, r22
rcall get_segcode
mov r25,r19
mov r19,r23
rcall get_segcode
mov r26,r19
SEI

MAIN:
sbi pind,4
out PORTB, r24
cbi pind, 6
rcall timer

sbi pind,6
out PORTB, r25
cbi pind, 5
rcall timer

sbi pind,5
out PORTB, r26
cbi pind, 4
rcall timer

rjmp MAIN


nisher: ;;;;; здесь я разделяю число 200, которое записано в R27 на 3 части и записываю их в R21,R22,R23
push r27
ldi r16,100
rcall n_loop
mov r21,r17
ldi r16,10
rcall n_loop
mov r22, r17
mov r23, r27
pop r27
ret

n_loop:
ldi r17,-1
loop:
inc r17
sub r27,r16
brcc loop
add r27,r16
ret

get_segcode:
cpi r19,0
breq zero
cpi r19,1
breq one
cpi r19,2
breq two
cpi r19, 3
breq three
cpi r19,4
breq four
cpi R19,5
breq five
cpi R19,6
breq six
cpi R19,7
breq seven
cpi R19,8
breq eight
cpi R19,9
breq nine





zero:
ldi r19,0b00111111
ret

one:
ldi r19,0b00000110
ret

two:
ldi r19,0b01011011
ret

three:
ldi r19,0b01001111
ret

four:
ldi r19,0b01100110
ret

five:
ldi r19,0b01101101
ret

six:
ldi r19,0b01111101
ret

seven:
ldi r19,0b00000111
ret

eight:
ldi r19,0b01111111
ret

nine:
ldi r19,0b01101111
ret

INT_0:

sbic portd,1
rcall aaa
dec r27
rcall nisher
mov r19, r21
rcall get_segcode
mov r24,r19
mov r19, r22
rcall get_segcode
mov r25,r19
mov r19,r23
rcall get_segcode
mov r26,r19
reti

INT_1:

sbic portd,1
rcall aaa
inc r27
rcall nisher
mov r19, r21
rcall get_segcode
mov r24,r19
mov r19, r22
rcall get_segcode
mov r25,r19
mov r19,r23
rcall get_segcode
mov r26,r19
reti


timer:
ldi r16,255
ldi r17, 1
loop_w:
subi r16,1
sbci r17,0
brcc loop_w
ret



aaa: ;;;; Здесь я хочу сделать Шифт с помощью дополнительного регистра R16

mov R16,R23
mov R23,R22
mov R22,r21
mov r21,r23
mov r19, r21
rcall get_segcode
mov r24,r19
mov r19, r22
rcall get_segcode
mov r25,r19
mov r19,r23
rcall get_segcode
mov r26,r19

reti



На протеусе у меня три кнопки которые подключены к PIND1,PIND2,PIND3. Когда PIND1 нажато, надо что бы на сегменте делал шифт при каждом нажатии PIND2 или PIND3 , а когда нет просто инкремент или декремент. Но почему то этого не происходит, при любом состоянии PIND1 только прибавляет или наоборот . Помогите буду при много благодарен !!!!!
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Код: Выделить всё

INT_0:

sbic portd,1
rcall aaa
нужно

Код: Выделить всё

INT_0:

sbic pind,1
rcall aaa
INT_1 аналогично.

Замечание по Вашему сдвигу:

Код: Выделить всё

aaa: ;;;; Здесь я хочу сделать Шифт с помощью дополнительного регистра R16

mov R16,R23
mov R23,R22
mov R22,r21
mov r21,r23 ; Этой командой Вы засунете сюда значение регистра r22. Нужно написать mov r21, r16
mov r19, r21; Дальнейшие команды не имеют смысла, т.к. в регистрах и так содержатся коды символов и вызов get_segcode ничего не даст
rcall get_segcode
mov r24,r19
mov r19, r22
rcall get_segcode
mov r25,r19
mov r19,r23
rcall get_segcode
mov r26,r19
Я так понимаю, работаете в Протеусе? Протеус не эмулирует дребезг контактов. А жаль..
Да и длительность нажатия на кнопку у Вас не отрабатывается..
Fucking static initialization order fiasco
Контактная информация:
Реклама
Ответить

Вернуться в «AVR»