|
Tài trợ cho PIC Vietnam |
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 ... |
|
Ðiều Chỉnh | Xếp Bài |
06-06-2007, 04:59 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 2
: |
Xin Mọi Người Giúp đỡ
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 Code:
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 thay đổi nội dung bởi: dtnbk, 06-06-2007 lúc 09:14 PM. |
06-06-2007, 08:49 PM | #2 |
Trưởng lão PIC bang
|
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,
__________________
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 |
|
|