View Single Post
Old 23-12-2007, 12:09 AM   #4
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Đuối lắm rồi!!!!

Mới thử con PIC khác của thằng bạn, vần không được. Đoạn chương trình của mình như sau :
1. Quét phím (không dùng ngắt), 12 phím 4 chân (10 phím số 0 đến 9, 1 phím cho động cơ chạy xuôi, 1 phím cho động cơ chạy ngượac) được nối trực tiếp với với PORTD. Phải nhập đủ 4 chữ số tương ứng tốc độ đặt của động cơ thì mới làm việc khác tiếp được, nếu chưa nhập đủ 4 số mà nhấn nhầm sang 2 phím chiều quay của động cơ thì vẫn ko sao, nhập lại tốc độ bình thường.
2. Sau khi nhập đủ 4 chứ số tốc độ đặt, bạn phải bắt buộc nhấn phím QUAY NGƯỢC hoặc QUAY XUÔI. Nhấn một trong 2 phím đó, chương trình sẽ chuyển tới đoạn phục vụ cho việc quay ngược, quay xuôi.
2 bước trên mình đã thực hiện xong, chạy rất tốt. Tuy nhiên bước tiếp theo thì đang "rất kẹt" cái vụ ngắt Timer1. Mình muốn dùng timer1 định thời gian 1ms rồi nhảy vào trình phục vụ ngắt rồi đọc xung encorder từ timer0 để tìm tốc độ đo. Làm riêng chương trình đọc xung vào timer0 thì OK. Nhưng khi dùng ngắt timer1 định thời 1ms thì ko được. Nó chỉ chạy vào trình phục vụ ngắt có 1 lần, sau đó không vào nữa cho dù trong chương trình ngắt timer1 đã bật timer1 chạy lại. Mình đã thử mọi cách vẫn ko xong.
Không biết làm sao nữa. Nhờ mọi người giúp.
Lẽ ra mình ko muốn post đoạn code lên lúc này vì còn rất....lung tung. Mình chú thích, chỉnh sửa lung tung trên đó, để khi nào xong, làm cho nó đàng hoàng rồi post lên luôn để người học sau có cái tham khảo. Nhưng bây giờ đành thua rồi. Post lên luôn, các đoạn code sau dấu ; là những gì mình viết thêm để thử trong quá trình tìm chổ sai, chứ ko có ý nghĩa gì. (đoạn chương trình trong ngắt chỉ để tìm chổ sai).
Mình sử dụng L293 làm driver cho động cơ ( dùng PortC tác động các chân của L293). IC7447 để chuyển từ mã BCD sang mã led 7 đoạn.
Code:
;CHUONG TRINH DIEU KHIEN ON_OFF DONG CO DC
;SINH VIEN THUC HIEN : NGUYEN UY DANH
;===================================================================================================
;KHAI BAO VI DIEU KHIEN;
;===================================================================================================
	processor	16f877a						;vi dieu khien duoc su dung la PIC16F877A cua Microchip
	include		<p16f877a.inc>				;header file kem theo
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;===================================================================================================
;KHOI TAO CAC BIEN
;===================================================================================================
;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH DELAY
	count1		EQU 0x20		
	counta		EQU 0x21		
	countb		EQU 0x22
;===================================================================================================
;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH QUET PHIM VA NHAN BIET PHIM
	cols		EQU 0x23
	key			EQU 0x24			;bien key chua ma ASCII cua phim duoc nhan
;===================================================================================================
;NHOM CAC THANH GHI HIEN THI LEN 4 LED 7 DOAN TOC DO DAT
	dem 		EQU 0x25			
	hangngan	EQU 0x26
	hangtram	EQU 0x27
	hangchuc	EQU 0x28
	hangdonvi	EQU 0x29
;===================================================================================================
;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT
	W_save		EQU	0x2A
	PCLATH_save	EQU	0x2B
	STATUS_save	EQU	0x2C
	FSR_save	EQU	0x2D
	demtimer1	EQU	0x2E
	TMR0_save	EQU	0x2F
	highbyte	EQU	0x30
	lowbyte		EQU	0x31
	h_byte_save	EQU	0X32
	l_byte_save	EQU	0x33
;===================================================================================================
;NHOM CAC THANH GHI DUNG TRONG CHUONG TRINH DOI TU HEX SANG BCD
	aar0		EQU	0x34			;binary number low byte
	aar1		EQU	0x35			;binary number high byte
	aac0		EQU	0x36			;bcd number ones
	aac1 		EQU	0x37			;bcd number tens
	aac2 		EQU	0x38			;bcd number hundreds
	aac3 		EQU	0x39			;bcd number thousands
	aac4		EQU	0x3A			;bcd number ten-thousands
;===================================================================================================
	
;===================================================================================================
;CHUONG TRINH NGAT
;===================================================================================================
	ORG			0x004
	GOTO		ISR
ISR
;---------------------------------------------------------------------------------------------------
;CHUONG TRINH BAT BUOC DAU CHUONG TRINH NGAT
;---------------------------------------------------------------------------------------------------
	MOVWF		W_save
	SWAPF		STATUS_save,W
	CLRF		STATUS
	MOVWF		STATUS_save
	MOVF		PCLATH,W
	MOVWF		PCLATH_save
	CLRF		PCLATH
	MOVF		FSR,W
	MOVWF		FSR_save
;---------------------------------------------------------------------------------------------------
;NOI DUNG CHUONG TRINH NGAT
;---------------------------------------------------------------------------------------------------
	BTFSS	PIR1,TMR1IF
	GOTO	exit_int
	BCF		T1CON,TMR1ON

	CLRF	TMR1L
	CLRF	TMR1H
	MOVLW	0X27
	MOVWF	TMR1H
	MOVLW	0X10
	MOVWF	TMR1L

	BSF		T1CON,TMR1ON
	BCF		PIR1,TMR1IF

;	MOVF	TMR0,W
;	MOVWF	lowbyte
;	CLRF	highbyte

	DECFSZ	demtimer1,1
	GOTO	tiep1
	GOTO	tiep2
;	MOVF	TMR0,W
;	MOVWF	lowbyte
;	CLRF	highbyte
tiep1:
	MOVLW	B'11000110'
	MOVWF	PORTB
;	MOVLW	D'20'
;	MOVWF	demtimer1
	GOTO	exit_int
tiep2:
	MOVLW	B'00000000'
	MOVWF	PORTB
exit_int
	MOVF		FSR_save,W
	MOVWF		FSR
	MOVF		PCLATH_save
	MOVWF		PCLATH
	SWAPF		STATUS_save,W
	MOVWF		STATUS
	SWAPF		W_save,1
	SWAPF		W_save,0

	BSF		T1CON,TMR1ON
	BCF		PIR1,TMR1IF
	RETFIE
;=================================================================================================	
	ORG			0x0000
	GOTO		start
	ORG			0x050
start
	BCF 		STATUS,RP1			;chon Bank1 co chua thanh ghi TRISD
	BSF 		STATUS,RP0			;thiet lap 4 bit cao cua PORTD la output tuong ung voi cols
	MOVLW 		0x0F				;thiet lap 4 bit thap cua PORTD la input tuong ung voi rows
	MOVWF 		TRISD				;TRISD=00001111B
	
	MOVLW		0x00
	MOVWF		TRISB				;thiet lap chan cua PORTB la port output

	MOVLW 		b'00000000'				;thiet lap chan cua PORTC la port output
	MOVWF		TRISC

	MOVLW		0xFF				;thiet lap chan cua portA la port input
	MOVWF		TRISA

	BCF 		STATUS,RP0			;chon Bank0

;===================================================================================================
;BAN DAU CHO TAT CA CAC LED HIEN THI 0 HET
;===================================================================================================
	MOVLW		b'00000000'
	MOVWF		PORTC
	MOVLW		b'00000000'
	MOVWF		PORTB
	MOVLW		b'00100000'
	MOVWF		PORTB
	MOVLW		b'01000000'
	MOVWF		PORTB
	MOVLW		b'01100000'
	MOVWF		PORTB
	MOVLW		b'10000000'
	MOVWF		PORTB	
	MOVLW		b'10100000'
	MOVWF		PORTB
	MOVLW		b'11000000'
	MOVWF		PORTB
	MOVLW		b'11100000'
	MOVWF		PORTB
;==================================================================================================
;KHOI TAO TIMER1
;==================================================================================================
	CLRF	T1CON
	CLRF	INTCON
	CLRF	TMR1H
	CLRF	TMR1L
	BSF		STATUS,RP0
	CLRF	PIE1
	BSF		PIE1,TMR1IE
	BCF		STATUS,RP0
	CLRF	PIR1
	MOVLW	0X00
	MOVWF	T1CON
	MOVLW	0X27
	MOVWF	TMR1H
	MOVLW	0X10
	MOVWF	TMR1L
;================================================================================================
;KHOI TAO CAC BIEN
;=================================================================================================
	CLRF		dem					;xoa bien dem ve 0
	CLRF		highbyte
	CLRF		lowbyte
	CLRF		h_byte_save
	CLRF		l_byte_save
	CLRF		aar0
	CLRF		aar1
	CLRF		aac0
	CLRF		aac1
	CLRF		aac2
	CLRF		aac3
	CLRF		aac4
	MOVLW		D'20'
	MOVWF		demtimer1
;===================================================================================================
;BAT DAU CHUONG TRINH CHINH
;===================================================================================================
Mainpro						
	CALL 		Chk_keys			;goi chuong trinh quet phim va nhan biet phim
	MOVF 		key,W					
	GOTO	    Xuatled
Chk_keys							;chuong trinh CON quet phim
;===================================================================================================
;DOAN CHUONG TRINH KIEM TRA CO BI KET PHIM TRUOC KHI NHAN PHIM HAY KHONG
;DOAN CHUONG TRINH NAY CHAY NGAY KHI KHOI DONG CHUONG TRINH
;===================================================================================================
	MOVLW 		0x00				;trang thai ban dau cua cac port cols la 0
	MOVWF 		PORTD				;trang thai ban dau cua cac port rows la muc 1
	CALL 		delay20				;goi chuong trinh delay20ms
	MOVF 		PORTD,W				;lay trang thai hien tai cua PORTD dua vao thanh ghi W				
	ANDLW 		0x0F				;thuc hien phep AND thanh ghi W voi 0FH
	SUBLW 		0x0F				;thuc hien phep TRU voi gia tri thiet lap ban dau cho PORTD la OFH
	BTFSC 		STATUS,Z			;neu gia tri hien tai cua PORTD van khong doi so voi thiet lap ban dau
	GOTO 		Keys				;nghia la khong bi ket phim, co Z=1 thi nhay toi keys la chuong trinh con bat phim nhan
	CALL 		delay20				;con neu Z=0 nghia la bi ket phim thi dalay20 de nguoi dung xu ly viec ket phim nay
	GOTO 		Chk_keys
;====================================================================================================
;DOAN CHUONG TRINH CON BAT PHIM NHAN
;====================================================================================================
Keys
	CALL 		Scan_keys			;goi chuong trinh Scan_keys xem thu co phim nao nhan khong
	MOVLW 		d'12'				;nap vao W gia tri 12
	SUBWF 		key,0				;lay gia tri trong key tra ve tru cho 12
	BTFSS 		STATUS,Z			;truong hop khong co phim nhan thi key=12,delay 20ms va quay lai scan de phat hien 
	GOTO 		Key_found			;truong hop key<12 nghi la co nhan phim thi di vao chuong trinh con nhan dang phim
	CALL 		delay20
	GOTO 		Keys
Key_found
	MOVF 		key,0				;lay lai gia tri key luu vao W
	ANDLW 		0x0F				;chi nham loai bi 4 bit cao khong co y nghi gi trong key(mac dinh co the ton tai)
	CALL 		Key_table			;goi chuong trinh tra bang gia tri
	MOVWF 		key					;luu lai gia tri bang vao bien key
	RETURN
Scan_keys
	CLRF 		key					;xoa gia tri trong key ve 0, chuan bi chua ma cua phim duoc nhan
	MOVLW 		0x70				;thiet lap cho tat ca cac cols deu len 1
	MOVWF 		PORTD				;cac rows thi luon luon la 1

	MOVLW 		0x03					
	MOVWF 		cols				;thiet lap gia tri bien cols
	
	BSF 		STATUS,C			;set co C len 1 trong thanh ghi Status, chuan bi shift vao PORTD
Scan
	RRF 		PORTD,1				;dich PORTD tung buoc kem theo co C
	BTFSS		PORTD,3				;neu bit thu 3 cua PORTD bang 0 nghi la phim noi giua hang 3 va cot 3 nhan
	GOTO 		press				;ung voi phim REVERSE, tro lai chuong trinh Keys de nhan biet phim
	INCF 		key,1				;neu sai thi tang key len 1
	BTFSS 		PORTD,2				;neu bit thu 2 cua PORTD bang 0 nghi la phim noi giua hang 2 va cot 3 duoc nhan
	GOTO 		press				;ung voi phim so 8, tro lai chuong trinh keys de nhan biet phim
	INCF		key,1
	BTFSS		PORTD,1
	GOTO 		press
	INCF 		key,1
	BTFSS 		PORTD,0
	GOTO 		press
	INCF 		key,1
	DECFSZ		cols,1				;giam rows, neu bang khac 0 thi scan tiep, bang 0 thi tro ve
	GOTO		Scan
press 
	RETURN							;tro ve chuong trinh scan phim
;=======================================================================================================
;BANG TRA Key_Table
;=======================================================================================================
Key_table
	ADDWF 		PCL,1
	RETLW 		d'11'				;key=0 ung voi phim REVERSE co ma la 11D
	RETLW 		0x08				;key=1 ung voi phim so 8 co ma la 08H
	RETLW 		0x05				;key=2 ung voi phim so 5
	RETLW 		0x02				;key=3 ung voi phim so 2
	RETLW 		d'10'				;key=4 ung voi phim FORWARD co ma la 10D
	RETLW 		0x07				;key=5 ung voi phim so 7
	RETLW		0x04				;key=6 ung voi phim so 4
	RETLW 		0x01				;key=7 ung voi phim so 1
	RETLW 		0x09				;key=8 ung voi phim so 9
	RETLW 		0x06				;key=9 ung voi phim so 6
	RETLW 		0x03				;key=10 ung voi phim so 3
	RETLW 		0x00				;key=11 ung voi phim so 0
;======================================================================================================
;CHUONG TRINH HIEN THI RA LED GIA TRI LUU TRONG BIEN key SAU KHI SCAN PHIM
;CO SU DUNG BIEN dem DE THEO DOI SO LAN NHAN PHIM
;======================================================================================================
Xuatled
	INCF 		dem					;cu moi lan bat duoc 1 phim thi tang bien dem len 1
	
	MOVLW		d'1'
	XORWF		dem,W				;so sanh gia tri luu trong bien dem va 1
	BTFSC		STATUS,Z			;neu dem=1 thi nhay den chuong trinh xu ly phim nhan thu 1
	GOTO 		dem1				;neu dem#1 thi kiem tra tiep theo
	
	MOVLW		d'2'
	XORWF		dem,W				;so sanh gia tri luu trong bien dem va 2	
	BTFSC		STATUS,Z			;neu dem=2 thi nhay den chuong trinh xu ly phim nhan thu 2
	GOTO		dem2				;neu dem#2 thi kiem tra tiep theo

	MOVLW		d'3'
	XORWF		dem,W				;so sanh gia tri luu trong bien dem va 3	
	BTFSC		STATUS,Z			;neu dem=3 thi nhay den chuong trinh xu ly phim nhan thu 3
	GOTO		dem3				;neu dem#2 thi kiem tra tiep theo	

	MOVLW		d'4'
	XORWF		dem,W				;so sanh gia tri luu trong bien dem va 4	
	BTFSC		STATUS,Z			;neu dem=4 thi nhay den chuong trinh xu ly phim nhan thu 4
	GOTO		dem4				;neu dem#4 thi kiem tra tiep theo
	
;sau 4 lan nhan phim, da nhan du 4 so de cai dat toc do, nhan phim so 5 bat buoc la phim FORWARD or REVERSE
	MOVLW		d'10'
	XORWF		key,W				;so sanh ma phim trong key co phai la phim FORWARD khong?
	BTFSC		STATUS,Z			;neu dung la phim FORWARD thi Z=1 
	GOTO		FORWARD				;se nhay den chuong trinh FORWARD
	
	MOVLW		d'11'				;neu khong la FORWARD
	XORWF		key,W				;thi so sanh ma phim trong key co phai la phim REVERSE khong?
	BTFSC		STATUS,Z			;neu dung la phim REVERSE THI Z=1
	GOTO		REVERSE				;se nhay den chuong trinh REVERSE
	
	DECF		dem,1				;neu khong la FORWARD or REVERSE thi giam xuong dem=4
	GOTO		Mainpro				;nguoi dung phai nhan dung phim moi tiep tuc duoc

;cac chuong trinh xu ly cac phim nhan dem1 dem2 dem3 va dem4

dem1								;dem1 la doan chuong trinh xuat led va save gia tri hang ngan cua toc do dat
	CALL		nhannhamphim?		;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
									;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?

	MOVF		key,W				;neu nhan dung phim thi bat dau xu ly
	MOVWF		hangngan			;luu gia tri do vao bien hangngan
	
	MOVLW		b'00000000'
	CALL		xuatraled7doan_toc_do_dat
	GOTO		Mainpro		
dem2
	CALL		nhannhamphim?		;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
									;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
	MOVF		key,W				;neu nhan dung phim thi bat dau xu ly
	MOVWF		hangtram			;luu gia tri do vao bien hangtram

	MOVLW		b'00100000'
	CALL		xuatraled7doan_toc_do_dat
	GOTO		Mainpro
dem3
	CALL		nhannhamphim?		;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
									;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
	MOVF		key,W				;neu nhan dung phim thi bat dau xu ly
	MOVWF		hangchuc			;luu gia tri do vao bien hangchuc

	MOVLW		b'01000000'
	CALL		xuatraled7doan_toc_do_dat
	GOTO		Mainpro
dem4
	CALL		nhannhamphim?		;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
									;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
	MOVF		key,W				;neu nhan dung phim thi bat dau xu ly
	MOVWF		hangchuc			;luu gia tri do vao bien hangchuc

	MOVLW		b'01100000'
	CALL		xuatraled7doan_toc_do_dat
	GOTO		Mainpro	
;----------------------------------------------------------------------------------------------------------
;CAC CHUONG TRINH CON CUA CHUONG TRINH xuatled
xuatraled7doan_toc_do_dat

	BCF			STATUS,C			;xoa co C cua thanh ghi STATUS
	ADDWF		key,W				;cong voi gia tri trong W, luu lai vao trong thanh ghi W
	MOVWF		PORTB				;chuyen ra PORTB,thuc hien duoc viec xuat hangngan ra led 7 doan
	RETURN
nhannhamphim?
	MOVLW		d'10'
	XORWF		key,W				;kiem tra thu co phai la nhan nham FORWARD khong?
	BTFSC		STATUS,Z			;neu nhan nham FORWARD thi phai NHANPHIMLAI		
	GOTO		nhanphimlai
	
	MOVLW		d'11'				;kiem tra thu co phai nhan nham REVERSE khong?
	XORWF		key,W
	BTFSC		STATUS,Z
	GOTO		nhanphimlai			;neu nhan nham REVERSE thi phai NHANPHIMLAI
	
	RETURN
;------------------------------------------------------------------------------------------------------------	
nhanphimlai
	DECF		dem,1
	GOTO		Mainpro

;============================================================================================================
;CHUONG TRINH REVERSE VA FORWARD	
;============================================================================================================
REVERSE
	
	BSF		T1CON,TMR1ON
	BSF		INTCON,TMR1IE
	BSF		INTCON,PEIE
	BSF		INTCON,GIE


;	CLRF		TMR0				;xoa thanh ghi TMR0
;	CLRF		INTCON				;xoa thanh ghi INTCON
;	BSF			STATUS,RP0			;chon Bank1
;	MOVLW		b'11101000'			;tat chuc nang keo dien tro len cua PORTB
;	MOVWF		OPTION_REG			;timer0 o che do dem xung, tac dong boi canh len, prescaler 1:1

;	BCF			STATUS,RP0			;chon Bank0
;	BSF			INTCON,TMR0IE		;cho phep ngat timer0
;	BSF			INTCON,PEIE			;cho phep ngat ngoai vi
;	BSF			INTCON,GIE			;cho phep toan bo cac ngat


	MOVLW		b'01100000'
	MOVWF		PORTC
	

;	BSF		T1CON,TMR1ON
	
	MOVLW		B'10101001'
	MOVWF		PORTB
loop2
	GOTO		loop2
;LOOP2
;	MOVLW		0x00
;	MOVWF		highbyte
;	MOVF		TMR0,W
;	MOVWF		lowbyte

;	MOVLW		0x11
;	MOVWF		highbyte
;	MOVLW		0x11
;	MOVWF		lowbyte
;	MOVF		highbyte,W
;	MOVWF		aar1
;	MOVF		lowbyte,W
;	MOVWF		aar0
;	CALL		b16_d5
;	MOVLW		b'10000000'
;	ADDWF		aac3,W
;	MOVWF		PORTB
;	MOVLW		b'10100000'
;	ADDWF		aac2,W
;	MOVWF		PORTB	
;	MOVLW		b'11000000'
;	ADDWF		aac1,W
;	MOVWF		PORTB
;	MOVLW		b'11100000'
;	ADDWF		aac0,W
;	MOVWF		PORTB	
;	GOTO		LOOP2
FORWARD
	MOVLW		b'01100000'
	MOVWF		PORTC
	GOTO		$
;CHUONG TRINH DELAY 20ms
;==============================================================
delay20
	MOVLW d'10'					;nap 20 cho count1 de tao tre 20ms
	MOVWF count1
lap1
	MOVLW d'199'
	MOVWF counta
	MOVLW d'1'
	MOVWF countb
delay1
	DECFSZ counta,1
	GOTO $+2
	DECFSZ countb,1
	GOTO delay1
	DECFSZ count1,1
	GOTO lap1					;het doan chuong trinh delay 100ms
	RETURN
b16_d5
    swapf   aar0,w				; partial ones sum in low byte
    addwf   aar0,w				;
    andlw   0x0f				;
    skpndc						;
    addlw 	0x16				;
    skpndc						;
    addlw  	0x06				;
    addlw   0x06				;
    skpdc		;
	addlw  	-0x06				; wmax=3:0
;
    btfsc   aar0,4				; complete ones sum in low byte
    addlw   0x15+0x06
    skpdc 
    addlw  	-0x06				; wmax=4:5
	movwf	aac0				; save sum in aac0
;
;     8+      4+     2+     1+     8+     4+    2+    1+
;    20
;   100      60     30     15+
;   ----------------------------------------------------
;   128      64     32     16      8      4     2     1
;
    swapf   aar1,w				; partial ones sum in high byte
    addwf   aar1,w				;
    andlw   0x0f				;
    skpndc						;
    addlw 	0x16				;
    skpndc						;
    addlw  	0x06				;
    addlw   0x06				;
    skpdc						;
	addlw  	-0x06				; wmax=3:0
;
	btfsc   aar1,0				; complete ones sum in high byte
    addlw   0x05+0x06
    skpdc 
    addlw  	-0x06				; wmax=3:5
;
    btfsc   aar1,4
    addlw   0x15+0x06
    skpdc 
    addlw  	-0x06				; wmax=5:0
;
	addlw	0x06				; include previous sum
	addwf	aac0,w
    skpdc 
    addlw  	-0x06				; wmax=9:5, ones sum ended
;
	movwf	aac0
	movwf	aac1
	swapf	aac1,f
	movlw	0x0f
	andwf	aac0,f				; save total ones sum in aac0
	andwf	aac1,f				; save partial tens sum in aac1
;
;     8+      4+     2+     1+     8+     4+    2+    1+
;                           5+
;    60      80     90     10+                        5+
;   700     300    100     80     40     20    10    50 
; 32000   16000   8000   4000   2000   1000   500   200
; ------------------------------------------------------
; 32768   16384   8192   4096   2048   1024   512   256
;
; complete tens sum in low and high byte
	rrf	aar1,w					; rotate right high byte once
	andlw	0x0f				; clear high nibble
	addlw	0x06				; adjust bcd
	skpdc
	addlw	-0x06				; wmax=1:5
;
	addlw	0x06				; include previous sum
	addwf	aac1,w
    skpdc 
    addlw  	-0x06				; wmax=2:4
;
    btfsc   aar0,5
    addlw   0x03+0x06
    skpdc 
    addlw  	-0x06				; wmax=2:7
;
    btfsc   aar0,6
    addlw   0x06+0x06
    skpdc 
    addlw  	-0x06				; wmax=3:3
;
    btfsc   aar0,7
    addlw   0x12+0x06
    skpdc 
    addlw  	-0x06				; wmax=4:5
;
    btfsc   aar1,0
    addlw   0x25+0x06
    skpdc 
    addlw  	-0x06				; wmax=7:0
;
    btfsc   aar1,5
    addlw   0x09+0x06
    skpdc 
    addlw  	-0x06				; wmax=7:9
;
    btfsc   aar1,6
    addlw   0x08+0x06
    skpdc 
    addlw  	-0x06				; wmax=8:7
;
    btfsc   aar1,7
    addlw   0x06+0x06
    skpdc 
    addlw  	-0x06				; wmax=9:3, tens sum ended
;
	movwf	aac1				; save total tens sum in aac1
	swapf	aac1,w
	andlw	0x0f				; load partial hundreds sum in w
;
;     8+      4+     2+     1+     8+     4+    2+    1+
;    20+                    5+
;   100+     60+    30+    10+
;   ----------------------------------------------------
;   128      64     32     16      8      4     2     1
;
;     8+      4+     2+     1+     8+     4+    2+    1+
;                           5+
;    60+     80+    90+    10+                        5+
;   700     300    100     80+    40+    20+   10+   50+
; 32000   16000   8000   4000   2000   1000   500   200+
; ------------------------------------------------------
; 32768   16384   8192   4096   2048   1024   512   256
;
; complete hundreds sum in high byte
    btfsc   aar1,1
    addlw   0x05+0x06
    skpdc 
    addlw  	-0x06				; wmax=1:4
;
    btfsc   aar1,5
    addlw   0x01+0x06
    skpdc 
    addlw  	-0x06				; wmax=1:5
;
    btfsc   aar1,6
    addlw   0x03+0x06
    skpdc 
    addlw  	-0x06				; wmax=1:8
;
    btfsc   aar1,7
    addlw   0x07+0x06
    skpdc 
    addlw  	-0x06				; wmax=2:5, hundreds sum ended
;
	movwf	aac2				; save total hundreds sum in aac2
	swapf	aac2,w
	movwf	aac3				; save partial thousands sum in aac3	
	movlw	0x0f				; clear high nibble
	andwf	aac1,f				;
	andwf	aac2,f				;
	andwf	aac3,f				;
;
;     8+      4+     2+     1+     8+     4+    2+    1+
;                           5+
;    60+     80+    90+    10+                        5+
;   700+    300+   100+    80+    40+    20+   10+   50+
; 32000   16000   8000   4000   2000   1000   500+  200+
; ------------------------------------------------------
; 32768   16384   8192   4096   2048   1024   512   256
;
; complete thousands sum in low and high byte
	rrf	aar1,w					; rotate right high byte twice
	movwf	aac4				;
	rrf	aac4,w					;
	andlw	0x0f				; clear high nibble
	addlw	0x06				; adjust bcd
	skpdc						;
	addlw	-0x06				; wmax=1:5
;
	addlw	0x06				; include previous sum
	addwf	aac3,w
	skpdc
	addlw	-0x06				; wmax=1:7
;
    btfsc   aar1,6
    addlw   0x16+0x06
	skpdc
	addlw	-0x06				; wmax=3:3
;
    btfsc   aar1,7
    addlw   0x32+0x06
	skpdc
	addlw	-0x06				; wmax=6:5, thousands sum ended
;
	movwf	aac3				; save total thousands sum in aac3
	movwf	aac4				;
	swapf	aac4,f				; save ten-thousands sum in aac4
	movlw	0x0f				; clear high nibble
	andwf	aac3,f				;
	andwf	aac4,f				;
	return
END
Các bạn giúp đỡ mình nha. Cảm ơn

thay đổi nội dung bởi: uydanh, 23-12-2007 lúc 10:38 AM. Lý do: Sửa nhầm
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn