Thông báo

Collapse
No announcement yet.

MCC18 và kiểu khai báo dữ liệu

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • MCC18 và kiểu khai báo dữ liệu

    Tôi có gặp 1 kiểu khai báo như sau trong MCC18:
    Code:
    typedef union _WORD_VAL
    {
        WORD Val;
        BYTE v[2];
        struct
        {
            BYTE LB;
            BYTE HB;
        } byte;
        struct
        {
            unsigned char b0:1;
            unsigned char b1:1;
            unsigned char b2:1;
            unsigned char b3:1;
            unsigned char b4:1;
            unsigned char b5:1;
            unsigned char b6:1;
            unsigned char b7:1;
            unsigned char b8:1;
            unsigned char b9:1;
            unsigned char b10:1;
            unsigned char b11:1;
            unsigned char b12:1;
            unsigned char b13:1;
            unsigned char b14:1;
            unsigned char b15:1;
        } bits;
    } WORD_VAL;
    Bạn nào giải thích giúp tôi với tôi không hiểu kiểu khai báo như thế này lắm. Tôi có một nhận xét thế này: nếu ta thay đổi giá trị trong v[0],v[1] thì giá trị của Val cũng thay đổi. XIn các bạn giải thích giúp, cảm ơn trước.

  • #2
    Đây là kiểu union trong C, ở đây mỗi biến thành phần của nó là kiểu dữ liệu16bits(WORD). Khác với struct, kiểu union chỉ có thể lưu giữa giá trị của duy nhất một biến thành phần, nếu bạn cố tình gán giá trị cho 1 biến trong kiểu union thì các biến còn lại sẽ tự động cập nhật lại theo giá trị 16bits này.
    Code:
    Ví dụ
         WORD_VAL wVal;
         wVal.Val=0x1234; 
         /*
         wVal.v[0]=0x34
         wVal.v[1]=0x12
         wVal.bytes.LB=0x34
         wVal.bytes.HB=0x12
         wVal.bits.b0=0
         wVal.bits.b1=0
         wVal.bits.b2=1
         ...

    Email:
    Phone: 0905.034.086

    Comment


    • #3
      Tôi đã hiểu kiểu Union rồi, bây giờ lại có thêm 1 cái khó hiểu nữa của MCC18đó là dòng lệnh dưới đây:
      Code:
      	#define LED_IO (*((volatile unsigned char*)(&PORTD)))
      Trong trường hợp nào thì ta dùng định nghĩa này. xin mọi người giải thích giúp

      Comment


      • #4
        Trong C nói chung từ khóa volatile để chỉ những biến mà giá trị có thể bị thay đổi bất cứ lúc nào(không nhất thiết tại thời điểm gán). Cho nên trong các khai báo thanh ghi SFR của vi điều khiển thường sử dụng volatile cho các thanh ghi, đặc biệt là cho IO, vì các giá trị này có thể sẽ bị thay đổi bởi môi trường ngoài hay tương tác hardware trong lúc hoạt động.

        #define LED_IO (*((volatile unsigned char*)(&PORTD)))
        Trong định nghĩa trên thanh ghi PORTD sẽ được chuyển kiểu thành con trỏ unsigned char là (volatile unsigned char*) với tên truy cập là LED_IO.
        Sau khai báo này, lệnh gán LED_IO=X; sẽ gán giá trị của PORTD bằng X, nhưng lệnh đọc Y=LED_IO(đọc PORTD); chưa chắc trả về đúng giá trị mà lần cuối trước đó ta đã gán cho nó(tức Y có thể khác với X).

        Thân chào.

        Email:
        Phone: 0905.034.086

        Comment

        Về tác giả

        Collapse

        bluechip Tìm hiểu thêm về bluechip

        Bài viết mới nhất

        Collapse

        Đang tải...
        X