Thông báo

Collapse
No announcement yet.

bác nào cho hỏi cái dòng code này nghĩa là gì?

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

  • bác nào cho hỏi cái dòng code này nghĩa là gì?

    Code:
    #include <avr/io.h> 
     
    void disp(unsigned char col, unsigned char num); 
     
    unsigned char image[] = {0xE7, 0x21, 0xCB, 0x6B, 0x2D, 0x6E, 0xEE, 0x23, 0xEF, 0x2F, 0xAF, 0xEC, 0xC6, 0xE9, 
    0xCE, 0x8E}; 
     
    int main (void) 
     
    { 
    unsigned char ind; 
    unsigned int num; 
      
      DDRA = 0xFF; 
      DDRC = 0xC3; 
      num = 0x89AB; 
     
     while(1){ 
        disp(ind,  (num / (0x0001 << (ind * 4))) & 0x0F); 
      ind++; 
      ind &= 3; 
     } 
    }
    void disp(unsigned char col, unsigned char num) 
    { 
    PORTC = 0xFF; 
    PORTA = image[num];  
    if(col == 0) PORTC = ~(1 << 0); 
    if(col == 1) PORTC = ~(1 << 1); 
    if(col == 2) PORTC = ~(1 << 6); 
    if(col == 3) PORTC = ~(1 << 7); 
    }
    còn đây là cái hình minh hoạ cho nó:

    các bác cho hỏi dòng:
    Code:
    disp(ind,  (num / (0x0001 << (ind * 4))) & 0x0F);
    nghìa là sao nhỉ?
    cảm ơn các bác trước nhé
    ps: xin lỗi vì thiếu mất cái hàm, he he ,sory các bác
    Last edited by quocdat_dtvt; 12-10-2009, 22:08.
    ĐỪNG KHÓC CHO NHỮNG GÌ ĐÃ QUA, MÀ HÃY CƯỜI CHO NHỮNG ĐIỀU SẮP TỚI!

  • #2
    Có vẻ là hiển thị 1 cái gì đó nhưng mà cái disp() chỉ có 2 đối số nên có khả năng là hiển thị led (có thể thôi).

    Sông dài, Thuyền lớn, Biển rộng bao la.
    Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

    Comment


    • #3
      Có vẻ là hiển thị 1 cái gì đó nhưng mà cái disp() chỉ có 2 đối số nên có khả năng là hiển thị led (có thể thôi).

      Sông dài, Thuyền lớn, Biển rộng bao la.
      Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

      Comment


      • #4
        cái này là dùng để hiển thị led 7 bay doan mà?
        nhưng mình đọc mà kô hiểu cái dòng đó nghĩa là sao.
        nó dịch bit gì đó
        bác nào pro giup mình tì
        he he
        ĐỪNG KHÓC CHO NHỮNG GÌ ĐÃ QUA, MÀ HÃY CƯỜI CHO NHỮNG ĐIỀU SẮP TỚI!

        Comment


        • #5
          (num / (0x0001 << (ind * 4))) & 0x0F cái này chỉ là biểu thức tính
          disp(ind, (num / (0x0001 << (ind * 4))) & 0x0F); còn cái này là lời gọi hàm nhưng ko biết hàm nó thực hiện như thế nào thì biết sao dc ý nghĩa của cái biểu thức trên

          Comment


          • #6
            xin lỗi các bác, mình đã bổ sung thêm
            mình biết đó là phép tình, nhưng mà mình nhìn vào đó chả hiểu là nó tính cái gì
            mong bác nói rõ một chút được kô ?
            thank nhiều.
            ĐỪNG KHÓC CHO NHỮNG GÌ ĐÃ QUA, MÀ HÃY CƯỜI CHO NHỮNG ĐIỀU SẮP TỚI!

            Comment


            • #7
              Hàm này để tách con số BCD thành từng nhóm 4 bit 8-9-A-B để hiển thị lên 4 led mà. Phép chia trên đây tương ứng với phép dịch phải.
              ind=0 giữ nguyên, lấy 4 bit cuối
              ind=1 dịch phải 4 bit, lấy 4 bit cuối
              ind=2 dịch phải 8 bit, lấy 4 bit cuối
              ...
              Bác check thử xem, câu này có thể sửa lại thành:

              (num>>(ind*4)) & 0x0F

              cho nó bớt rùng rợn
              Đã bỏ nghề về quê chăn gà...

              Comment


              • #8
                Nguyên văn bởi quocdat_dtvt Xem bài viết
                Code:
                #include <avr/io.h> 
                 
                void disp(unsigned char col, unsigned char num); 
                 
                unsigned char image[] = {0xE7, 0x21, 0xCB, 0x6B, 0x2D, 0x6E, 0xEE, 0x23, 0xEF, 0x2F, 0xAF, 0xEC, 0xC6, 0xE9, 
                0xCE, 0x8E}; 
                 
                int main (void) 
                 
                { 
                unsigned char ind; 
                unsigned int num; 
                  
                  DDRA = 0xFF; 
                  DDRC = 0xC3; 
                  num = 0x89AB; 
                 
                 while(1){ 
                    disp(ind,  (num / (0x0001 << (ind * 4))) & 0x0F); 
                  ind++; 
                  ind &= 3; 
                 } 
                }
                void disp(unsigned char col, unsigned char num) 
                { 
                PORTC = 0xFF; 
                PORTA = image[num];  
                if(col == 0) PORTC = ~(1 << 0); 
                if(col == 1) PORTC = ~(1 << 1); 
                if(col == 2) PORTC = ~(1 << 6); 
                if(col == 3) PORTC = ~(1 << 7); 
                }
                còn đây là cái hình minh hoạ cho nó:

                các bác cho hỏi dòng:
                Code:
                disp(ind,  (num / (0x0001 << (ind * 4))) & 0x0F);
                nghìa là sao nhỉ?
                cảm ơn các bác trước nhé
                ps: xin lỗi vì thiếu mất cái hàm, he he ,sory các bác
                Em chỉ bít chút về 89 cái nè là avr viết với c em cũng kô rõ chỉ trình bày theo quan điểm mình thôi.
                Thông thường để hiển thị số ra led 7 thanh thì mình cứ chia lần lượt rồi lấy số dư kết hợp với tra bảng mã thì ra. nhưng ở đây code viết khá hay và lạ.
                cái hàm disp() có hai tham số được truyền ind và .. cái đầu không nói chỉ nói đến biểu thức phía sau thôi nhé.

                Bác để ý cái code ở đầu người ta gán num = 0x89AB dạng int.
                giá trị của ind thực hiện trong đoạn code mỗi khi hàm disp() được gọi bác để ý sẽ chỉ nằm quanh quẩn (0,1,2,3) và tại sao vậy thì có 4 led mà.
                - Tiếp đó : ind*4 sẽ cho kết quả ( 0 ,4,8,12) đó là số lần theo thứ tự mà bít sẽ phải quay sang trái khi nó kết hợp với : 0x0001<<(ind*4) đến đây bác đã hiểu khi : num/0x0001<<(ind*4) nó sẽ cho phép tách lần lượt số num ban đầu (num = 0x89AB ra là (89AB,89A,89,8) tiếp tục nhé bác thấy những số đó mà được kết hợp với lệnh &0x0F sẽ cho phép tách tiếp lần lượt sẽ được (B,A,9,8) rồi sẽ được tham chiếu ra bảng mã led từ cái mảng :POTRA = image[num] để đưa dữ liệu ra portA kết hợp với việc quét led sẽ hiển thì được giá trị num ra led 7 thanh rồi !
                Vài ý kiến có gì sai bỏ qua cho em
                Last edited by typhoon; 12-10-2009, 23:38.

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X