PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các đề tài khác (http://www.picvietnam.com/forum/forumdisplay.php?f=28)
-   -   xin giúp về khởi tạo LCD 16x2 chế độ 4bit (http://www.picvietnam.com/forum/showthread.php?t=6097)

DKNET 08-04-2010 04:40 PM

xin giúp về khởi tạo LCD 16x2 chế độ 4bit
 
hiện tại em đang kết nối LCD với DSPIC 33FJ64MC706 (chíp dùng nguồn 3.3V còn LCD được cấp 5V). em đặt tốc độ hoạt động chíp là 40MIPS. (Tcy=0.025us). em khởi tạo LCD nhưng không thấy chạy. các anh giúp em sửa code với!

đây là code của em. các hàm delay em đã thử và chạy đúng. giờ chỉ còn vấn để khởi tạo LCD thôi ạ.

http://www.mediafire.com/?j1mzwzzhtyd

nbb3i 10-12-2010 02:44 PM

Hàm delay của bạn chạy đúng nhưng không hiểu tại sao trong trường hợp này nó lại làm cho chương trình của bạn chạy sai.
thư viện C30 hỗ trợ sẵn các hàm delay_ms và delay_us rồi nên chỉ việc gọi ra dùng thôi chứ không cần phải tự viết nữa.
Bạn có thể chèn mấy dòng lệnh sau vào đầu chương trình là OK thôi.
Code:

#define        FOSC                  32000000LL          // clock-frequecy in Hz with suffix LL (64-bit-long), eg. 32000000LL for 32MHz
#define        FCY              (FOSC/2)                  // MCU is running at FCY MIPS
#define                delay_us(x) __delay32(((x*FCY)/1000000L))        // delays x us
#define        delay_ms(x) __delay32(((x*FCY)/1000L))          // delays x ms


falleaf 10-12-2010 03:51 PM

http://products.rpc.vn/tools/book1/

Xem source mẫu viết cho PIC16F887 ở đây rồi tự biên tự diễn.

Chúc vui

kiensnow 30-07-2011 08:37 PM

Em viết hàm LCD sau, debug thì tất cả các giá trị đều chạy đúng theo mong muốn, nhưng ko hiểu sao khi cho vào mạch thì LCD không hiện gì cả
Mong các cao nhân giúp đỡ
#include<p33fj12gp202.h>
_FOSCSEL(FNOSC_FRC)
_FOSC(FCKSM_CSDCMD&POSCMD_NONE)
_FWDT(FWDTEN_OFF)


//so dem vao pr1 tuong ung 1 s
#define giay 500;


// DINH NGHIA CAC CHAN
#define LCD_EN LATA0
#define LCD_RS LATA2
#define LCD_RW LATA1

// DINH NGHIA CAC CHAN DU LIEU LCD
#define LCD_DAT LATB
#define LCD_TRIS TRISB


// DINH NGHIA CAC CHE DO HOAT DONG CUA LCD
#define LCD_4b2l 0x28
#define LCD_clear 0x01
#define LCD_home 0x02 // tro ve dau dong
#define LCD_normal 0x06 // che do nhap du lieu binh thuong
#define LCD_normal_s 0x07 // che do nhap du lieu binh thuong, dich man hinh
#define LCD_off 0x08 // tat man hinh
#define LCD_on 0x0C // bat man hinh
#define LCD_on_crsr 0x0E // bat man hinh va con tro
#define LCD_on_blink 0x0F //........nhap nhay
#define LCD_homel1 0x80 //tro ve dau dong 1
#define LCD_homel2 0xco // tro ve dau dong 2
#define LCD_mv 0x10 // dich con tro sang phai

// cac chuong trinh con
void Init_TMR1(void);
void Init_PORTS(void);
void LCD_data(unsigned char tmp );
void LCD_cmd(unsigned char tmp);
void Init_LCD(void);
void delay_ms( unsigned int n );

// khai bao hang so
const unsigned char __attribute__ ((space(psv),address (0x0400)))
chuoi1[]="abcdefghjiklmn\0";
unsigned int idx,flag;

int main(void)
{


idx=0;
Init_TMR1();
Init_PORTS();
_PSV=1;
PSVPAG=__builtin_psvpage(chuoi1);
delay_ms(50);
Init_LCD();
delay_ms(500);

while(chuoi1[idx])
{
LCD_data( chuoi1[idx++]);
delay_ms(5);
}

while(1) {};

}

//chuong trinh con
void Init_PORTS(void)
{
LATB=0x0000;
TRISB=0xFFF0;
LATA=0x0000;
TRISA=0x18;
}
void Init_TMR1(void)
{
TMR1=0;
PR1=giay;
_T1IF=0;
T1CON=0x8010;
_T1IE=1;
}

void delay_ms(unsigned int n )
{
TMR1=0;
PR1=n*giay;
flag=0;
T1CONbits.TON=1;
while(flag==0) ;
T1CONbits.TON=0;
}
void Init_LCD(void)
{

LCD_cmd(0x33);
delay_ms(5);
LCD_cmd(0x33);
delay_ms(1);
LCD_cmd(0x33);
delay_ms(1);
LCD_cmd(0x28);
delay_ms(1);
LCD_cmd(LCD_off);
delay_ms(1);
LCD_cmd(LCD_normal);
delay_ms(1);
LCD_cmd(LCD_on_blink);
delay_ms(1);
LCD_cmd(LCD_clear);
delay_ms(5);
//LCD_cmd(0x10);
//delay_ms(10);
}
void LCD_cmd(unsigned char cmd )
{
unsigned buf,j;
LATAbits.LCD_RW=0;
LATAbits.LCD_RS=0;
buf=LCD_DAT&0xFFF0;
LCD_DAT=buf | (cmd>>4);
//buf=tmp>>4; // lay 4 bit cao
//LATB= 0x000f&buf;
LATAbits.LCD_EN=1;
for(j=0;j<100;j++);
LATAbits.LCD_EN=0;

buf= LCD_DAT&0xFFF0;
LCD_DAT=buf | (cmd & 0x0F);
//LATB=0x000f&tmp;
LATAbits.LCD_EN=1;
for(j=0;j<100;j++);
LATAbits.LCD_EN=0;
}
void LCD_data( unsigned char data)
{
unsigned buf,j;
LATAbits.LCD_RW=0;
LATAbits.LCD_RS=1;
buf=LCD_DAT&0xFFF0;
LCD_DAT=buf|(data>>4);
//buf=tmp>>4; // lay 4 bit cao
//LATB= 0x000f&buf;
LATAbits.LCD_EN=1;
for(j=0;j<100;j++);
LATAbits.LCD_EN=0;

buf= LCD_DAT&0xFFF0;
LCD_DAT=buf|(data&0x0F);
//LATB=0x000f&tmp;
LATAbits.LCD_EN=1;
for(j=0;j<100;j++);
LATAbits.LCD_EN=0;

}
void _ISR _T1Interrupt (void)
{
_T1IF=0;
flag=1;
}


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