2015-04-19 3 views
0

У меня возникла проблема с отображением четырех цифр на семисегментном дисплее. У меня есть следующий цикл, и все работает хорошо, за исключением отображения в MSB. Я знаю, это потому, что вход S9 всего 4 бит, поэтому, когда я умножаю его на SA (который является текущим значением семисегментного дисплея), результат дает мне только 12 бит, а последняя цифра остается равной 0, даже когда я сохраняю умножая, когда другие цифры переполняются до следующего. Поэтому я не знаю, как сделать его четырьмя цифрами без изменения продукта. Ниже приведен пример с результатами на дисплее. F раз F дает мне 00E1 E1 раз F дает мне 0D2F раз D2F F дает мне 02C1 (Там, где уже должна быть цифра в MSB)4 бит на 8 бит Умножение умножения

Мой код ниже:

 LOAD SB, 00 
     LOAD SF, 08 

     multloop: 
     SR0 SA; 

     JUMP NC, shiftproduct 

     ADD SB, s9 

     shiftproduct : 
     SRA SB 
     SRA SC 

     SUB SF, 01 
     JUMP NZ, multloop 

     OUTPUT sB,05 ; upper byte of seven segment display 
     OUTPUT sC,04 ; lower byte of seven segment display 

Спасибо вы, Julius

+1

не уверен, что CPU-я есть, или это просто концептуально, но «SRA' вращается через перенос? Кроме того (это не является причиной вашей проблемы), вы, вероятно, должны иметь 'LOAD SC, 00' в начале. В качестве эффективности вы можете завершить цикл, когда 'SA' станет нулевым. Вам не нужен счетчик циклов в 'SF'. Если у вас есть инструкция «добавить с переносом», я бы использовал 4-битное число в качестве множителя вместо 8-битного числа, которое потенциально могло бы составлять половину числа итераций цикла. – lurker

+0

Я думаю, что ваша петля также будет делать сдвиг слева от продукта слишком много раз к тому времени, когда это будет сделано. Согласно вашей логике цикла, «SRA SB» и «SRA SC» выполняются прямо перед тем, как вы решите выйти из цикла. Если это так, вы всегда будете видеть четный продукт (хотя в вашем заявлении вы утверждаете, что получаете правильные результаты). Вероятно, вы захотите сделать смену * после того, как решите выйти из цикла, прежде чем снова идти. – lurker

+0

Привет, Луркер, спасибо за ваш ответ. Да SRA вращается через все биты, включая перенос. – Julius

ответ

0

Я бы переделал код таким образом. Проблемы со старой версии являются:

  • SC регистр не инициализируется 00 (возможно, это было 00, чтобы начать, но я не хотел, чтобы предположить, что это было)
  • При добавлении множимого к продукту SC:SB, вам нужно не только, чтобы добавить его в SB, но нужно добавлять в результате переноса в SC

    LOAD SB, 00 
        LOAD SC, 00   ; <-- Needed to init SC 
        LOAD SF, 08   ; Loop counter 
    
    multloop: 
        SR0  SA 
        JUMP NC, shiftproduct 
    
        ADD  SB, s9 
        ADDCY SC, 00   ; <-- NEEDED and add C here to SC 
    
    shiftproduct: 
        SRA  SB 
        SRA  SC 
    
        SUB  SF, 01 
        JUMP NZ, multloop 
    
        OUTPUT sB,05    ; upper byte of seven segment display 
        OUTPUT sC,04    ; lower byte of seven segment display 
    
+0

Спасибо. Я попробую. – Julius

+0

@Julius Я только что понял, что у меня что-то не так в реализации. См. Мой обновленный ответ. Ваша реализация была ближе к правильной, чем я думал, поскольку я не понимал, что это как бы запускает стандартную процедуру умножения в обратном порядке. И поэтому необходим счетчик циклов. – lurker

+0

Я нашел свою проблему, мне нужно было снова умножить второй байт и добавить ответ к сотням первого байта. Спасибо за вашу помощь. – Julius

Смежные вопросы