Перейти к содержанию

Преобразование Знакового Числа Из Дополнительного Кода В Прямой


Рекомендуемые сообщения

Задай какие нибудь значения перед BCD2ASCII:, и посмотри, правильно ли выводит.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 226
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Задай какие нибудь значения перед BCD2ASCII:, и посмотри, правильно ли выводит.

Неправильно. Значит косяк либо при переводе, либо при выводе в порт.

Ставлю число 5 - показывает t=+005C, ставлю 10 - показывает t=+00:C, 20 - +014C, 12 - +00<C

По ходу понял в чем дело. В ОЗУ заносил числа в 10-м формате. Щас попробовал в 16-м занести, все правильно заработало :)

Но если так получается, то какой мне смысл тогда вообще переводить в двоично-десятичное? :)

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Числа нужно вводить в двоично-десятичном. 10 - это 00010000B, 20 - 00020000B, 12 - 00010010B. Или 10H, 20H и 12H. Так что вывод работает правильно. Ищите косяк выше.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Числа нужно вводить в двоично-десятичном. 10 - это 00010000B, 20 - 00020000B, 12 - 00010010B. Или 10H, 20H и 12H. Так что вывод работает правильно. Ищите косяк выше.

Ошибка в том. что на терминал выводится число в 16-м формате, а должно выводиться в 10-м. Сегодня на паре разбирали всю программу: подставил числа в преобразование, из 235 вычитал 200, выводил в терминал число 35, а терминал показал 23. То есть он вывел число в 16-м формате. Получается, что подпрограмма преобразования в BCD либо не работает (что исключено), либо стоит не в том месте.

Ссылка на комментарий
Поделиться на другие сайты

И я о том же.

А ещё, непонятные цифры в старшем разряде.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

И я о том же.

А ещё, непонятные цифры в старшем разряде.

И как тогда сделать? У нас после преобразования 16-чное число. и выводится в терминал 16-ное. А надо, чтоб выводилось 10-ное, понятное терминалу. Даже не знаю, как тут сделать. Мы же не можем переводить 16-ное в символы, а затем в 10-ное - это бред получится.если попробовать перевести в BCD, затем в символы и потом опять в BCD - может так что получится? :)

Ссылка на комментарий
Поделиться на другие сайты

Программа работает правильно, не поленился, проверил. И выводит t=+025C. По крайней мере должна выводить.Проблема либо с UART, либо с терминалом, либо с протеусом.

Попробуйте пропустить несколько тактов после вывода каждого символа.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Попробуйте пропустить несколько тактов после вывода каждого символа.

То есть в строку

txt: DB 051h,052h,047h,04Ah,049h,048h,053h, 1Bh

добавить пустые ячейки ОЗУ?

Ссылка на комментарий
Поделиться на другие сайты

Нет, в цикле, после вывода очередного символа сделай задержку.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

поставил вот так

write_char:
mov R0,A
mov A,@R0
MOV SBUF, A
JNB TI, $
mov r0,#250
djnz r0,$
INC DPTR
SJMP again
txt: DB 051h,052h,047h,04Ah,049h,048h,053h, 1Bh

ничего не меняется.

можно ли разбить полученное после преобразования 16-ное число на тетрады, перевести его в символьный вид а потом перевести все это в BCD?

Ссылка на комментарий
Поделиться на другие сайты

Вообще, странно. Когда задавал цифры вручную, всё выводилось правильно. И программа работает правильно. Мистика :)

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Вообще, странно. Когда задавал цифры вручную, всё выводилось правильно. И программа работает правильно. Мистика :)

так вот и у меня в программе все верно написано, а вывожу - ерунда.

Ссылка на комментарий
Поделиться на другие сайты

Вот смотрите: после преобразования получилось в десятичном виде 35, в 16-м - 23, после преобразования в BCD в десятичном должно быть 53, в 16-м - 35.

А после перевода BIN2BCD у нас в ОЗУ вместо 35 число 23. Вот тут косяк по идее.

То есть программа должна переводить число 23 в число 35 и тогда все норм будет. А так не получается.

Вот правильный вариант

BIN2BCD:
CALCBUFL				 DATA 044h ;младший байт двоично-десятичного
CALCBUFM				 DATA 045h ;средний байт двоично-десятичного
CALCBUFH				 DATA 046h ;старший байт двоично-десятичного
mov 44h,#35h
BIN2DEC:		 push PSW
push ACC
push B
push DPH
push DPL
mov DPH,CALCBUFM
mov DPL,CALCBUFL
mov CALCBUFH,#000h
mov CALCBUFM,#000h
mov CALCBUFL,#000h
mov B,#010h
BIN2DEC_1:
mov A,DPL
rlc A
mov DPL,A
mov A,DPH
rlc A
mov DPH,A
mov A,CALCBUFL
rlc A
da A
mov CALCBUFL,A
mov A,CALCBUFM
rlc A
da A
mov CALCBUFM,A
mov A,CALCBUFH
rlc A
da A
mov CALCBUFH,A
djnz B,BIN2DEC_1
pop DPL
pop DPH
pop B
pop ACC
pop PSW
END

А вот неправильный

BIN2BCD:
CALCBUFL				 DATA 044h ;младший байт двоично-десятичного
CALCBUFM				 DATA 045h ;средний байт двоично-десятичного
CALCBUFH				 DATA 046h ;старший байт двоично-десятичного
mov 44h,#35
BIN2DEC:		 push PSW
push ACC
push B
push DPH
push DPL
mov DPH,CALCBUFM
mov DPL,CALCBUFL
mov CALCBUFH,#000h
mov CALCBUFM,#000h
mov CALCBUFL,#000h
mov B,#010h
BIN2DEC_1:
mov A,DPL
rlc A
mov DPL,A
mov A,DPH
rlc A
mov DPH,A
mov A,CALCBUFL
rlc A
da A
mov CALCBUFL,A
mov A,CALCBUFM
rlc A
da A
mov CALCBUFM,A
mov A,CALCBUFH
rlc A
da A
mov CALCBUFH,A
djnz B,BIN2DEC_1
pop DPL
pop DPH
pop B
pop ACC
pop PSW
END

То есть получается, что в ОЗУ у нас заносится 10-ное число, оно просто представлено в 16-м виде там. И мы 10-ное переводим в BCD. Поэтому и результат получается такой же. Надо сделать так, чтобы после преобразования перед переводом в BCD у нас получалось 16-ное число. И тогда все получится :)

Изменено пользователем Pragmatik91
Ссылка на комментарий
Поделиться на другие сайты

Pragmatik91, вы по русски понимаете? Пресчёт идёт правильно. 35=23H=35BCD

А после перевода BIN2BCD у нас в ОЗУ вместо 35 число 23.

Получается 35BCD, которое выглядит как 35H. И это правильно для всех чисел.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Pragmatik91, вы по русски понимаете? Пресчёт идёт правильно. 35=23H=35BCD

А после перевода BIN2BCD у нас в ОЗУ вместо 35 число 23.

Получается 35BCD, которое выглядит как 35H. И это правильно для всех чисел.

Когда возле числа ставлю букву h, все нормально показывает, а когда убираю - что зря. Короче это косяк в Протеусе по ходу :)

Ссылка на комментарий
Поделиться на другие сайты

Терминал BCD формат понимает?

Ну я в программе BCD согласно таблице ASCII перевел.

Вот полная программа. Подставил вместо T1 20, вместо T2-40, получается в формуле 235-200=35. Это число заносится в ОЗУ, представляется как 23. Далее в BCD оно должно преобразоваться в 35h, но оно так и остается 23. И в терминал поступает 23.

WORK:
call PREOBRAZ
call BIN2BCD
call BCD2ASCII
call INTERM
jmp  WORK
PREOBRAZ:
; Умножение на 400
; Х= 400*Х= (16*Х + 8*Х + Х)*16
; Сумма в регистрах r7:r6:r5:r4
; Счетные регистры r3:r2:r1
;
;заносим в сумму Х .
; берем из таймера0
mov r7,#00
mov r6,#00
mov r5,#00
mov r4,#20
;заносим в счетные регистры Х.
mov	 r3,#00
mov	 a,r5
mov	 r2,a
mov	 a,r4
mov	 r1,a
; умножаем на 8 тремя сдвигами влево
mov	 r0,#03  ; три сдвига
m1:
clr	 c	   ; сбрасываем С (он попадет в младший бит)
mov	 a,r1    ; младший байт в аккумулятор
rlc	 a	   ; сдвиг влево через перенос
mov	 r1,a    ; обратно в регистр
mov	 a,r2    ; средний регистр в аккумулятор
rlc	 a	   ; сдвиг влево через перенос
mov	 r2,a    ; обратно в регистр
mov	 a,r3    ; старший регистр в аккумулятор
rlc	 a	   ; сдвиг влево через перенос
mov	 r3,a    ; обратно в регистр
djnz    r0,m1   ; вычесть из r1 единицу и перейти, если r0 не равен 0
; складываем с суммой
mov	 a,r1    ; регистр в аккумулятор
add	 a,r4    ; складываем с регистром суммы
mov	 r4,a    ; обратно в регистр суммы
mov	 a,r2    ; регистр в аккумулятор
addc    a,r5    ; складываем с регистром суммы с учетом переноса
mov	 r5,a    ; обратно в регистр суммы
mov	 a,r3    ; регистр в аккумулятор
addc    a,r6    ; складываем с регистром суммы с учетом переноса
mov	 r6,a    ; обратно в регистр суммы
clr	 a	   ; старший байт счетных регистров = 0
addc    a,r7    ; складываем с регистром суммы с учетом переноса
mov	 r7,a    ; обратно в регистр суммы
; умножаем счетные регистры еще раз на 2. В итоге получится X*16
clr	 c
mov	 a,r1
rlc	 a
mov	 r1,a
mov	 a,r2
rlc	 a
mov	 r2,a
mov	 a,r3
rlc	 a
mov	 r3,a
; складываем с суммой
mov	 a,r1
add	 a,r4
mov	 r4,a
mov	 a,r2
addc    a,r5
mov	 r5,a
mov	 a,r3
addc    a,r6
mov	 r6,a
clr	 a
addc    a,r7
mov	 r7,a
; умножаем сумму на 16 четырьмя сдвигами влево
mov	 r0,#04  ; четыре сдвига
m2:
clr	 c
mov	 a,r4
rlc	 a
mov	 r4,a
mov	 a,r5
rlc	 a
mov	 r5,a
mov	 a,r6
rlc	 a
mov	 r6,a
mov	 a,r7
rlc	 a
mov	 r7,a
djnz    r0,m2
;
; Деление    сумма/Т2
; (r7:r6:r5:r4)/(r3:r2) = r5:r4
;
; делитель берем из таймера1
mov	 r3,#00  ; старший байт
mov	 r2,#40  ; младший байт
; проверяем на переполнение частного (если старшие два байта делимого >= делителю)
clr	 c	   ; сбрасываем С, чтобы не повлиял на команду subb
mov	 a,r6    ; регистр в аккумулятор
subb    a,r2    ; вычитаем
mov	 a,r7    ; регистр в аккумулятор
subb    a,r3    ; вычитаем (важен С)
jnc    div_error	    ; если есть перенос(число больше), то уходим на ошибку
mov	 b,#16   ; 16 циклов
; сдвиг влево r7:r6:r5:r4
div16_0:
clr	 c
mov	 a,r4
rlc	 a
mov	 r4,a
mov	 a,r5
rlc	 a
mov	 r5,a
mov	 a,r6
rlc	 a
mov	 r6,a
mov	 a,r7
rlc	 a
mov	 r7,a
jc	  div16_3 ; если есть перенос, то вычесть делитель и прибавить 1 в частное r5:r4
; вычитаем делитель r3:r2
mov	 a,r6
subb    a,r2
mov	 r6,a
mov	 a,r7
subb    a,r3
mov	 r7,a
jnc	 div16_1 ; переноса нет, +1 к частному
; восстанавливаем остаток
mov	 a,r6
add	 a,r2
mov	 r6,a
mov	 a,r7
addc    a,r3
mov	 r7,a
sjmp    div16_2
; вычитаем остаток
div16_3:
clr	 c
mov	 a,r6
subb    a,r2
mov	 r6,a
mov	 a,r7
subb    a,r3
mov	 r7,a
; +1 к частному
div16_1:
inc	 r4
; следующий цикл
div16_2:
djnz    b,div16_0
;
; 235 - r5:r4
;
div_error:
raznost:
; в r7:r6 заносим 235
mov	  r7,#00
mov	  r6,#235
; вычитаем
clr	  c
mov	  a,r6
subb a,r4
mov	  r4,a
mov	  a,r7
subb a,r5
mov	  r5,a
mov r3,#0
;проверка полученного числа на отрицательность
mov a,r5
jnb acc.7, loop
inc r3
inc r3
mov a, r4
cpl a
add a,#00000001b
mov r4, a
mov a, r5
cpl a
addc a,#0
mov r5, a
loop:
mov a,r5
add a,#00h
mov r5,a
mov a,r4
add a,#00h
mov r4,a
mov 45H,r5 ;cтарший байт результата
mov 44H,r4 ;младший байт результата
mov 47H,r3 ;знак результата
ret
BIN2BCD:
CALCBUFL				 DATA 044h ;младший байт двоично-десятичного
CALCBUFM				 DATA 045h ;средний байт двоично-десятичного
CALCBUFH				 DATA 046h ;старший байт двоично-десятичного
BIN2DEC:  
mov DPH,CALCBUFM
mov DPL,CALCBUFL
mov CALCBUFH,#000h
mov CALCBUFM,#000h
mov CALCBUFL,#000h
mov B,#010h
BIN2DEC_1:
mov A,DPL
rlc A
mov DPL,A
mov A,DPH
rlc A
mov DPH,A
mov A,CALCBUFL
rlc A
da A
mov CALCBUFL,A
mov A,CALCBUFM
rlc A
da A
mov CALCBUFM,A
mov A,CALCBUFH
rlc A
da A
mov CALCBUFH,A
djnz B,BIN2DEC_1
ret
BCD2ASCII:
CALCBUFZN DATA 047h ;знак
CALCBUFTEMP DATA 051h ;знак t
CALCRAVNO DATA 052h ;знак =
CALCC DATA 053h ;знак С
;загружаем t
mov 051h,#74h
;загружаем знак =	  
mov 052h,#3Dh
;загружаем С   
mov 053h,#43h
;загружаем знак
mov A, CALCBUFZN
add A,#2Bh	   ;число знака  
mov 047h,A
;загружаем младший байт
mov A, 44h
ANL A,#00001111B
add A,#30h	   ;работаем с младшей тетрадой		  
mov 048h,A
mov A, 44h
ANL A,#11110000B ;работаем со старшей тетрадой
swap A
add A,#30h
mov 049h,A
;загружаем средний байт
mov A, 45h
ANL A,#00001111B ;работаем с младшей тетрадой
add A,#30h	 
mov 04Ah,A	 
mov A, 45h
ANL A,#11110000B ;работаем со старшей тетрадой
swap A
add A,#30h
mov 04Bh,A
  ret
INTERM:
;подпрограмма отправки строки в терминал
JMP start
start:
MOV SCON, #50h
MOV TH1, #0FDh
ORL TMOD, #20h
SETB TR1
MOV DPTR, #txt
again:
CLR TI
CLR A
MOVC A, @A+DPTR
CJNE A, #1Bh, write_char
JMP time
write_char:
mov R0,A
mov A,@R0
MOV SBUF, A
JNB TI, $
INC DPTR
SJMP again
txt: DB 051h,052h,047h,04Ah,049h,048h,053h, 1Bh
time:
delay equ -(30000000)		   
MOV TH0, #high(delay)
MOV TL0, #low(delay)
MOV TMOD, #1h
MOV R0, #230
SETB TCON.4
again1:
JNB TCON.5, $
CLR TCON.5
DJNZ R0, again1
skip:
mov r0,a
mov R0, #231
out:
SETB TCON.4
JNB TCON.5, $
CLR TCON.5
DJNZ R0, out
ret
END

Ссылка на комментарий
Поделиться на другие сайты

http://forum.cxem.ne...showtopic=17150

эта правильно работает стопудово.

Вот здесь вы прокололись, пожалуй.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...