Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Сб ноя 09, 2019 15:06:09

Здравствуйте, Задание такое: "Заполнить РОН банка №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 KiB) Скачиваний: 318

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

Пн ноя 11, 2019 14:42:51

А если просто взять два регистра считающих от 0 до 9.
Переполнение первого дает инкремент второго, затем смещаем
старшую тетраду, собираем по "ИЛИ" и запихиваем в нужное место.
Второй способ - табличка с retlw....
8)

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

Ср ноя 13, 2019 19:00:30

А можно и так
Код:
    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


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