PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Giúp mình một chút về LCD (chế độ 8Bit,dùng Pic18F4) (http://www.picvietnam.com/forum/showthread.php?t=2290)

anhemFSA 22-04-2008 09:02 PM

Giúp mình một chút về LCD (chế độ 8Bit,dùng Pic18F4)
 
Mình dùng PIC8F4XXX kết nối với LCD 16x2.
Sơ đồ kết nối như sau :
8bit PORTC -> D0 - D7 của LCD
RD0 -> RS
GND -> RW
RD2 -> E
Khi mình nối chân A và K vào nguồn thì LCD có sáng đèn BackGround, nhưng mà mình không thể khởi tạo được LCD.
Mình dùng chương trình như sau:

Code:

LIST P=18F4523 ;directive to define processor
#include <P18F4523.INC> ;processor specific variable definitions
       
ORG        0x0020
        COUNT_L        RES        1
        COUNT_H        RES        1

#define                RS        PORTD,0
#define                EN        PORTD,2
#define                LCD        PORTC

        ORG        0x0000
        GOTO        MAIN

        ORG        0x0020
;====================================
MAIN
        CLRF        TRISC
        CLRF        TRISD
        CLRF        PORTC                        ;Đặt portC, portC là output
        CLRF        PORTD

        CALL        DELAY

        MOVLW        H'38'                        ;Khởi tạo chế độ 8bit
        MOVWF        LCD
        CALL        WRITECMD
       
        MOVLW        H'0F'                        ;Bật hiển thị, Cursor ON
        MOVWF        LCD
        CALL        WRITECMD
 
        MOVLW        H'85'                        ;Di chuyển con trỏ
        MOVWF        LCD
        CALL        WRITECMD

        MOVLW        'F'                        ;Ghi dữ liệu
        MOVWF        PORTC
        CALL        WRITEDATA
        GOTO        $                        ;Dừng c.trình
;=========================================
DELAY
        MOVLW        D'255'
        MOVWF        COUNT_L
DL1       
        CALL        DELAY2
        DECFSZ        COUNT_L,1
        GOTO        DL1
        RETURN
;=========================================       
DELAY2
        MOVLW        D'255'
        MOVWF        COUNT_H
DL2        DECFSZ        COUNT_H,1
        GOTO        DL2
        RETURN
;=========================================       
WRITECMD
        BCF                RS                ;        RS = 0
        BSF                EN                ;        EN = 1
        NOP
        NOP
        BCF                EN                ;        EN = 0
        CALL                DELAY
        RETURN
;=========================================
WRITEDATA
        BSF                RS                ;        RS = 1
        CALL                DELAY2
        BSF                EN                ;        EN = 1
        NOP
        NOP
        BCF                EN                ;        EN = 0
        CALL                DELAY
        RETURN
;=========================================
        END

Chương trình trên mình không khởi tạo được LCD, LCD ko hiển thị gì hết. Mình đã có cắm thử LED vào các chân của LCD để kiểm tra (tăng DELAY lên) thì các LED sáng đúng như trình tự chương trình.
Vì nếu khởi tạo thành công thì sau khi send 2 lệnh 0x38 và 0x0F thì LCD phải có con trỏ nhấp nháy. Không biết có phải mình sai sót gì khi ra lệnh cho LCD ( có thể do xung chốt EN không?, hay có khi nào LCD hỏng không? - vì mình thấy đèn background của LCD vẫn sáng?)
Mong các bạn giúp mình với !

namqn 22-04-2008 10:53 PM

Các module LCD mới thường cần được khởi tạo đầy đủ theo quy trình đã được tôi nói ở post #269 của luồng sau:
http://www.picvietnam.com/forum/show...?t=357&page=18

Bạn thử làm như vậy xem. LED background hoàn toàn không có liên hệ gì với board mạch điều khiển LCD (nó chỉ cần 2 chân A và K cho dãy đèn LED mắc nối tiếp/song song nhau, để chiếu sáng nền của LCD).

Thân,

tam_pascal 24-04-2008 12:46 AM

theo mình thì nguồn cấp cho background phải thiết kế riêng ra. Nếu bạn dùng chung có thể là do sụt nguồn của PIC lên PIC không khởi tạo được LCD.

minhsondaklak 01-06-2008 07:13 PM

Tôi không rành hợp ngữ, nhưng tôi nghĩ bạn AnhemFSA nên xem lại các chỉ lệnh "ORG" trong đoạn code của mình !
Riêng lệnh "ORG 0x0020" dùng 2 lần, tôi nghĩ không ổn. Tôi đề nghị sữa code:

...
COUNT_L RES 1
COUNT_H RES 1

#define RS PORTD,0
#define EN PORTD,2
#define LCD PORTC

ORG 0x0000
GOTO MAIN
ORG 0x0020

MAIN
...

tieulongnu 15-10-2009 04:53 AM

khởi tạo LCD 4 hàng 20 cột
 
Các bạn chỉ bảo : mình dùng CCS 4.068 viết chương trình hiển thị trên LCD 4 hàng 20 cột , mình chỉ hiển thị được trên 2 hàng đầu thôi , còn 2 hàng cuối thì không được .
http://www.mediafire.com/?sharekey=5...538f5672f1b9df

cskiller 15-10-2009 10:42 AM

Trích:

Nguyên văn bởi tieulongnu (Post 30258)
Các bạn chỉ bảo : mình dùng CCS 4.068 viết chương trình hiển thị trên LCD 4 hàng 20 cột , mình chỉ hiển thị được trên 2 hàng đầu thôi , còn 2 hàng cuối thì không được .
http://www.mediafire.com/?sharekey=5...538f5672f1b9df

Bạn phải sữa lại hàm void lcd_gotoxy( BYTE x, BYTE y) cho phù hợp với DDRAM của LCD 4x20.
Code:

void lcd_gotoxy( BYTE x, BYTE y) {
  BYTE address=0x00;
  /*
  if(y!=1)
    address=lcd_line_two;
  else
    address=0;
  */
  switch(y) {
    case 1 : address=0x00;break;
    case 2 : address=0x40;break;
    case 3 : address=0x14;break;
    case 4 : address=0x54;break;
  }
  address+=x-1;
  lcd_send_byte(0,0x80|address);
}

Regards

tieulongnu 15-10-2009 08:17 PM

#define lcd_line_two 0x40 // LCD RAM address for the second line
bạn ơi mình thấy trong thư viện lcd.c có dòng lệnh trên , nhưng sao theo mình biết thì hàng thứ 2 của LCD lại có địa chỉ 0xC0

cskiller 15-10-2009 09:28 PM

Trích:

Nguyên văn bởi tieulongnu (Post 30276)
#define lcd_line_two 0x40 // LCD RAM address for the second line
bạn ơi mình thấy trong thư viện lcd.c có dòng lệnh trên , nhưng sao theo mình biết thì hàng thứ 2 của LCD lại có địa chỉ 0xC0

Địa chỉ DDRAM hàng thứ 2 của LCD 20x2 không phải là 0xC0 bạn ah, mà là 0x40, khi OR với lệnh WRITE DDRAM là 0x80 thì nó mới là 0xC0.

http://ouwehand.net/~peter/lcd/images/lcd/lcd-4l.gif

Trong hàm lcd_gotoxy cho LCD 20x2 trên thì biến address sau khi được xác định bởi biến y sẽ được OR với lệnh WRITE DDRAM 0x80.

Regards

tieulongnu 15-10-2009 10:37 PM

Cảm ơn bạn nhiều , mình đã được hiểu biết rõ

dientudong 15-10-2009 11:58 PM

các chương trình mẫu cho lcd_4bit
 
1 Attachment(s)
Các bạn có thể tham khảo các chương trình mẫu này , đây là các bài viết cho lcd 4 hàng 20 cột đã chạy trên mạch thật , dùng CCS4.068, các bạn cho nhận xét nha .
Tài liệu này được sưu tầm từ nguồn Đại Học Sư Phạm Kỹ Thuật và các nguồn khác ...Mong các bạn chỉ bảo thêm.


Múi giờ GMT. Hiện tại là 02:38 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam