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 hiển thị LCD (http://www.picvietnam.com/forum/showthread.php?t=13952)

doremon217 05-04-2012 05:06 PM

Giúp mình hiển thị LCD
 
Mình muốn test thử hiện thị 1 vài kí tự lên LCD dùng pic16f877a. Code mình biên dịch bằng Picc Compiler và mô phỏng trên Proteus đều chạy bình thường. Song khi mình nạp và test trên bo mạch thì không thấy hiện kí tự nào. LCD vẫn sáng. Các bạn có thể chỉ cho mình xem sai ở chỗ nào không. Xin cảm ơn.
Đây là code mình viết:

#include "C:\Program Files\PICC\Projects\LCD hien thi.h"
#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
#define LCD_TYPE 2
#include <lcd.c>


void main()
{
lcd_init();
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!

lcd_gotoxy(1,1);
lcd_putc("dadada");
delay_ms(100);
lcd_putc("\f");
lcd_gotoxy(5,2);
lcd_putc("okfafakdfa");
delay_ms(100);
lcd_putc("\f");

}

dientu90 05-04-2012 11:02 PM

bạn xem chân mclr đã đc nối với điện trở lên vcc chưa,biến trở trên lcd đã điều chỉnh chưa :)

phamhang 06-04-2012 12:09 AM

chào bạn
nếu bạn đã check lại lỗi như bạn dientu90 nói mà lcd vẫn chưa hiển thị dc thì mình nghĩ bạn nên xem lại chỗ khởi tạo lcd của bạn. vì tần số hoạt động của pic nhanh hơn lcd rất nhiều lên chíp khởi tạo xong rồi mà lcd vẫn chưa khởi tạo xong dc. theo mình lúc khởi taaoj lcd bạn nên để delay một khoảng time khoảng 1s nữa bạn ah.

doremon217 06-04-2012 01:06 PM

Mình đã nối chân mclr với điện trở lên vcc và điều chỉnh biến trở. Kết quả là dòng 2 của lcd hiện đen xì, còn dòng 1 thì không hiện gì. Nó vẫn không hiển thị đúng kết quả bạn a.

doremon217 06-04-2012 01:28 PM

Ý bạn phamhang là sao. Mình include hàm lcd.c trong thư viện. Tớ nghĩ trong đấy nó đã khởi tạo và delay cho mình rồi chứ. Vậy nếu muốn làm như cách của cậu tớ nên thêm vào chỗ nào, trước chỗ lcd_gotoxy(1,1) à.

phamhang 06-04-2012 02:25 PM

không. bạn delay_ms(1000) trc lcd_init(); xem sao

doremon217 06-04-2012 04:27 PM

Tớ làm thử như cậu rồi nhưng dòng 2 lcd vẫn hiện đen xì. Đợi 1 lúc nó mất đi rồi cả 2 dòng hiện mờ mờ. Vấn không thấy kí tự nào cậu ạ.

bnthang 06-04-2012 10:39 PM

Bạn nên xem lại cả file lcd.c nữa.

dientu90 06-04-2012 11:51 PM

bạn thiếu vòng lặp while(1),thử bổ xung như thế này xem
while(1)
{
lcd_gotoxy(1,1);
lcd_putc("dadada");
delay_ms(10);
lcd_gotoxy(5,2);
lcd_putc("okfafakdfa");
delay_ms(10);
}
nhớ mắc chân mclr như mình nói không là k chạy pic đâu

doremon217 07-04-2012 11:14 AM

Lúc đầu mình cũng để vòng while(1) để hiển thị liên tục. Nhưng không chạy nên mình bỏ đi.
Mình đã nối chân số1 của pic qua điện trở 10k lên dương nguồn. Có cách nào để kiểm tra con pic ko.
@bnthang ý bạn là kiểm tra gì thế. Mình tưởng hàm đấy là thư viện chuẩn để sử dụng lcd.

dientu90 07-04-2012 02:42 PM

1 là pic của bạn hỏng,2 là bạn cắm board không chính xác các chân điều khiển và data chứ với code trên mình thử cắm trên board thì chạy hoàn toàn bình thường,việc bạn để delay 100ms là quá ít để bạn kịp nhìn thấy chữ hiện lên vì vậy mình thêm while cho bạn tiện quan sát,bạn nên kiểm tra lại chứ code thì hoàn toàn đúng,mình đã kiểm chứng giúp bạn trên mạch thật rồi

bnthang 07-04-2012 03:02 PM

Các hàm điều khiển có thể cả chân kết nối nữa đều năm trong file lcd.c. Bạn phải gởi cả file này nữa mới kiểm tra được.

doremon217 07-04-2012 04:52 PM

@dientu09: Mình nghĩ pic hỏng thì chắc ko phải vì khi nạp code mình vẫn thấy báo nhận device. Còn cắm bo sai thì chắc cũng không vì mạch này đơn giản mà, mình chỉ sợ chân nào đấy cắm chưa chặt thôi.
@bnthang: đây là toàn bộ file lcd.c. Mình đính kèm file mấy lần không được đành cop paste ra đây vậy.
Tình hình là cứ cắm nguồn vào thì dòng2 lcd vẫn hiện đen xì. Nếu mình để delay trước lcd_gotoxy thì một lúc sau sẽ mất và hiển thị cả 2 dòng đen nhưng nhạt hơn. Nếu mình không để delay thì dòng2 lcd hiện đen xì mãi.

///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // 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
#define set_tris_lcd(x) set_tris_b(x)
#else
#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line


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 = {0,0,0,0,15}; // 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);
}

thanhphong.91 07-04-2012 05:19 PM

2 Attachment(s)
Đây là đồ án thầy giao, mong a chị giúp với, nhìn vào em chả biết lập trình trong micro c như thế nào nữa.
Cho em xin code của c nếu có hihi

dưới đây là hình nè:

[ATTACH=CONFIG]42592[/ATTACH]
[ATTACH=CONFIG]42593[/ATTACH]
mong từng ngày!!!

aramis 07-04-2012 06:08 PM

Bạn tăng thời gian Delay lwn đi chứ 100ms nhanh lắm


Múi giờ GMT. Hiện tại là 10:39 PM.

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