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)
-   -   Trục trặc với LCD (http://www.picvietnam.com/forum/showthread.php?t=4684)

mingkang 02-08-2009 11:00 PM

Trục trặc với LCD
 
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...fvsrx5v346.jpg
Đoạn chương trình đơn giản:
Code:

#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

1 Attachment(s)
Bạn thử test = file này xem LCD bạn có sd được ko?

mingkang 03-08-2009 12:04 AM

Trích:

Nguyên văn bởi vidieukhiencdn (Post 28305)
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

Trích:

Nguyên văn bởi vidieukhiencdn (Post 28305)
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

1 Attachment(s)
Trích:

Nguyên văn bởi nhoczin (Post 28506)
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/atta...1&d=1249929844

vo_cam 11-08-2009 05:28 PM

Trích:

Nguyên văn bởi mingkang (Post 28307)
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

Trích:

Nguyên văn bởi nbb3i (Post 28539)
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/atta...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

1 Attachment(s)
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

1 Attachment(s)
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

2 Attachment(s)
Trích:

Nguyên văn bởi hangocminh1989 (Post 43161)
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.
Code:

#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

Trích:

Nguyên văn bởi hangocminh1989 (Post 43194)
à, 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

Trích:

Nguyên văn bởi hangocminh1989 (Post 43184)
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.


Múi giờ GMT. Hiện tại là 08:48 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