PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 11-06-2010, 06:52 PM   #1
CTQ_2008
Nhập môn đệ tử
 
Tham gia ngày: Jan 2009
Bài gửi: 1
:
Xin giúp dùm Hàm Nhân Chia trong ASM

Tôi muốn chia một số 125 ra ba số 1, 2, 5, để hiển thị ra LCD nhưng không biết phải làm sau.
Nếu dùng kthuật so sánh rồi tra bảng thì dài quá, vì tôi muốn hiển thị bất kỳ một số nào từ 0 đến 255 ra LCD, xin mọi người giúp dùm
Thanks !
CTQ_2008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2010, 06:04 PM   #2
thundernhut
Đệ tử 2 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 33
:
cái này dễ ẹt
Số ban đầu là A giá trị từ 0 - 255.
Bước 1 : (A : 10) = B dư C
cộng C với 30H để có mã ASCII tương ứng của nó. rồi gửi ra LCD => chữ số hàng đơn vị
Bước 2 : (B : 10) = D dư E
cộng E với 30H để có mã ASCII tương ứng của nó. rồi gửi ra LCD => chữ số hàng chục
Bước 3 : (B : 10) = 0 dư G
cộng G với 30H để có mã ASCII tương ứng của nó. rồi gửi ra LCD => chữ số hàng trăm

Hàm chia như sau (hàm này không làm việc với số âm được nha). Khi dùng phải nạp số bị chia và số chia. Nhớ rằng : (Số bị chia / số chia) = thương và số dư
HAMCHIA:
;------------------ghi chu--------------------------------------------
; HAM CHIA 8 BIT
; HAM CHIA DUNG 2 BIEN VAO SOBICHIA VA SOCHIA
; 2 BIEN RA LA SODU VA THUONG
; TRUOC KHI GOI HAM NAY PHAI NAP :
; SO BI CHIA VAO BIEN SOBICHIA
; SO CHIA VAO BIEN SOCHIA
;-------------------------------------------------------------------------
;KIEMTRALOICHIACHOSO"0"
CLRF WREG;----------------------WREG = 0
CPFSEQ SOCHIA;-----------------NEU SOCHIA LA "0" THI KHONG CHIA MA THOAT LUON
GOTO BEGINHC;------------------THUC HIEN HAM CHIA NEU KHAC "0"
RETURN;-------------------------THOAT NEU SOCHIA LA 0
;-------------------------------------------------------------------------
BEGINHC:
CLRF SODU
CLRF THUONG
MOVFF SOCHIA, WREG;----------- LUU SO CHIA VAO WREG DE SO SANH
CPFSLT SOBICHIA;--------------- SOBICHIA < SOCHIA ?
GOTO CHIA;---------------------- NEU LON HON THI THUC HIEN CHIA
;--------------------------------- NEU NHO HON THI KHONG THUC HIEN CHIA
GANSODU:
MOVFF SOBICHIA, SODU;---------- NEU NHO HON THI SO DU LA SO BI CHIA
;---------------------------------- THUONG SO VAN LA 0
RETURN;-------------------------- THOAT

;--------------------------------------------------------------------------------------
CHIA:
SUBWF SOBICHIA,1;-------------- SOBICHIA = SOBICHIA - SOCHIA ; VI WREG = SOCHIA
INCF THUONG;------------------- TANG THUONG SO LEN
CPFSLT SOBICHIA;---------------- SOBICHIA < SOCHIA ?
GOTO CHIA;----------------------NEU VAN LON HON HAY BANG SOCHIA THI CHIA TIEP
MOVFF SOBICHIA, SODU ;--------- NEU NHO HON GAN SOBICHIA CHO SODU
;---------------------------------THUONG SO DA CO DO TA TANG LEN MOI LAN TRU
RETURN;--------------------------THOAT

thay đổi nội dung bởi: thundernhut, 30-06-2010 lúc 06:22 PM.
thundernhut vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2010, 11:01 PM   #3
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
hi đúng cái mình cần, mình cũng đang gặp trở ngại việc đếm 1 bộ counter rùi xuất ra led, ô nhớ từ 0 đến 255, trước làm bên 89 thì cứ DIV AB còn qua Pic ko hỗ trợ hàm nhân chia nên đang bí lù :P
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2010, 11:34 PM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi CTQ_2008 View Post
Tôi muốn chia một số 125 ra ba số 1, 2, 5, để hiển thị ra LCD nhưng không biết phải làm sau.
Nếu dùng kthuật so sánh rồi tra bảng thì dài quá, vì tôi muốn hiển thị bất kỳ một số nào từ 0 đến 255 ra LCD, xin mọi người giúp dùm
Thanks !
Thực ra việc bạn muốn thực hiện được gọi là chuyển đổi số nhị phân thành chuỗi ký tự ASCII. Trên piclist có nhiều đoạn code hợp ngữ mẫu cho việc này:
http://www.piclist.com/techref/micro...adix/index.htm

Phần mà bạn cần nằm ở khu vực "binary to ASCII", "8bit to Decimal ASCII 3 digits". Không nhất thiết phải dùng hàm nhân chia ở đây.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2010, 07:56 PM   #5
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
pó tay, mớ code trên xài cho con 18F, mình xài 16F không có lệnh so sánh, không biết sao nữa, hix hix

thay đổi nội dung bởi: unisa, 02-09-2010 lúc 08:23 PM.
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2010, 08:05 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi unisa View Post
pó tay, mớ code trên không biết viết bằng ASM hay bằng jì nữa, lệnh gì mà
MOVFF ... MPLAP dịch ngu người luôn, mà mình cũng không thấy mấy cái lệnh trong datasheet nữa
MOVFF có trong tập lệnh của PIC18.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2010, 10:19 PM   #7
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
Trích:
Nguyên văn bởi namqn View Post
MOVFF có trong tập lệnh của PIC18.

Thân,
Hèn chi em thấy nghi nghi, mới down datasheet của con 18F2550 về xem thử thấy có nhiều lệnh lạ ghê, tại em đang nghiên cứu con 16F nên chưa ngó ngàng gì mấy chú 18F
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2010, 11:12 PM   #8
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
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
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2012, 10:34 PM   #9
I_LOVE_IWIN
Nhập môn đệ tử
 
Tham gia ngày: Apr 2012
Bài gửi: 5
:
Chao
xin hãy chỉ cho mình biết làm cách nào để cộng, trừ, nhân, chia các số lớn hơn 8 bit. Vì mình cần cái đó để tính toán độ ẩm và nhiệt độ của IC SHT10.
I_LOVE_IWIN vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2012, 11:20 PM   #10
kidmaster08
Đệ tử 2 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 41
:
hình như C= 1 là kết quả phép trừ âm hay sao chứ bạn,ví dụ như 3-5 sẽ tác động lên msb mà. code của unisa viết đúng ý mình thế không biết
kidmaster08 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-01-2013, 02:07 AM   #11
thanhvien999
Nhập môn đệ tử
 
Tham gia ngày: Jul 2010
Bài gửi: 2
:
đúng thứ mình đang cần. Cám ơn các sư huynh rất nhiều :d
thanhvien999 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:20 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam