hehe, sau một hồi ngồi lọ mọ tìm giải thuật 1 byte Hex sang 3 số BCD không có hoặc có mà đọc không hiểu gì ??? mình đã tự code ngon lành, share lên cho mọi người dùng chung và bug giúp mình, đã test tốt bằng proteus để chế độ xem
PIC CPU memory Data để xem kết quả đạt được trong các ô nhớ, kết quả rất tốt
Code:
SOCHIA EQU 21H
SOBICHIA EQU 22H
SOBICHIA1 EQU 23H
KQ_TAM EQU 24H
H_TRAM EQU 25H
H_CHUC EQU 26H
H_DV EQU 27H
MAIN
MOVLW 0x0AB
MOVWF SOCHIA
CALL HEX2BCD
GOTO $
HEX2BCD
BCF STATUS,C
MOVLW .100
MOVWF SOBICHIA
MOVLW .10
MOVWF SOBICHIA1
CLRF H_TRAM
CLRF H_CHUC
CLRF H_DV
;------ CHIA LAY HANG TRAM -----------------------
CHIA1
MOVF SOCHIA,W
MOVWF KQ_TAM
MOVF SOBICHIA,W
SUBWF SOCHIA,F
BTFSC STATUS,C
GOTO BD_CHIA1
GOTO CHIA2
BD_CHIA1
INCF H_TRAM,F
GOTO CHIA1
;------- CHIA LAY HANG CHUC & HANG DON VI --------
CHIA2
MOVF KQ_TAM,W
MOVWF H_DV
MOVF SOBICHIA1,W
SUBWF KQ_TAM,F
BTFSC STATUS,C
GOTO BD_CHIA2
RETURN
BD_CHIA2
INCF H_CHUC,F
GOTO CHIA2
Hướng dẫn sử dụng:
- Nạp giá trị hex cần đổi sang BCD vào biến SOCHIA
- Kết quả sau khi chuyển đổi được lưu vào 3 biến H_TRAM, H_CHUC, H_DV từ đó bạn có thể xuất ra Led 7 đoạn ...
Giải thuật
- PIC không có hàm nhân/chia nên ta sẽ làm phép chia 100, chia 10 từ phép trừ (như hùi học mẫu giáo hay cấp 1 í
)
++ giả sử có số chia = 23, số bị chia = 10
- lấy số chia - số bị chia = 23 - 10 = 13, lấy kq gán vào số chia
- thương ban đầu = 0
- thương = thương + 1 = 1
- kiểm tra cờ C trong status, nếu cờ C = 1 thì phép trừ có kết quả dương => tiếp tục lặp lại phép trừ: 13 - 10 = 3
- thương = 1 + 1 = 2
- kiểm tra cờ C, vẫn = 1 do kết quả trừ là dương 3
- tiếp tục trừ, 03 - 10 = F3 (-7), đây là kết quả âm, cờ C = 0 => dừng phép trừ, gán số 3 trước đó vào hàng đơn vị
====> vậy ta có hàng chục = 2, hàng đơn vị = 3
Giải thuật hơi dài nhưng dễ hiểu