odejmowanie w montażu kod pic16f628a

C

ceibawx

Guest
odejmowanie w montażu kod pic16f628a

I trzeba odjąć trzy razy w montażu kod pic16f628a.Napisałem głupi kod jest zbyt długi.Ja i zastanawiasz się, czy mogę użyć pętli to zrobić.

1) dane są zapisywane w 0x40 ~ 0x51.The danych z 8channels, każdy kanał jest 12bits.więc dwa kanały zajmują trzy bajty w pamięci.np. kanału 1 i kanału 2 zajmują 0x40, 0x41, 0x42.
2) kanał 2 - kanał 8;
kanał 4 - kanał 6;
kanał 3 - kanał 7;
I wybrać tę grupę, ponieważ myślę channel2 ma taką samą strukturę channel8.łatwiej jest odejmować niż channel2-channel3.
3) przed odejmowanie, ANDLW jest używany do dostać cztery bity z bajtu rejestru.
4) pierwszy odjąć niższe bity,
a następnie odjąć wyższe bity według oceny wartości Stan C niższych bitów.
5) niższe bity są przechowywane w pamięci najpierw zarejestrować,
a następnie wysokich bitów są przechowywane w pamięci ostatnie miejsce.Na przykład, jeden wynik odejmowania, wyższe bitów jest przechowywanych w 0x60, natomiast niższe bity są przechowywane w 0x61.
więc wynik odejmowania są przechowywane w 0x60 0x61 0x62 0x63 0x64 0x65.Ktoś może mi pomóc?Kod:
Kod:

Lista P = 16f628a

# include <p16f628a.inc>ByteCounter EQU 0x39Główne gotoGłówne:

BCF STATUS, RP0; banku 0

BCF STATUS, rp1

MOVLW 0x07

MOVWF CMCONBSF STATUS, RP0; banku 1

BCF TRISB, 2; wyjście

; UART ustawienie

MOVLW 0x15

MOVWF SPBRGBCF TXSTA, TX9

BSF TXSTA, TXEN

BCF TXSTA, SYNC

BSF TXSTA, BRGHBCF STATUS, RP0; banku 0

BSF RCSTA, SPEN

BCF RCSTA, RX9

BSF RCSTA, CRENZapisz:

, f> w

MOVLW 0x31

MOVWF 0x40

MOVLW 0x32

MOVWF 0x41, 0x50 dla diff

MOVLW 0x33

MOVWF 0x42MOVLW 0x34

MOVWF 0x43, 0x51 dla diff

MOVLW 0x48

MOVWF 0x44

MOVLW 0x47

MOVWF 0x45, 0x52 dla diffMOVLW 0x46

MOVWF 0x46

MOVLW 0x45

MOVWF 0x47, 0x53 dla diff

MOVLW 0x44

MOVWF 0x48MOVLW 0x43

MOVWF 0x49

MOVLW 0x42

MOVWF 0x50

MOVLW 0x41

MOVWF 0x51
;******* Odejmowanie *************

BCF STATUS, RP0; bank0

;********** pierwszy odejmowanie *************

Ch2_8:

;**** uzyskać 5-8bits z 0x41 0x50 ******

MOVLW 0x0F

ANDWF 0x41, 0

MOVWF 0x6A, 0x41 "adres

MOVLW 0x0F

ANDWF 0x50, 0

MOVWF 0x6B, 0x50 "adres

;*******( 0x42) - (0x51) zapisać do 0x61 ******

BCF STATUS, C

MOVF 0x51, 0

SUBWF 0x42, 0

MOVWF 0x61;

;******* odejmowanie według wartości C *****

BTFSS Stan C

GOTO Ch28_value0, C = 0

BCF STATUS, C, C = 1

(0x6A) - (0x6B) do 0x60

MOVF 0x6B, 0

SUBWF 0x6A, 0

MOVWF 0x60;

goto Ch4_6Ch28_value0:; C = 0, (0x6A) -1 - (0x6B) do 0x60

BCF STATUS, C

MOVF 0x6B, 0

SUBWF 0x6A, 0

MOVWF 0x60;

; -1 Sprawdzić C?

MOVLW 0x01;

SUBWF 0x60, 1

goto Ch4_6

;********* drugi *****************************

Ch4_6:

MOVLW 0x0F

ANDWF 0x44, 0

MOVWF 0x6C, 0x44 "adres

MOVLW 0x0F

ANDWF 0x47, 0

MOVWF 0x6D, 0x47 "adres

(0x45) - (0x48) do 0x63

BCF STATUS, C

MOVF 0x48, 0

SUBWF 0x45, 0

MOVWF 0x63;BTFSS Stan C

GOTO Ch46_value0, C = 0

BCF STATUS, C, C = 1

(0x6C) - (0x6D) do 0x62

MOVF 0x6D, 0

SUBWF 0x6C, 0

MOVWF 0x62;

goto Ch3_7Ch46_value0:; C = 0, (0x6C) -1 - (0x6D) do 0x63

BCF STATUS, C

MOVF 0x6D, 0

SUBWF 0x6C, 0

MOVWF 0x62;

; -1 Sprawdzić C? C ??,??????

MOVLW 0x01;

SUBWF 0x62, 1

goto Ch3_7

;************* trzeciego *******************************

Ch3_7:

movlw 0xF0;

andwf 0x44, 0

movwf 0x6E; 44''w 6E

movlw 0xF0;

andwf 0x50, 0

movwf 0x6F, 50''w 6F

;***** odejmowanie ************

BCF STATUS, C; (6E) - (6F) do (65)

MOVF 0x6F, 0

SUBWF 0x6E, 0

MOVWF 0x65;btfss Stan C

GOTO Ch37_value0, C = 0

, C = 1 (43) - (49) do (64)

BCF STATUS, C

movf 0x49, 0

subwf 0x43, 0

movwf 0x64;

Przystanek gotoCh37_value0:; C = 0 (43) -1 - (49) do (64)

BCF STATUS, C

movf 0x49, 0

subwf 0x43, 0

movwf 0x64;

; -1

movlw 0x01;

subwf 0x64, 1; 60 61 62 63 64 65

Przystanek GOTO

Przystanek:

Przystanek GOTOKONIEC
 
można korzystać z tego kodu do odejmowania dwóch liczb 16-bitowy

;************************************************* ***********************
; Odejmowanie: ACCb (16 bity) - ACCA (16 bity) -> ACCb (16 bity) *
(A) 1 Załaduj operandu lokalizacji ACCaLO & ACCaHI (16 bity) *
(B) Załaduj 2 operandu lokalizacji ACCbLO & ACCbHI (16 bity) *
(C)
Call Sub_16bit *
(D) W rezultacie w miejscu ACCbLO
i ACCbHI (16 bity) *
;************************************************* ***********************
Sub_16bit
połączenia Neg_16bit
połączenia Add_16bit
powrót

;************************************************* ***********************
; Dodatek: ACCb (16 bity) ACCA (16 bity) -> ACCb (16 bity) *
(A) 1 Załaduj operandu lokalizacji ACCaLO & ACCaHI (16 bity) *
(B) Załaduj 2 operandu lokalizacji ACCbLO & ACCbHI (16 bity) *
(C)
Call Add_16bit *
(D) W rezultacie w miejscu ACCbLO
i ACCbHI (16 bity) *
;************************************************* ***********************
Add_16bit
movf ACCaLO, W
addwf ACCbLO, F; dodać LSB
btfsc STATUS, C; dodać przeprowadzenia
incf ACCbHI, K
movf ACCaHI, W
addwf ACCbHI, F; dodać msb
powrót
;************************************************* ***********************
; 2's komplement: negowaniem ACCA (-ACCA -> ACCA) *
(A) Załaduj operandu lokalizacji ACCaLO & ACCaHI (16 bity) *
(B) ZAPROSZENIE Neg_16bit *
(C) W rezultacie w miejscu ACCaLO
i ACCaHI (16 bity) *
;************************************************* ***********************
Neg_16bit
comf ACCaLO, F;
incf ACCaLO, K
Stan btfsc, Z
decf ACCaHI, K
comf ACCaHI, K
powrót

 

Welcome to EDABoard.com

Sponsor

Back
Top