Ребята помогите разобраться с кодом

по МК и не только

Ребята помогите разобраться с кодом

Сообщение Lamer » 13 май 2011, 03:41

Вообщем на МК ATMEGA88 был написан при помощи Avr Studio следующий код:

Код: Выделить всё
rjmp start
   .equ portb = 0x05   
   .equ ddrb = 0x04   
   .equ pinb = 0x03   
         
   .equ ddrc = 0x07
   .equ portc = 0x08
   .equ pinc = 0x06
   
   .equ ddrd = 0x0A
   .equ portd = 0x0B
   .equ pind = 0x09

   Table: .db 0xc0,0x00,0xf9,0xa4,0x00,0xb0,0x99,0x92,0x00,0x82,0xf8,0x80,0x00,0x90

start:
   ldi r16, 0xFF   
   out ddrd, r16   
   ldi r16, 0xc7   
   out ddrb, r16   
   ldi r16, 0x30
   out ddrc, r16   

   
nullcount:
   ldi r21, -1
   ldi r20, 0
   ldi r17, 0xFE
check:
   out portd, r17
   in r16,   pinc   
   andi r16,0x02   
   breq segment1check
   inc r20         
   in r16,pinc      
   andi r16, 0x04      
   breq segment1check
   inc r20            
   cpi r20,15         
   breq nullcount      
   rol r17            
   rjmp check         
segment1check:
   mov r18,r17         
   ldi r23,2         
   sub r23,r18         
   cp r23,r20         
   brne segment1      
   rjmp segment1check   
segment1:               
   ldi r31,high(Table*2)
   add r21,r20            
   mov r30,r21            

   lpm r29,z+            
   out portd, r29         
   sbi portb,0            
   cbi portb,0            

   ldi r25,255            
loop:
   ldi r27,100            
loop2:
   dec r27               
   cpi r27,0            
   brne loop2            
   dec r25               
   cpi r25,0            
   brne loop            

   rjmp nullcount         


суть когда в том, что нажимая на макете на кнопочки, на циферблате появляются цифры от 0 до 9.


Изображение


Изображение
Последний раз редактировалось Lamer 13 май 2011, 03:48, всего редактировалось 1 раз.
Lamer
 
Сообщения: 2
Зарегистрирован: 13 май 2011, 03:32

Re: Ребята помогите разобраться с кодом

Сообщение Lamer » 13 май 2011, 03:45

по сути всё работает, но надо ответить на некоторые вопросы, ответа на которые я не знаю.

Table: .db 0xc0,0x00,0xf9,0xa4,0x00,0xb0,0x99,0x92,0x00,0x82,0xf8,0x80,0x00,0x90

зачем тут , в таблице нужны "нули" (0x00)

nullcount:
ldi r21, -1

с какой целью отнимается 1?

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

для чего?

ldi r31,high(Table*2)


что это значит, и для чего конкретно в этом коде нужно это?

segment1check:
mov r18,r17
ldi r23,2
sub r23,r18
cp r23,r20
brne segment1
rjmp segment1check

вот это тоже объяснить нужно..


товарищи, помогите ламеру,
зарание большое спасибо.))
Lamer
 
Сообщения: 2
Зарегистрирован: 13 май 2011, 03:32

Re: Ребята помогите разобраться с кодом

Сообщение Мужик » 28 ноя 2011, 21:26

с какой целью отнимается 1?

Это не вычитание, насколько я помню, команда LDI - загружает константу в регистр. А -1, имеет доп. код, где старший бит = 1.
Аватара пользователя
Мужик
 
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36


Вернуться в Общие вопросы



Кто сейчас на конференции

Зарегистрированные пользователи: Yandex [Bot]

cron