Thông báo

Collapse
No announcement yet.

anh, chị trong diễn đàn giải thích giúp em đoạn code này với?

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

  • anh, chị trong diễn đàn giải thích giúp em đoạn code này với?

    Em đang làm quen với microcontroller.gặp đoạn code này ko hiếu nhờ các a, chị trong diễn đàn giải thích giúp em nha.
    Cái này là trong 1 bài về máy đếm sản phẩm 6 kênh sử dụng:
    89c51, LCD16*2, 4x3 keypad:
    LCD trong chế độ 4 bít và nối với port2 của VĐK. 6 phím keypad nối với cổng P0.
    // giải thích giúp em từ chỗ này:
    unsigned char keycode[] = {0xFe, 0xFd ,0xFf}; //??
    unsigned char phim_chon =0;
    #define lcd_data(data) (P2 = (P2&0xF0)|(data&0x0F))// ???
    #define Mode_4Bit 0x28
    void lcd_wait(){
    char temp;
    P2 |= 0x0F;// ????
    LCD_RS = 0;
    LCD_RW = 1;
    do {
    LCD_E = 1; //che do 4 bit phai doc 2 lan
    temp = P2; //chi luu 4 bit dau de kiem tra busy_flag
    LCD_E = 0;
    LCD_E = 1;
    LCD_E = 0;
    }while (temp&0x08);//????
    }

    unsigned char lcd_gotoxy(unsigned char row, unsigned char col) {
    unsigned char addr = 0x00;
    if(col >= 20 || row >= 4) // ??
    return 0;
    if(row < 2) {
    addr = (row * 0x40) + col; // ??
    addr = 0x80 | (addr & 0x7F); // ??
    }
    else {
    addr = (row * 0x40) + col; // ??
    addr = 0x94 | (addr & 0x7F); // ??
    }
    lcd_control(addr);
    return 1;
    }
    void quetphim()
    {
    unsigned char n, m;
    for (n=0; n<2; n++)
    {
    P0 = keycode[n];
    for(m=0; m<200; m++)
    {
    if(K3 == 0) phim_chon = 3*n +1;
    else if(K4 ==0) phim_chon = 3*n +2;
    else if(K5 ==0) phim_chon = 3*n +3;
    }
    }
    }

    thanks you very much!!!!!
    Last edited by student42; 08-07-2011, 18:46.

  • #2
    Mình sẽ giải thích cho bạn những chỗ ???
    #define lcd_data(data) (P2 = (P2&0xF0)|(data&0x0F))// ???
    -Định nghĩa macro có nhiệm vụ xuất data.

    P2 |= 0x0F;// ????
    -Đặt 4 bit thấp của P2 là input(để đọc cờ BF).

    if(col >= 20 || row >= 4) // ??
    - Kiểm tra các giá trị input là col và row có phù hợp với giới hạn của LCD hay ko. Góp ý: Giá trị 20 và 4 này là sai đối với LCD 16x2, chính xác phải là 16 và 2.

    while (temp&0x08);//????
    - Kiểm tra cờ BF còn bận hay không.

    if(row < 2) {
    addr = (row * 0x40) + col; // ??
    addr = 0x80 | (addr & 0x7F); // ??
    }
    else {
    addr = (row * 0x40) + col; // ??
    addr = 0x94 | (addr & 0x7F); // ??
    }

    - Mấy cái này chỉ là các tính toán xác định giá trị RAM của LCD thôi.

    Trên đây là một số giải thích của mình, nếu chưa hiểu thì đọc tai liệu về LCD16x2 và C.

    Comment


    • #3
      Thanks a enter88 nha.bây giờ em đã hiểu thêm nhiều. Nhưng có thể giải thích kĩ hơn cho em mấy chỗ này đc ko ạ? (mấy cái giá trị hex ý):

      unsigned char keycode[] = {0xFe, 0xFd ,0xFf};// ???
      #define lcd_data(data) (P2 = (P2&0xF0)|(data&0x0F))// ??? tại sao lại P2 = (P2&0xF0)|(data&0x0F))
      while (temp&0x08);// tại sao kiểm tra BF lại có temp&0X08?
      và chí giúp em cái địa chỉ Ram nay tính thế nào vậy:

      if(row < 2) {
      addr = (row * 0x40) + col; // ??
      addr = 0x80 | (addr & 0x7F); // ??
      }
      else {
      addr = (row * 0x40) + col; // ??
      addr = 0x94 | (addr & 0x7F); // ??
      }

      Mong mọi người đừng cười nếu câu hỏi của e hơi ngớ ngẩn nha.
      Many Thanks to all of you!!!
      Last edited by student42; 08-07-2011, 18:47.

      Comment


      • #4
        Bạn đọc hai tài liệu này là sẽ hiểu rõ !!!
        Attached Files

        Comment


        • #5
          Nguyên văn bởi student42 Xem bài viết
          Thanks a enter88 nha.bây giờ em đã hiểu thêm nhiều. Nhưng có thể giải thích kĩ hơn cho em mấy chỗ này đc ko ạ? (mấy cái giá trị hex ý):

          unsigned char keycode[] = {0xFe, 0xFd ,0xFf};// ???
          #define lcd_data(data) (P2 = (P2&0xF0)|(data&0x0F))// ??? tại sao lại P2 = (P2&0xF0)|(data&0x0F))
          while (temp&0x08);// tại sao kiểm tra BF lại có temp&0X08?
          và chí giúp em cái địa chỉ Ram nay tính thế nào vậy:

          if(row < 2) {
          addr = (row * 0x40) + col; // ??
          addr = 0x80 | (addr & 0x7F); // ??
          }
          else {
          addr = (row * 0x40) + col; // ??
          addr = 0x94 | (addr & 0x7F); // ??
          }

          Mong mọi người đừng cười nếu câu hỏi của e hơi ngớ ngẩn nha.
          Many Thanks to all of you!!!
          Có thể là cười nhưng chắc là cười mỉm
          Bây giờ hãy lấy giấy bút ra và biến số hex thành số nhị phân rồi thực hiện các phép tính AND hay OR gì đó và ngẫm nghĩ.

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X