![]() |
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" |
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.
|
1 Attachment(s)
Bạn thử test = file này xem LCD bạn có sd được ko?
|
Trích:
|
Trích:
|
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 |
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.
|
1 Attachment(s)
Trích:
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 |
Trích:
|
bạn thử cho chân RW nối mass thử.
|
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ỉ |
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. |
Trích:
Bạn nào biết thì giúp mình nhé |
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 |
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 ạ. |
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 |
2 Attachment(s)
Trích:
Code:
#include <16F877A.h> |
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 |
à, 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 |
Trích:
|
Trích:
|
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