Thông báo

Collapse
No announcement yet.

Help...Tách số 16bit thành 2byte(cao và thấp) dùng C

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

  • #16
    Về cách khai báo một union cũng giống như khai báo một struct. Nó chỉ khác nhau là: Các thành phần của Struct được cấp phát các vùng nhớ riêng và độ dài của struct bằng tổng độ dài của các "biến" thành phần. Còn union thì các thành phần được cấp phát bắt đầu từ ô nhớ đầu tiên(có nghĩa là địa chỉ bắt đầu của các thành phần trong union là như nhau).
    Về 2 ví dụ trên của bạn, mình cũng chưa thử hết các kiểu khai báo xem các compiler cho avr phản ứng lại thế nào? Nhưng trong AVR Studio và CodeVisionAVR có sự khác nhau đáng kể. Trong AVR Studio thì chấp nhận union có thể được khai báo trong Struct còn trong CodeVisionAVR thì không.
    Còn lỗi khi bạn dùng cách 1 để khai báo một biến union kiểu split16to8 là do bạn chưa có tên Union. split16to8 trong khai báo typedef union split16to8 theo C chuẩn thì nó không phải là tên cấu trúc, nó có thể có hoặc không. mà tên cấu trúc phải được thiết lập sau dấu ;. Về cái này bạn đọc trong trang 244 trong cuốn: Kỹ thuật lập trình C của Thầy Phạm Văn Ất.. Cách khai báo một struct hoặc union chuẩn như sau:
    - Cách Định nghĩa một kiểu union hoặc Struct:
    typedef union
    {
    //cac thanh phan cua union
    }ten_union;
    typedef struct
    {
    //cac thanh phan cua struct
    }ten_struct;
    Sau các định nghĩa này có thể dùng nó để khai báo các biến Union hoặc struct.
    - Cách Khai báo một biến union hoặc một struct
    union ten_union
    {
    //các thành phần của union
    }
    struct ten_struct
    {
    //các thành phần của struct
    }

    Comment


    • #17
      Em xài WinAVR nhúng trong AVRStudio
      Em tìm ra roài mấy huynh. Em đọc sách bị nhầm cách khai báo giữa 2 thằng C và C++. Đúng ra nó là như vầy:

      Trong C++: thì dùng cách 1 là hợp lệ
      Trong C: thì phải dùng cách 2 hoặc dùng cách của anh quocthai (union INT_TO_BYTE test)

      Gửi qt huynh: cách khai báo union INT_TO_BYTE test là đúng chuẩn C không phải do C30 của dsPIC.
      Last edited by apple; 23-08-2008, 23:56.
      Mấy ai định nghĩa được tình yêu.
      Có gì đâu một buổi chiều.
      Kề dao lên cổ yêu hay chết .
      Gật đầu cái rụp thế là yêu.

      --------
      Apple

      Comment


      • #18
        unsigned int data; // 16bit
        low : *((unsigned char *)&data)
        high : *((unsigned char *)&data+1)

        unsigned long data; // 32bit
        low : *((unsigned char *)&data)
        midlow : *((unsigned char *)&data+1)
        midhigh : *((unsigned char *)&data+2)
        high : *((unsigned char *)&data+3)

        Comment


        • #19
          Có nhiều cách để thực hiện, nhưng hãy chọn cách mà ngoài tối ưu code còn làm chương trình trong sáng dễ đọc.
          Code:
          typedef struct {
              unsigned char Low;
              unsigned char High;
          } Int2Bytes;
          Nếu muốn lấy BYTE cao - thấp của 1 số interger 16 bits bất kỳ
          Code:
          unsigned int i=0x1234;
          ((Int2Bytes*)&i)->High   --> 0x12
          ((Int2Bytes*)&i)->Low   --> 0x34
          Nếu dữ liệu được dùng thường xuyên thì có thể xây dựng kiểu dữ liệu riêng
          Code:
          typedef union{
              unsigned int Data;
              Int2Bytes    Split;
          } DATA_TYPE_NAME;
          
          DATA_TYPE_NAME MyData;
          ...
          MyData.Data=0x1234;
          MyData.Split.High  --> 0x12
          MyData.Split.Low  --> 0x34
          ...
          Good luck!

          Email:
          Phone: 0905.034.086

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          • bqviet
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi bqviet
            Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
            06-12-2025, 17:17
          • nguyendinhvan
            Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
            bởi nguyendinhvan
            Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
            05-12-2025, 19:59
          • afrendly
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi afrendly
            Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
            04-12-2025, 01:27
          • nick22
            Trả lời cho Máy điện châm ?
            bởi nick22
            Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
            01-12-2025, 13:23
          Đang tải...
          X