PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Thảo luận về cách viết các lệnh dịch thanh ghi (RRF,RLF) (http://www.picvietnam.com/forum/showthread.php?t=695)

anhquangngai 19-10-2006 08:33 PM

Thảo luận về cách viết các lệnh dịch thanh ghi (RRF,RLF)
 
Dưới đây là chương trình dịch trái (phải) PortB sử dụng lệnh RRF(RLF):
Code:

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 ?
Code:

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,


Múi giờ GMT. Hiện tại là 01:33 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam