Thông báo

Collapse
No announcement yet.

Khởi tạo Lcd như thế nào cho đúng?

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

  • Khởi tạo Lcd như thế nào cho đúng?

    Mình đã đọc nhiều ebook và tài liệu trên mạng, thấy việc khởi tạo cho Lcd 16x2 mỗi tác giả mỗi khác và khác luôn với quy trình khởi tạo mình đọc trong datasheet của HD44780U, nhưng khi mình chạy mô phỏng trong Proteus thì đều chạy được. Nếu mình khởi tạo không đúng như datasheet mà đem chạy thực tế thì Lcd có bị tổn thọ không?
    Một điều nữa là Port 0 của 89s52 không có điện trở kéo lên, vậy có được dùng Port 0 để giao tiếp với các đường dữ liệu của Lcd không? (vì có thể bị xung đột logic ở các đường này)

  • #2
    - Nếu LCD mua mới , chưa dùng lần nào ...nói chung hàng ken-cà-len thì khởi tạo LCD cần theo các giá trị : [áp dụng khi giao tiếp 8bit thui nha]
    Code:
    0x38 : 2 dòng ma trận 5x7
    0x0C : Tắt con trỏ , bật hiển thị
    0x06 : dịch con trỏ sang phải
    0x01 : Xóa màn hình
    0x02 : Trở về đầu dòng ( góc trên bên trái)
    - Đối với các LCD mất rin thì chỉ cần khởi tạo : 0x38 , 0x06, 0x01
    - LCD khi nối sai cực mới cháy đèn màn hình, còn ko thì u có phá (về phần mềm) bao nhiu cũng đc.
    - POrt0 lun lun cần trở 10k kéo lên +5V nếu mún làm chân I/O

    Comment


    • #3
      Trong các phần khởi tạo của mỗi tác giả lại có những thời gian delay khác nhau, ở những thời điểm khác nhau. Vậy delay như thế nào mới hợp lý?

      Comment


      • #4
        Nguyên văn bởi gamowaxaky Xem bài viết
        Trong các phần khởi tạo của mỗi tác giả lại có những thời gian delay khác nhau, ở những thời điểm khác nhau. Vậy delay như thế nào mới hợp lý?
        Khởi tạo module LCD theo datasheet của nó là hợp lý. Tuy nhiên, đa số module đều dùng controller tương thích với HD44780U, nên việc giao tiếp là giống nhau. Cũng vì lý do là chỉ tương thích chứ không hẳn là sử dụng HD44780U, nên một số module có tốc độ đáp ứng với các lệnh là khác so với datasheet của HD44780U. Tutorial dưới đây cho thấy quá trình khởi tạo module LCD bằng phần mềm, dựa vào datasheet của HD44780U:
        http://www.8051projects.net/lcd-inte...ialization.php

        Để sử dụng tốt module LCD, bạn nên tìm datasheet của chính module đó, và datasheet của HD44780U (nếu controller trên module của bạn tương thích với HD44780U).

        Các tác giả sử dụng thời gian delay khác nhau có thể do họ đã thử nghiệm với module mà họ đang có, và chọn được thời gian phù hợp cho nó, cũng có thể là họ muốn đơn giản hóa quá trình khởi tạo, nên chọn một khoảng thời gian delay lớn hơn hẳn so với thời gian delay cần thiết ở các giai đoạn khác nhau trong quá trình khởi tạo. Đề nghị bạn xem tutorial trên và đọc datasheet của HD44780U.

        Thân,
        Biển học mênh mông, sức người có hạn

        Comment


        • #5
          Cho mình hỏi thêm một câu nữa he
          Khi ta giao tiếp dùng chế độ 4 bit, thì xảy ra một lỗi khi ta reset 89s52 bằng nút nhấn, không biết có cách nào khắc phục không?
          Vì theo mặc định Lcd khởi tạo ở chế độ 8 bit, muốn vào chế độ 4 bit ta phải xuất ra lệnh thiết đặt chế độ 4 bit theo chế độ 8 bit (nghĩa là xuất mã lệnh ra một lần).
          Khi ta nhấn nút reset 89s52 thì Lcd đang ở chế độ 4 bit, khi chương trình chạy đến đoạn khởi tạo Lcd thì nó lại gởi mã lệnh ra ở chế độ 8 bit để thiết đặt chế độ 4 bit (nghĩa là chỉ xuất có 1 nibble) vậy Lcd chỉ nhận được có 1 nibble của lệnh đó thôi, vậy nó có thực hiện lệnh đó không? Điều này có ảnh hưởng tới các lệnh xuất ra Lcd tiếp theo không?
          Khi mình mô phỏng trong Proteus, mỗi lần mình nhấn nút reset 89s52 thì nó báo lỗi là: "Attemp to read after writting a single nibble". Có khi nó báo lỗi là "Attemp to write after reading a single nibble". (Tuy báo lỗi nhưng Lcd vẫn hoạt động đúng).
          Last edited by gamowaxaky; 31-01-2009, 15:21.

          Comment


          • #6
            làm sao có lỗi phát sinh khi RST VDK đc, mô phỏng # xa với thực tế đó nha
            - Đầu tiên tạo 1 hàm
            Code:
            void send_to_LCD( unsigned int data )
            {
                LCD_D4=data & 0x01;
                LCD_D5=data & 0x02;
                LCD_D6=data & 0x04;
                LCD_D7=data & 0x08;
            }
            - sau đó , gửi lệnh hay data thoải mái

            Code:
            void LCD_PutChar ( unsigned int data )
            {
                RS = 1;
                RW = 0;
            
                send_to_LCD( swap ( data ) ); // gui 4 bit cao
                E=1;E=0;delay_ms ( 3 );    
            
                send_to_LCD( swap ( data ) );  //gui 4 bit thap
                E=1;E=0;delay_ms ( 3 );      
            }

            Comment


            • #7
              Mình viết bằng asm chứ không phải c. Có lẽ trình biên dịch c đã sữa lỗi đó rồi. Nhưng bạn có thử mô phỏng đoạn khởi tạo đó trong proteus chưa?

              Comment


              • #8
                Để khởi tạo chuẩn thì nên tìm đc datasheet của con driver cho LCD là tốt nhất. Trong đó sẽ có đầy đủ chu trình khởi tạo cho nó. Chỉ việc làm theo.
                Ví dụ: Tôi thường hay dùng LCD của Tinsharp như TC1602, TC1604, TC2004. Loại này dùng con điều khiển là SPLC780D (xem datasheet đính kèm). Trong file datasheet có cung cấp thuật toán để khởi tạo cho nó ở phần 5.7 trang 10. Về thời gian thực hiện của các hàm thì ở trong phần 5.4 trang 7. Nếu ko quan sát cờ BF thì có thể delay theo khoảng thời gian này.

                Trong trường hợp ko biết con driver thì vẫn áp dụng thuật toán trên. Nếu đc thì tốt còn ko đc thì thôi.
                Attached Files
                AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                Xem thêm tại Online Store ---> Click here
                Mob: 0982.083.106

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X