#define và #bit và #byte

Cho em hỏi sự khác nhau khi khai báo:

#define a pin_c0;
#bit b = portc.0;

Tại sao ta có thể gán b = 0; nhưng lại không thể gán a = 0;?

Khi khai báo #byte portc = 0x06;, câu lệnh này có ý nghĩa như nào ạ?

Define thì nó giống như viết tắt.
#define a pin_c0; thì a khi biên dịch sẽ được thay thế bằng pin_c0;
Vậy viết a = 0; thì nó tương đương pin_c0;=0; -> rõ ràng là sai cú pháp.

Chính xác thì sau các dòng #define, #bit, #byte (gọi là các lệnh tiền xử lý) sẽ không có dấu “;”.

#byte portc = 0x06

Có nghĩa là khai báo một thanh ghi với tên portc có độ rộng 1 byte nằm tại địa chỉ 0x0006.

Đây là code CCS và code CCS không phải là chuẩn C nên đem kiến thức C vào nhiều lúc sẽ không đúng.

3 Likes

e chưa hiểu cái cái thanh ghi port c .
khai báo tại địa chỉ 0x06 để làm gì ạ vì khi trong code e không khai báo e vẫn dùng để xuất ra các chân out như bình thường , ví dụ như portc = 0xef;

Mặc định, CCS không khai báo tên các thanh ghi. Nên sẽ không thể sử dung được câu lệnh dạng truy cập thanh ghi trực tiếp. Bởi vì không khai báo thì nó không hiểu PORTC nó là cái gì:

PORTC=0x12;

Để dung được lệnh trên thì phải khai báo:

#byte PORTC = 0x0007

Câu lệnh này báo cho trình biên dịch là : Tôi có thanh ghi tên là PORTC độ rộng 1 byte nằm tại địa chỉ 0x0007 (0x7h) trong bộ nhớ. Tại sao lại là 0x0007 ? Vì nó là địa chỉ của PORTC mà người thiết kế con chip đã đặt như vậy (mỗi con một khác, xem datasheet để rõ hơn)
Không được đặt sai địa chỉ. Đặt sai là nhìn rau gắp thịt, bắn gà chết vịt. :smile:
image

Sau khi khai báo như vậy trình biên dịch mới biết:
"À thì ra PORTC là thanh ghi nằm ở vị trí 0x0007, muốn làm gì với PORTC thì mình chỉ cần làm với thằng thanh ghi ở 0x0007 là xong. 2 thằng là một mà "
Và sau đó viết như thế này:

unsigned char val = PORTC;

Thì trình biên dịch nó mới hiểu được là : “À lệnh này thì phải lấy giá trị của thanh ghi nằm ở địa chỉ 0x0007 đặt vào biến val”.
Thanh ghi PORTx là thanh ghi để đọc giá trị của cổng x nên không dùng để set output cho cổng x. Set output thì phải dùng thanh ghi LATx.

4 Likes

Cảm ơn A , e đã hiểu rồi , mà thanh ghi PORT nó là thanh ghi 2 chiều nên vẫn out được ạ . Em cảm ơn A nhiều

1 Like

2 posts were merged into an existing topic: Topic lưu trữ các post off-topic - version 3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?