Thông báo

Collapse
No announcement yet.

[Help] LCD 16x2

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

  • [Help] LCD 16x2

    Chào cả nhà
    Mọi người cho em hỏi cái vấn đề sau ạ:
    Em lập trình cho LCD 16x2 hiển thị 2 màn hình thông tin. màn hình 1 hiện thời gian, màn hình 2 hiện thông tin về ADC. để chuyển qua lại giữa 2 màn hình này em dùng 1 nút bấm cho vào ngắt I/O.mỗi lần bấm tăng biến i++
    (em cho i thay đổi 0,1,0,1,0,.. sao mỗi lần bấm thôi)
    code trong hàm main em viết theo dạng sau:
    Code:
    while(1)
    {
    switch(i)
    {
       case 0: hiengio();
         break;
       case 1: hienadc();
         break();
    }
    }
    Vấn đề em gặp phải là khi chuyển qua lại giữa 2 màn hình thì còn một số ký tự của màn hình 2 xót lại ở những vị trí trống của màn hình 1 và ngược lại.
    em đã thử thêm lệnh clear LCD vào trong các hàm con hiengio() và hienadc().Kết quả là các ký tự xót lại kia bị xoá, nhưng màn hình LCD lại nhấp nháy và bị mờ đi, không nhìn thấy được thông tin. !!
    Em nghĩ là do LCD bị Xoá,ghi,xoá,ghi,...liên tục nên mới bị vậy. Mọi người xem giúp em vấn đề này có cách nào khắc phục không ạ, cảm ơn mọi người nhiều !!!


  • #2
    Nguyên văn bởi lee_trieu Xem bài viết
    Chào cả nhà
    Mọi người cho em hỏi cái vấn đề sau ạ:
    Em lập trình cho LCD 16x2 hiển thị 2 màn hình thông tin. màn hình 1 hiện thời gian, màn hình 2 hiện thông tin về ADC. để chuyển qua lại giữa 2 màn hình này em dùng 1 nút bấm cho vào ngắt I/O.mỗi lần bấm tăng biến i++
    (em cho i thay đổi 0,1,0,1,0,.. sao mỗi lần bấm thôi)
    code trong hàm main em viết theo dạng sau:
    Code:
    while(1)
    {
    switch(i)
    {
       case 0: hiengio();
         break;
       case 1: hienadc();
         break();
    }
    }
    Vấn đề em gặp phải là khi chuyển qua lại giữa 2 màn hình thì còn một số ký tự của màn hình 2 xót lại ở những vị trí trống của màn hình 1 và ngược lại.
    em đã thử thêm lệnh clear LCD vào trong các hàm con hiengio() và hienadc().Kết quả là các ký tự xót lại kia bị xoá, nhưng màn hình LCD lại nhấp nháy và bị mờ đi, không nhìn thấy được thông tin. !!
    Em nghĩ là do LCD bị Xoá,ghi,xoá,ghi,...liên tục nên mới bị vậy. Mọi người xem giúp em vấn đề này có cách nào khắc phục không ạ, cảm ơn mọi người nhiều !!!
    Nếu bạn không xóa lcd, thì kí tự ở cuối ở những chỗ mà kí tự mới viết không tới sẽ vẫn còn. Cách này nếu bạn không thích dùng lcd_clear() thì khi xuất giá chuỗi mới nên thêm 1 vài cái dấu cách ở cuối để nó đè lên kí tự thừa cũ.
    Việc dùng lệnh lcd_clear() gây mờ, nhấp nháy ở kí tự cuối (càng về cuối càng mờ ) thường xảy ra với việc dùng thư viện lcd tự viết và viết không chuẩn. Khi xóa lcd cần ít nhất 1.64ms và để chắc ăn người viết thư viện đã dùng cách đưa hàm delay tầm > 2ms vào trong hàm tạo xung. Như vậy khi viết 1 ký tự lên lcd mất > 2ms và viết 1 chuỗi thì mất rất nhiều thời gian => thời gian tồn tại kí tự ngắn => nháy + mờ.
    Để giải quyết việc này thì chuyển hàm delay 2ms vào trong hàm lcd_clear() còn giá trị delay cũ trong hàm tạo xung để còn lại tầm 50us. Bạn sẽ thấy lcd dù có xóa liên tục cũng không bị nháy và mờ đồng thời tốc độ hiển thị tăng lên vài chục lần.

    Comment


    • #3
      Nguyên văn bởi duong_act Xem bài viết
      Nếu bạn không xóa lcd, thì kí tự ở cuối ở những chỗ mà kí tự mới viết không tới sẽ vẫn còn. Cách này nếu bạn không thích dùng lcd_clear() thì khi xuất giá chuỗi mới nên thêm 1 vài cái dấu cách ở cuối để nó đè lên kí tự thừa cũ.
      Việc dùng lệnh lcd_clear() gây mờ, nhấp nháy ở kí tự cuối (càng về cuối càng mờ ) thường xảy ra với việc dùng thư viện lcd tự viết và viết không chuẩn. Khi xóa lcd cần ít nhất 1.64ms và để chắc ăn người viết thư viện đã dùng cách đưa hàm delay tầm > 2ms vào trong hàm tạo xung. Như vậy khi viết 1 ký tự lên lcd mất > 2ms và viết 1 chuỗi thì mất rất nhiều thời gian => thời gian tồn tại kí tự ngắn => nháy + mờ.
      Để giải quyết việc này thì chuyển hàm delay 2ms vào trong hàm lcd_clear() còn giá trị delay cũ trong hàm tạo xung để còn lại tầm 50us. Bạn sẽ thấy lcd dù có xóa liên tục cũng không bị nháy và mờ đồng thời tốc độ hiển thị tăng lên vài chục lần.
      Dạ em cảm ơn anh !! Nhưng anh ơi hàn lcd_clear() của em đã có sẵn delay 2ms rồi ạ. nó thế này
      Code:
      void lcd_clear(void)
      {
          lcd_cmd(0,0x01);        // display off
          lcd_delay_ms(2);     // wait for LCD
      }
      còn đây là hàm ghi ký tự ạ
      Code:
      void lcd_putc(char c)
      {
          switch(c){
              case '\f':
                  lcd_cmd(0, 0x01);
                  lcd_delay_ms(2);     // wait for LCD
                  break;
              case '\n':
                  lcd_gotoxy(0, 0x01);
                  break;
              default:
                  lcd_cmd(1, c);
                  lcd_delay_ms(2);     // wait for LCD
                  break;
          }
      }
      Trong cả hai hàm con trên đều có delay 2ms, thậm chí là 4ms ở hàm ghi ký tự. vậy giải quyết sao anh??? Em cảm ơn anh nhiều !!

      Comment


      • #4
        Bạn dùng MCU nào ?
        Bạn chuyển toàn bộ thư viện lcd qua đây nhé.

        Comment


        • #5
          Nguyên văn bởi duong_act Xem bài viết
          Bạn dùng MCU nào ?
          Bạn chuyển toàn bộ thư viện lcd qua đây nhé.
          Dạ em dùng msp430 ạ !
          Thư viện đây ạ https://dl.dropboxusercontent.com/u/...%20Library.rar
          Anh xem giúp em với, em thường bị mấy cái liên quan đến hàm lcd_clear() lắm !!
          Em cảm ơn anh nhiều !!

          Comment


          • #6
            Nguyên văn bởi lee_trieu Xem bài viết
            Dạ em dùng msp430 ạ !
            Thư viện đây ạ https://dl.dropboxusercontent.com/u/...%20Library.rar
            Anh xem giúp em với, em thường bị mấy cái liên quan đến hàm lcd_clear() lắm !!
            Em cảm ơn anh nhiều !!
            Sửa lại hàm lcd_putc(c) như sau:
            Code:
            void lcd_putc(char c)
            {
                switch(c){
                    case '\f':
                        lcd_cmd(0, 0x01);
                        lcd_delay_ms(2);     // wait for LCD
                        break;
                    case '\n':
                        lcd_gotoxy(0, 0x01);
                        lcd_delay_ms(2);     // wait for LCD
                        break;
                    default:
                        lcd_cmd(1, c);
                        break;
                }
            }

            Comment


            • #7
              Nguyên văn bởi duong_act Xem bài viết
              Sửa lại hàm lcd_putc(c) như sau:
              Code:
              void lcd_putc(char c)
              {
                  switch(c){
                      case '\f':
                          lcd_cmd(0, 0x01);
                          lcd_delay_ms(2);     // wait for LCD
                          break;
                      case '\n':
                          lcd_gotoxy(0, 0x01);
                          lcd_delay_ms(2);     // wait for LCD
                          break;
                      default:
                          lcd_cmd(1, c);
                          break;
                  }
              }
              Dạ..em đã sửa, nhưng nó vẫn không cải thiện được mấy ạ, vẫn còn bị chớp và mờ lắm ạ !!!có cách nào mà mình chỉ clear lcd 1 lần duy nhất sau đó chỉ hiện thị không clear nữa ko anh??

              Comment


              • #8
                Thì bạn bỏ hàm clear đi.

                Comment


                • #9
                  Nguyên văn bởi duong_act Xem bài viết
                  Thì bạn bỏ hàm clear đi.
                  Dạ...nếu mình bỏ hàm clear ra thì mấy cái ký tự còn sót lại xữ lý sao anh??? dùng khoảng trắng lắp nó hay sao a??

                  Comment


                  • #10
                    Nguyên văn bởi lee_trieu Xem bài viết
                    Dạ...nếu mình bỏ hàm clear ra thì mấy cái ký tự còn sót lại xữ lý sao anh??? dùng khoảng trắng lắp nó hay sao a??
                    Cho mình xem toàn bộ project đi.

                    Comment


                    • #11
                      Nguyên văn bởi lee_trieu Xem bài viết
                      Dạ...nếu mình bỏ hàm clear ra thì mấy cái ký tự còn sót lại xữ lý sao anh??? dùng khoảng trắng lắp nó hay sao a??
                      Cho mình xem toàn bộ project đi.

                      Comment


                      • #12
                        Nguyên văn bởi duong_act Xem bài viết
                        Cho mình xem toàn bộ project đi.
                        Dạ đây ạ
                        https://dl.dropboxusercontent.com/u/.../RTC%20LCD.rar
                        Dùng IAR để mở nha anh !!

                        Comment


                        • #13
                          Trong "while(1)" thêm 1 hàm delay vào bạn nhé, tầm 50ms sẽ thấy thay đổi .

                          Comment


                          • #14
                            Nguyên văn bởi duong_act Xem bài viết
                            Trong "while(1)" thêm 1 hàm delay vào bạn nhé, tầm 50ms sẽ thấy thay đổi .
                            dạ nó vẫn sót lại anh ơi
                            Code:
                            while(1)
                              {
                                 read_bq32000();//Doc thoi gian tu BQ32000
                                 //display_time(); //Hien gio,phut,giay ra dong 1 LCD
                                 //display_date();//Hien ngay,thang,nam ra dong 2 LCD 
                                __delay_cycles(50000);
                                switch(i)
                                {
                                case 0:display_clock();
                                  break;
                                case 1:display_adc();
                                  break;
                                }
                              
                              }
                            Hình như nếu không clear màn hình thì nó bị sót hay sao ah, mà clear thì nó lại nháy và mờ

                            Comment


                            • #15
                              mình đoán cậu dùng hàm goto khi xuất dữ liệu ra nên nó mới như vậy.. còn mờ với nhấp nháy là do gọi lệnh xóa ghi liên tục trong các đoạn hienadc(); với hiengio(); nên mới bị vậy.
                              cậu nên cho 1 hàm xóa LCD trong đoạn main chỗ (switch - case) đấy

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X