PDA

View Full Version : Xin Mọi Người Giúp đỡ


dtnbk
06-06-2007, 04:59 PM
Em Dùng đoạn Chương Trình Này để Thực Hành Ngắt.
Dùng Pic16f84a
A0,a1,a2,a3,a4 Là Input
B0 Là Input Dùng Cho Việc Ngắt
B1,..,b7 Là Các Chân Output
ý định Là Khi Nhấn Switch Nối ở Các Chân Porta Thì Ghi Lại Giá Trị Của Porta Và Cộng Dồn Vào Cho Count.khi Bấm Ngắt Thì Kiểm Tra Giá Trị Của Count Xem Có Bằng Giá Trị Bất Kì Mà Mình Gán Vào W Hay Ko.nếu Bằng Thì Bật B6, Nếu Ko Bằng Thì Bật B5.
Nhưng Sau Khi Nạp Xong Thì Kết Quả Ko Như Mong đợi. Lúc đúng Lúc Sai. Mong Các Sửa Giúp .thanks

Org 0x0000

Count Equ 0ch
Count1 Equ 0dh
W_save Equ 0eh
Stat_sv Equ 0fh
Goto Main
;----------interrupt Routine---------------------
Org 0x0004
Movwf W_save ;ghi Lai Tri W Va Status
Swapf Status,0
Clrf Status
Movwf Stat_sv

Clrw ;
Movlw B'00001111' ;gia tri cho vao W de so sanh voi count
Clrf Status ;xoa status
Subwf Count,0 ;
Btfss Status,z ;neu Z=1 thì count=w --->escape set B6
Goto Alarm ;neu Z=0 thi count!=w ---->alarm
Goto Escape
Alarm
Bsf Portb,5 ;set b5 để nhận biết trường hợp
Btfss Portb,0 ;kiểm tra nếu vẫn nhấn b0 thì ko thoát
Goto $+2
Goto $-2
;tra Ve Tri W Va Status
Swapf Stat_sv,w
Movwf Status
Swapf W_save,f
Swapf W_save,w

Bcf Intcon,1 ;xóa intcon,1 để có thể nhận interrupt
Retfie
Escape
Bsf Portb,6 ;set b6 để nhận biết trường hợp
Btfss Portb,0 ;kiểm tra nếu vẫn nhấn b0 thì ko thoát ra
Goto $+2
Goto $-2

;tra Ve Tri W Va Status
Swapf Stat_sv,w
Movwf Status
Swapf W_save,f
Swapf W_save,w

Bcf Intcon,1 ;
Retfie
;----------main Program----------------------------

Main
Bsf Intcon,7 ;global Interrupt Enable
Bsf Intcon,4 ;rb0 Interrrup
Bcf Intcon,1 ;để nhận interrupt
Bsf Status,5 ;goto Bank 1
Movlw B'11111'
Movwf Trisa
Movlw B'00000001'
Movwf Trisb
;-------------------------------------------------------------------------------
Start
Bcf Status,5 ;bank 0
Clrf Portb
Clrf Porta
Clrf Count
Movlw 01h ;chỉ là 1 giá trị cho vào count làm trị ban đầu
Movwf Count
;----------------------------------------------------------------------------
Loop
Clrf Count1
Bsf Portb,2 ;chỉ là led bật để nhận biết vị trí trong loop
Clrw
Swapf Porta,w ;ghi trị porta vào w và chuyển vào count1
Movwf Count1

Bcf Status,z ;đoạn kiểm tra xem có nhấn nút nào ko
Sublw B'00000000' ;nếu ko nhấn thì ko clearporta
Btfss Status,z
Call Clearporta
Swapf Count1,w ;W=swapf(swapf(porta))
Addwf Count,f ; cộng w và count lưư lại ở count
;đoạn kiểm tra xem có từ interrupt ra hay ko
Btfsc Portb,5
Goto Start ;nếu từ interrupt ra thì chạy lại start
Btfss Portb,6
Goto Loop ;neu ko tu interrupt ra thi lặp lại loop
Goto Start ;nếu từ interrupt ra thì chạy lại start
;-------------------------------------------------------------------------------
Clearporta ;đoạn xoá porta về 00000
Bcf Portb,2 ;chỉ là 1 led nhận biết vị trí
Bsf Portb,1
Swapf Porta,w
Sublw 0h
Btfss Status,z
Goto Clearporta
Bcf Portb,1
Return

End

namqn
06-06-2007, 08:49 PM
Bạn chịu khó chú thích code của bạn và post lại. Code khá tối nghĩa nên rất khó theo dõi.

Thân,