PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 22-04-2008, 09:02 PM   #1
anhemFSA
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 5
:
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 !

thay đổi nội dung bởi: anhemFSA, 22-04-2008 lúc 09:17 PM.
anhemFSA vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2008, 10:53 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2008, 12:46 AM   #3
tam_pascal
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 8
:
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.
tam_pascal vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-06-2008, 07:13 PM   #4
minhsondaklak
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 96
:
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
...

thay đổi nội dung bởi: minhsondaklak, 01-06-2008 lúc 07:20 PM.
minhsondaklak vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 04:53 AM   #5
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
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

thay đổi nội dung bởi: tieulongnu, 15-10-2009 lúc 05:07 AM.
tieulongnu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 10:42 AM   #6
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Trích:
Nguyên văn bởi tieulongnu View Post
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
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 08:17 PM   #7
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
#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
tieulongnu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 09:28 PM   #8
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Trích:
Nguyên văn bởi tieulongnu View Post
#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.



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
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com

thay đổi nội dung bởi: cskiller, 15-10-2009 lúc 11:59 PM.
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 10:37 PM   #9
tieulongnu
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 16
:
Cảm ơn bạn nhiều , mình đã được hiểu biết rõ
tieulongnu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam