PDA

View Full Version : Thảo luận về cách viết các lệnh dịch thanh ghi (RRF,RLF)


anhquangngai
19-10-2006, 08:33 PM
Dưới đây là chương trình dịch trái (phải) PortB sử dụng lệnh RRF(RLF):
title "leddichtutraiquaphai_Port_B.asm"
processor p16f877a
include <P16f877a.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
;================================================= ========================
; Chuong trinh chinh
;================================================= ========================
count1 equ 0x20
counta equ 0x22
countb equ 0x23
org 0x000
;-------------------------------------------------------------
;khoi tao Port B
;------------------------------------------------------------
banksel TRISB
clrf TRISB
banksel PORTB
movlw b'00000001'
movwf PORTB
loop call delay100ms;
rlf PORTB,1
goto loop

;-----------------------------------------------------------------
;chuong trinh delay
;-----------------------------------------------------------------
delay100ms ; chuong trình con delay 100 ms
MOVLW d'100'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
;----------------------------------------------------------------
end

Mô tả chương trình:
- Led sáng sẽ dc dịch từ PB0-->PB7 và sẽ tắt hoàn toàn và bắt đầu lại từ đầu.
Câu hỏi dc đặt ra:
-Muốn kiểm tra cờ C thì làm như thế nào?
- Có cách nào để led chạy liên tục PỎTB ko bi tắt hoàn toàn khi 1 dc chuyển vào cờ C?
Mong các bác có thể giúp đỡ những người mới học như tụi em dc ko?
Cảm ơn các bác!

namqn
19-10-2006, 10:37 PM
Câu thứ nhất: Thanh ghi STATUS chứa cờ C cũng là một thanh ghi như mọi thanh ghi, có thể dùng các lệnh BTFSS/BTFSC để kiểm tra trạng thái của cờ C và thực hiện các thao tác cần thiết.

Câu thứ hai: Dùng kỹ thuật đã nói trong câu thứ nhất, kiểm tra cờ C sau mỗi lần quay (chứ không phải là dịch nhé), nếu cờ C đổi trạng thái thì quay thêm một lần nữa.

Thân,

anhquangngai
02-11-2006, 07:44 PM
sẵn đây mình hỏi luôn vấn đề mà mình dang thắc mắc:
ví dụ mình có hai thanh ghi 0x20 và 0x21 có mang nội dung là một số Hẽ chẳng hạn
Câu hỏi đc đặt ra là muốn so sánh hai thanh ghi này có giá trị bằng nhau ko thì phải làm sao?va như thế nào?
To:chipchipvn
mình cũng ở QNgai
rất mong cùng trao đổi với bạn!

anhquangngai
07-11-2006, 03:16 PM
sao ko ai tra loi hết vậy?
Nếu muốn kiểm tra PORTB có bằng 255 thì lam như sau có đúng ko ?
if PORTB==255
lenh if....
else
lệnh.........
endif

namqn
07-11-2006, 07:25 PM
Để so sánh hai biến nằm trong 2 ô nhớ thì có thể copy một ô nhớ vào thanh ghi W, rồi so sánh nó với ô nhớ còn lại (điều kiện so sánh bằng có thể thực hiện bằng phép toán XOR-exclusive OR và kiểm tra cờ Z), đó là dành cho các PIC cấp thấp và hợp ngữ (assembly language).

Với các ngôn ngữ cấp cao như C hay Basic thì bạn nên đọc hướng dẫn của phần mềm, nói chung cú pháp là chuẩn, nhưng cũng có một vài ngoại lệ. Ví dụ như có một số trình dịch C không hoàn toàn tuân theo ANSI-C.

Ví dụ mà bạn đưa ra là so sánh một ô nhớ với một hằng số, không chính xác là trường hợp mà bạn đã hỏi ban đầu. Chương trình của bạn đã viết có vẻ giống như cho Basic (nhưng không hoàn toàn là Basic), nhưng biểu thức so sánh lại dùng cú pháp C => :confused:

Thân,