PDA

View Full Version : Trục trặc với LCD


mingkang
02-08-2009, 11:00 PM
Mình vừa mua LCD TC1602A-09, về đem gắn vào mạch cùng mới con PIC6F877A, viết chương trình xuất dòng chữ "Mr.Khang", nạp vào PIC, rồi gắn vào mạch chạy thử thì LCD không xuất hiện dòng chữ nào, màn hình chỉ sáng nền LED thôi, chạy trên mô phỏng thì OK, có phải LCD bị hư không ?
Phần cứng đấu nối như hình bên dưới:
http://upanh.com/uploads/02-Aug-2009/7ix1fvxj9gfvsrx5v346.jpg
Đoạn chương trình đơn giản:

#include "16F877A.h"

#use delay(clock=4000000)

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <LCD.C>

void main(void)
{
set_tris_d(0x00);
lcd_init();
printf(lcd_putc,"Mr.Khang");
}

Xin được giúp đỡ. Thanks trước.

phamminhtuan
02-08-2009, 11:28 PM
Bạn chỉnh điện áp ngõ ra ở chân Vo hay Vee gì đó, điều chỉnh ở độ đậm nhạt của LCD, có thể là do quá mờ mà bạn không thể thấy.

vidieukhiencdn
02-08-2009, 11:34 PM
Bạn thử test = file này xem LCD bạn có sd được ko?

mingkang
03-08-2009, 12:04 AM
Bạn thử test = file này xem LCD bạn có sd được ko?
hình như file này đấu nối chân khác kiểu của mình phải không ?

mingkang
03-08-2009, 12:14 AM
Bạn thử test = file này xem LCD bạn có sd được ko?
Tình hình là đã chỉnh sửa mã nguồn cho phù hợp với cách đấu nối chân của mạch của mình, biên dịch lại rùi chạy vẫn không thấy gì...hic

nvtiep3ik50hut
09-08-2009, 06:23 PM
Theo mình cái phần khai báo:
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
Bạn thử sửa thành như này xem:
#FUSES HS,NOWDT,PUT,NOPROTECT,NOLVP

nhoczin
09-08-2009, 08:32 PM
Mình cho rằng đây là lỗi phần cứng nhiều hơn, bạn ktra LCD bằng cách xóa hết chương trình trên PIC đi, cắm thẳng chân VEE xuống đất, nếu nó hiện dòng 1 toàn ô 5x7 màu đen là ok, LCD vẫn còn chạy, tiếp đó kiểm tra các chân cẳng, dây dợ xem có bị lỏng hay bị chập ko.

nbb3i
11-08-2009, 02:38 AM
Mình cho rằng đây là lỗi phần cứng nhiều hơn, bạn ktra LCD bằng cách xóa hết chương trình trên PIC đi, cắm thẳng chân VEE xuống đất, nếu nó hiện dòng 1 toàn ô 5x7 màu đen là ok, LCD vẫn còn chạy, tiếp đó kiểm tra các chân cẳng, dây dợ xem có bị lỏng hay bị chập ko.
Sau khi đảm bảo rằng thằng LCD ko vấn đề gì thì bạn gắn thêm 1 con biến trở (loại vi chỉnh 10K hoặc 20K). Chân giữa của con biến trở gắn vào chân VEE rồi bắt đầu vặn :D đến khi nào dòng thứ nhất của LCD xuất hiện màu đen mờ mờ (nếu đậm quá thì vặn ngược lại cho nó nhạt bớt. Rồi sau đó kiểm tra 7 dây tín hiệu còn lại xem từ LCD tới PIC nó đã thông chưa (đừng kiểm tra bằng mắt nhé:D). Đảm bảo nối dây đúng như khai báo trong PIC rồi thì bạn nạp chương trình đã nạp trên Proteus xuống PIC rồi xem kết quả.
Nếu chữ của bạn xuất hiện thì bạn chỉnh lại cái biến trở sao cho chữ hiện lên nét nhất là được. Còn nếu nó ko xuất hiện thì tớ cũng pó tay. Lấy cái búa ra phang cho vài phát rồi đi mua PIC mới LCD mới :D
http://www.picvietnam.com/forum/attachment.php?attachmentid=2880&stc=1&d=1249929844

vo_cam
11-08-2009, 05:28 PM
hình như file này đấu nối chân khác kiểu của mình phải không ?
điều chỉnh điện áp chân VEE của LCD, để độ tương phản đủ cho bạn nhìn thấy ký tự hiển thị trên LCD.Chúc thành công!

sonduy1
11-08-2009, 06:52 PM
bạn thử cho chân RW nối mass thử.

ranhcon
13-08-2009, 01:06 PM
bác nối chân VEE (3) xuống GND (1) chạy ok ngay, mạch của bác chắc là vẫn chạy nhưng vì ko chỉnh được contrast nên mình không nhìn thấy.
mà sao bác không dùng lệnh lcd_putc("mr khang"); nhỉ

nghia_tdh21
13-08-2009, 04:10 PM
không biết bạn dùng mạch nạp loại nào, khi nạp bạn phải nhớ cấu hình bộ dao động cho đúng thì mới chạy.
Mình không cấu hình bằng dòng khai báo theo kiểu #FUSE...
Mình thường cấu hình cho pic ở trên chương trình nạp.

trongtuan_1109
20-09-2010, 11:19 PM
Sau khi đảm bảo rằng thằng LCD ko vấn đề gì thì bạn gắn thêm 1 con biến trở (loại vi chỉnh 10K hoặc 20K). Chân giữa của con biến trở gắn vào chân VEE rồi bắt đầu vặn :D đến khi nào dòng thứ nhất của LCD xuất hiện màu đen mờ mờ (nếu đậm quá thì vặn ngược lại cho nó nhạt bớt. Rồi sau đó kiểm tra 7 dây tín hiệu còn lại xem từ LCD tới PIC nó đã thông chưa (đừng kiểm tra bằng mắt nhé:D). Đảm bảo nối dây đúng như khai báo trong PIC rồi thì bạn nạp chương trình đã nạp trên Proteus xuống PIC rồi xem kết quả.
Nếu chữ của bạn xuất hiện thì bạn chỉnh lại cái biến trở sao cho chữ hiện lên nét nhất là được. Còn nếu nó ko xuất hiện thì tớ cũng pó tay. Lấy cái búa ra phang cho vài phát rồi đi mua PIC mới LCD mới :D
http://www.picvietnam.com/forum/attachment.php?attachmentid=2880&stc=1&d=1249929844
Bạn ơi cho mình hỏi sao mình xem datasheet con LCD TC1602A thì nó ko có hướng dẫn cách nối dây như file đính kèm của bạn vậy?
Bạn nào biết thì giúp mình nhé

kidmaster08
21-09-2010, 08:41 AM
các bạn ơi cho mình hỏi về lệnh của 16f877a
những lệnh nào có 1 chu kỳ lệnh
những lệnh nào cần 2
lệnh ý mình muốn nói đến là lệnh asm ấy.mình thích ngôn ngữ này hơn vì nó giúp mình kiểm soát được hệ thống

ilusmmf
17-12-2010, 01:11 AM
mình coppy đoạn code và phần cứng trong micro c và biên dịch trên micro c
char *text = "mikroElektronika";

void main() {
TRISB = 0; // PORTB is output
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,2,0,3); // Initialize LCD on PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF); // Turn off cursor
Lcd_Custom_Out(1, 1, text); // Print text at LCD
}

mô phỏng trên protues thì chạy rồi nhưng khi làm mạch thực thì chỉ thấy một màng hình 16x2 ô màu đen.( 2 chân a, k của lcd chân 16-gnd, chân 15 qua trở 330 nối lên 5 V).Chỉnh biến trở thì độ đậm nhạt có thay đổi nhưng chữ vẫn không hiện. Mình đã kiểm tra con Pic 16f877a bằng cách cho chương trình chạy led đơn giản thì vẫn chạy tốt, sợ lcd hư nên mượn lcd của đứa bạn kiểm tra thử vẫn bị tình trạng như trên. Mình không biết phải làm gì nữa, mong được sự giúp đỡ, mình rất cảm ơn.
mình nạp mạch bằng win pic 800 ở trên có bạn chỉ phải chỉnh lại khi nạp mạch, cho mình hỏi rõ là chỉnh như thế nào ạ.

hangocminh1989
29-03-2011, 12:16 PM
em có con lcd 1602A mà sao vật vã mấy ngày nay không thể nào cho nó hiển thị nổi 1 kí tự các bác ơi.
các bác xem giúp em có vấn đề gì không nhé.
dưới đây là code và sơ đồ kết nối
#include <16f877a.h>
#include <DEF_877A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
struct lcd_pin_map { // This structure is overlayed
BOOLEAN rs; // on to an I/O port to gain
BOOLEAN rw; // access to the LCD pins.
BOOLEAN enable; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif
#ifndef lcd_type
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
#define set_tris_lcd(x) set_tris_d(x)
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {135,0,0,0,0,}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init()
{
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
void main()
{
lcd_init();
set_tris_d(0x00);
//set_tris_c(0x00);
while(1);
{
//output_high(pin_c0);
//delay_ms(200);
//output_low(pin_c2);
//delay_ms(200);
//setup_timer_2(T2_DIV_BY_4,124,1);
//SETUP_CCP2(CCP_PWM);
//SET_PWM2_DUTY(50);
lcd_putc("hello pic");
}
}
thanks

tdm
29-03-2011, 10:00 PM
em có con lcd 1602A mà sao vật vã mấy ngày nay không thể nào cho nó hiển thị nổi 1 kí tự các bác ơi.
các bác xem giúp em có vấn đề gì không nhé.
dưới đây là code và sơ đồ kết nối
#include <16f877a.h>
#include <DEF_877A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
struct lcd_pin_map { // This structure is overlayed
BOOLEAN rs; // on to an I/O port to gain
BOOLEAN rw; // access to the LCD pins.
BOOLEAN enable; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif
#ifndef lcd_type
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
#define set_tris_lcd(x) set_tris_d(x)
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {135,0,0,0,0,}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init()
{
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
void main()
{
lcd_init();
set_tris_d(0x00);
//set_tris_c(0x00);
while(1);
{
//output_high(pin_c0);
//delay_ms(200);
//output_low(pin_c2);
//delay_ms(200);
//setup_timer_2(T2_DIV_BY_4,124,1);
//SETUP_CCP2(CCP_PWM);
//SET_PWM2_DUTY(50);
lcd_putc("hello pic");
}
}
thanks
Kết nối phần cứng sai nên không chạy.

#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

void push_key(void);
int count;
main()
{
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc(" HELLO ");
lcd_gotoxy(1,2);
lcd_putc("PIC VIET NAM");
while(1)
{
}
}

hangocminh1989
29-03-2011, 11:15 PM
mình cảm ơn bạn nhiều lắm, nhưng bạn ơi, bạn cho mình hỏi là không thể dùng chân RD3,4,5,6 của pic như mình kết nối hay sao bạn? em muốn tìm cách sửa cái code để truyền dữ liệu theo phần cứng của em, mong các cao thủ cho em xin ý kiến. các chân rs,rw,enable em đã có thể sửa trong code được rùi, giờ chỉ còn mỗi truyền data nữa thui.
cảm ơn các bác nhìu, mong hồi âm

hangocminh1989
30-03-2011, 01:09 AM
à, em cũng xin hỏi luôn ,câu lệnh : #device *=16 adc=10
có ý nghĩa gì? thiếu có sao không

caovanhuong
30-03-2011, 02:01 AM
à, em cũng xin hỏi luôn ,câu lệnh : #device *=16 adc=10
có ý nghĩa gì? thiếu có sao không
lệnh này là khai báo cầu hình ADC 10bit, nếu không có lệnh này thì không sử dụng duoc ADC của PIC

hangocminh1989
31-03-2011, 01:27 AM
mình cảm ơn bạn nhiều lắm, nhưng bạn ơi, bạn cho mình hỏi là không thể dùng chân RD3,4,5,6 của pic như mình kết nối hay sao bạn? em muốn tìm cách sửa cái code để truyền dữ liệu theo phần cứng của em, mong các cao thủ cho em xin ý kiến. các chân rs,rw,enable em đã có thể sửa trong code được rùi, giờ chỉ còn mỗi truyền data nữa thui.
cảm ơn các bác nhìu, mong hồi âm

sao ko ai nói cho em biết điều này nhỉ?????

langtuphoda
23-11-2011, 02:37 AM
chân V0 mình nghĩ là nên nối với biến trở để chỉnh độ tương phản cho LCD. Ngoài ra còn 1 số trường hợp do bạn viết sai lệnh cmd của LCD cũng khiến nó hok hoạt động được.