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 05-04-2012, 05:06 PM   #1
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
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");

}
doremon217 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2012, 11:02 PM   #2
dientu90
Đệ tử 1 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 16
:
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
dientu90 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 12:09 AM   #3
phamhang
Nhập môn đệ tử
 
Tham gia ngày: Dec 2011
Bài gửi: 8
:
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.
phamhang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 01:06 PM   #4
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 01:28 PM   #5
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
Ý 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) à.
doremon217 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 02:25 PM   #6
phamhang
Nhập môn đệ tử
 
Tham gia ngày: Dec 2011
Bài gửi: 8
:
không. bạn delay_ms(1000) trc lcd_init(); xem sao
phamhang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 04:27 PM   #7
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
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 ạ.
doremon217 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 10:39 PM   #8
bnthang
Đệ tử 3 túi
 
Tham gia ngày: Apr 2010
Bài gửi: 58
:
Bạn nên xem lại cả file lcd.c nữa.
__________________
Mừng năm mới, khuyến mãi đặc biệt giảm giá 20% tất cả các kit từ ngày 01/01/2013 đến ngày 30/03/2013 -> số lượng có hạn nhé.
DT: 0983.548.514.
www.picdevelopmenttool.webs.com
www.smart-house.webs.com
www.robot3t.com
bnthang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-04-2012, 11:51 PM   #9
dientu90
Đệ tử 1 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 16
:
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
dientu90 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 11:14 AM   #10
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
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.
doremon217 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 02:42 PM   #11
dientu90
Đệ tử 1 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 16
:
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
dientu90 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 03:02 PM   #12
bnthang
Đệ tử 3 túi
 
Tham gia ngày: Apr 2010
Bài gửi: 58
:
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.
__________________
Mừng năm mới, khuyến mãi đặc biệt giảm giá 20% tất cả các kit từ ngày 01/01/2013 đến ngày 30/03/2013 -> số lượng có hạn nhé.
DT: 0983.548.514.
www.picdevelopmenttool.webs.com
www.smart-house.webs.com
www.robot3t.com
bnthang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 04:52 PM   #13
doremon217
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 9
:
@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);
}

thay đổi nội dung bởi: doremon217, 07-04-2012 lúc 04:57 PM.
doremon217 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 05:19 PM   #14
thanhphong.91
Nhập môn đệ tử
 
Tham gia ngày: Apr 2012
Bài gửi: 9
:
Đâ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!!!
Hình Kèm Theo
File Type: png yeucauphancung.png (21.6 KB, 0 lần tải)
File Type: png yeucau.png (34.2 KB, 0 lần tải)
thanhphong.91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2012, 06:08 PM   #15
aramis
Nhập môn đệ tử
 
Tham gia ngày: Apr 2012
Bài gửi: 2
:
Bạn tăng thời gian Delay lwn đi chứ 100ms nhanh lắm
aramis 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à 10:41 PM.


Đượ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