Двоично-десятичная система

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
boom19
Родился
Сообщения: 8
Зарегистрирован: Сб ноя 09, 2019 14:56:38

Двоично-десятичная система

Сообщение boom19 »

Здравствуйте, Задание такое: "Заполнить РОН банка №0 двоично-десятичными числами"

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

     #include p16f873a.inc
     __CONFIG _HS_OSC & _WDT_OFF;
     ORG      H'005'            ;вектор сброса 
CNT  EQU      H'A0'             ;определение регистра счётчика
                                ;с адресом А0(банк 1)

;запись возрастающих чисел в ОЗУ
     BCF      STATUS,RP1        ;выбираем банк регистров 1
     BSF      STATUS,RP0        ;
     MOVLW    H'20'             ;загрузка в рабочий регистр адреса            
                                ;первого POH в банке 0
     MOVWF    FSR               ;записываем начальный адрес
                                ;в регистр косв.адресации
     CLRF     CNT               ;обнуляем регистр счетчика
M10: MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH 
     INCF     FSR,F             ;увеличение адреса POH
                                ;в регистре косвенной адресации
     MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH
     INCF     CNT,F             ;увеличение счетчика на 1
     INCF     CNT,F             ;увеличение счетчика на 1
     MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH
     ANDLW 	  h'0F'				; побитное И с 0A
	 XORLW 	  h'0A'				; сравнение с 0A
	 BTFSS 	  STATUS,Z			; если не совпадают, скачок через команду
 	 GOTO	  M2				; вызов подпрограммы М2	
	 MOVF	  CNT,W				; загружаем счетчик в W
	 ADDLW	  H'6'
     MOVWF    CNT
M2:
     MOVF     CNT,W
     MOVWF    INDF
     INCF     FSR,F             ;увеличение адреса POH на 1
     MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH
     DECF     CNT,F             ;уменьшение счетчика на 1
     MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH
     ANDLW 	  h'0F'				; побитное И с 0A
	 XORLW 	  h'0F'				; сравнение с 0A
	 BTFSS 	  STATUS,Z			; если не совпадают, скачок через команду
 	 GOTO	  M3				; вызов подпрограммы М2	
	 MOVF	  CNT,W				; загружаем счетчик в W
	 ADDLW	  H'FA'
M3:     
     MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
     MOVF	  FSR,W
     XORLW    H'80'             ;сравниваем его с последним значение +1
     BTFSS    STATUS,Z          ;если не совпадают, то скачек через одну команду
     GOTO     M10               ;если не совпадают, то возврат
                                ;к записи следующей ячейки
END
Как видно на фотографии, он переводит в двоично-десятичный код, но у меня не получается сделать вычитание константы(в File Registre выдаёт 0F,1F,3F, эти числа нужно перевести).Помогите пожалуйста
Вложения
112.png
(19.74 КБ) 346 скачиваний
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Двоично-десятичная система

Сообщение BOB51 »

А если просто взять два регистра считающих от 0 до 9.
Переполнение первого дает инкремент второго, затем смещаем
старшую тетраду, собираем по "ИЛИ" и запихиваем в нужное место.
Второй способ - табличка с retlw....
8)
Реклама
diplodok
Мудрый кот
Сообщения: 1781
Зарегистрирован: Чт авг 10, 2017 20:57:51

Re: Двоично-десятичная система

Сообщение diplodok »

А можно и так

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

 	LIST p=16F873A
	#include  P16F873A.inc 
	errorlevel -302

	__CONFIG  _CP_OFF &  _FOSC_HS 
	CBLOCK 0x20		;96 byte		00
		arr			;здесь пишем
	endc

 	CBLOCK 0xA0		;80 byte		01
		CNT		;
	endc

	CBLOCK 0x120		;80+16 byte		10  0x100-0x17F
	endc
 

	CBLOCK 0x1A0		; 80+16 byte		11  0x100-0x17F
	endc

 	org 0x0000
		clrf STATUS
 		goto 	start


	org 0x0004
interrupt
; 
		retfie 


start
;запись возрастающих чисел в ОЗУ
     		BCF      STATUS,RP1        ;
    		BSF      STATUS,RP0        ; для CNT
     		MOVLW    0x20             ;загрузка в рабочий регистр адреса   
         
                                ;первого POH в банке 0
     		MOVWF    FSR               ;записываем начальный адрес
                                ;в регистр косв.адресации
		CLRF     CNT               ;обнуляем регистр счетчика
next		BCF 	STATUS,IRP
		BCF		FSR,7	;bank 0 for FSR;INDF

	 	MOVF     CNT,W             ;загружаем значение счетчика в рабочий регистр
		call	bin_to_dec
		MOVWF    INDF              ;сохраняем очередной отсчет в косвенно адресуемый POH 
     		INCF     FSR,F             ;увеличение адреса POH
		incf		CNT,f
		btfsc	FSR,7	;value 0x8x после 0b01111111 следует 0b100000000 a там не пишем
		goto	done
		goto	next
 
 
;by: Scott Dattalo 
bin_to_dec:	
        SWAPF   CNT, W      ; swap the nibbles
        ADDWF   CNT, W      ; so we can add the upper to the lower
        ANDLW   B'00001111' ; lose the upper nibble (W is in BCD from now on)
        BTFSC STATUS, DC              ; if we carried a one (upper + lower > 16)
         ADDLW  0x16        ; add 16 (the place value) (1s + 16 * 10s)
        BTFSC STATUS, DC               ; did that cause a carry from the 1's place?
         ADDLW  0x06        ; if so, add the missing 6 (carry is only worth 10)
        ADDLW   0x06        ; fix max digit value by adding 6
        BTFSS STATUS, DC               ; if was greater than 9, DC will be set
         ADDLW  -0x06       ; if if it wasn't, get rid of that extra 6
        
        BTFSC   CNT,4       ; 16's place
         ADDLW  0x16 - 1 + 0x6  ; add 16 - 1 and check for digit carry
	BTFSS STATUS, DC
         ADDLW  -0x06       ; if nothing carried, get rid of that 6
        
        BTFSC   CNT, 5      ; 32nd's place
        ADDLW  0x30        ; add 32 - 2
        
        BTFSC   CNT, 6      ; 64th's place
         ADDLW  0x60        ; add 64 - 4
        
;        BTFSC   FSR, 7      ; 128th's place
;         ADDLW  0x20        ; add 128 - 8 % 100
        
        RETURN              ; all done!

done
	nop
 	end
Изображение
Ответить

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