View Single Post
Old 14-11-2008, 11:47 AM   #11
tungtuantu
Đệ tử 3 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 54
:
Em xin post code mà em giao tiếp với LCD kiểu 4 bit, với các chân được set tùy ý theo phần cứng, bổ xung thêm theo code của bác hàm :
lcd_putstr("string here"); //Xuat 1 ky tu hay 1 chuoi ky tu
lcd_gotoxy(int x, int y ); //Nhay den cot x, hang y
Để bạn nào mới học như em có thêm nguồn tham khảo
Em rất cám ơn bác namqn tận tình giúp đỡ em

Code:
;	Nhung tap tin can thiet khac: p30F4011.gld, p30f4011.h					   *

;	Phan cung:																   *
;					LCD_EN = RC13											   *
;					LCD_RW = RB8											   *
;					LCD_RS = RB7											   *
;					LCD_D4 = RC14											   *
;					LCD_D5 = RE8											   *
;					LCD_D6 = RD1											   *
;					LCD_D7 = RD3											   *
;	Chuong trinh nay dung che do giao tiep 4-bit voi LCD,					   *
										
------------------------------------------------------------------------------*/
#include "p30f4011.h"

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);		//Clock = 32 MHz
	_FWDT(WDT_OFF);
	_FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
	_FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)

#define	ms_count	125			//So dem tuong ung voi 1 ms, cho timer 1


#define	LCD_EN	_LATC13			//Tin hieu Enable cho LCD, chan RE8
#define	LCD_RW	_LATB8			//Tin hieu Read/Write cho LCD, chan RD0
#define	LCD_RS	_LATB7			//Tin hieu Reset cho LCD, chan RD1
		
#define LCD_D4   _LATC14		//Cac tin hieu Data cho LCD, chan (D4..D7)
#define LCD_D5   _LATE8
#define LCD_D6   _LATD1
#define LCD_D7   _LATD3
	
#define	TRIS_LCD_D4	_TRISC14	//Tristate cua cac tin hieu Data cho LCD
#define	TRIS_LCD_D5	_TRISE8
#define	TRIS_LCD_D6	_TRISD1
#define	TRIS_LCD_D7	_TRISD3

#define	LCD_clear	0x01		//Xoa man hinh LCD
#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		//Bat man hinh va con tro (nhap nhay)
#define	LCD_4b2l	0x28		//Che do 2 dong, giao tiep 4 bit du lieu
#define	LCD_homeL1	0x80		//Ve dau dong 1
#define	LCD_homeL2	0xC0		//Ve dau dong 2
#define lcd_line_two 0x40

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);				//Khoi tao cac cong I/O
void Delay_ms(unsigned int);		//Tao tre n ms
void Init_LCD(void);				//Khoi tao LCD
void LCD_cmd4(unsigned char);		//Xuat lenh ra LCD qua giao tiep 4-bit
void LCD_dat4(unsigned char);		//Xuat du lieu ra LCD qua giao tiep 4-bit
void lcd_putstr(char *buffer);		//Xuat 1 ky tu hay 1 chuoi ky tu
void lcd_gotoxy(int x, int y );		//Nhay den cot x, hang y


//------------------------------------------------------------------------------
//Chuong trinh chinh
void main() 
{
	_TRISE3 = 0;
					
	Init_PORTS();				//Khoi tao cac cong I/O
	Init_LCD();					//Khoi tao LCD	
    lcd_putstr("NGUYEN THE TUNG");
	lcd_gotoxy(4,2);
	lcd_putstr("DTD45-DH1");
	while (1) 
	{	
		_LATE3=1;
		Delay_ms(250);		//Vong lap chinh
		_LATE3=0;
		Delay_ms(250);
	}
}


//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
//------------------------------------------------------------------------------
void Init_PORTS(void) 
{
	LCD_D4 = 0;				//Xoa cac bit chot du lieu LCD
	LCD_D5 = 0;
	LCD_D6 = 0;
	LCD_D7 = 0;
	
	TRIS_LCD_D4 = 0;		//Cac chan du lieu LCD la ngo ra
	TRIS_LCD_D5 = 0;
	TRIS_LCD_D6 = 0;
	TRIS_LCD_D7 = 0;
	
	LCD_EN = 0;
	_TRISC13 = 0;			//RE8 la ngo ra, noi vao Enable cua LCD
	LCD_RW = 0;
	_TRISB8 = 0;			//RD0 la ngo ra, noi vao R/W cua LCD
	LCD_RS = 0;
	_TRISB7 = 0;			//RD1 la ngo ra, noi vao Reset cua LCD
}

//Chuong trinh con delay bang timer 1, tre n ms
//TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 MHz)
//------------------------------------------------------------------------------
void Delay_ms(unsigned int n)
{
	TMR1 = 0;					//Xoa so dem trong TMR1
	T1CON = 0x0020;				//Dung fcy lam clock, prescale = 1:64, tat Timer 1
	PR1 = n*ms_count;			//Dat nguong tran vao PR1							
	T1CONbits.TON = 1;			//Bat timer 1
	while (!_T1IF );			//Cho den khi het thoi gian cho
	_T1IF = 0;					//Xoa co ngat cua Timer 1
	T1CONbits.TON = 0;			//Tat timer 1
	
}

//Chuong trinh con khoi tao module LCD
//------------------------------------------------------------------------------
void Init_LCD(void) {
	LCD_cmd4(LCD_4b2l);			//Dat che do giao tiep 4-bit, man hinh 2 dong
	Delay_ms(1);
	LCD_cmd4(LCD_off);			//Tat man hinh
	Delay_ms(1);
	LCD_cmd4(LCD_normal);		//Che do nhap du lieu binh thuong
	Delay_ms(1);
	LCD_cmd4(LCD_on);			//Bat man hinh, hien con tro nhap nhay
	Delay_ms(1);
	LCD_cmd4(LCD_clear);		//Xoa man hinh
	Delay_ms(5);

}

//Chuong trinh con xuat lenh o che do 4 bit
//------------------------------------------------------------------------------
void LCD_cmd4(unsigned char cmd) {
	unsigned temp1, i;
	LCD_RW = 0;
	LCD_RS = 0;					//Dat che do xuat lenh
	temp1 = cmd >> 4;			//Lay 4 bit cao
	LCD_D4 = temp1 & 1;			//Xuat 4 bit cao
	LCD_D5 = (temp1 & 2) >>1;
	LCD_D6 = (temp1 & 4) >>2;
	LCD_D7 = (temp1 & 8) >>3;
	LCD_EN = 1;					//Tao xung Enable
	for (i = 0; i < 2; i++);	//keo dai toi thieu 1 us
	LCD_EN = 0;
	temp1 = cmd & 0x0F;			//Lay 4 bit thap
	LCD_D4 = temp1 & 1;			//Xuat 4 bit thap
	LCD_D5 = (temp1 & 2) >>1;
	LCD_D6 = (temp1 & 4) >>2;
	LCD_D7 = (temp1 & 8) >>3;
	LCD_EN = 1;		//Tao xung Enable
	for (i = 0; i < 2; i++);	//keo dai toi thieu 1 us
	LCD_EN = 0;
}

//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char dat) {
	unsigned temp2, i;
	LCD_RW = 0;
	LCD_RS = 1;					//Dat che do xuat du lieu
	temp2 = dat >> 4;			//Lay 4 bit cao
	LCD_D4 =  temp2 & 1;		//Xuat 4 bit cao
	LCD_D5 = (temp2 & 2) >>1;
	LCD_D6 = (temp2 & 4) >>2;
	LCD_D7 = (temp2 & 8) >>3;
	LCD_EN = 1;					//Tao xung Enable
	for (i = 0; i < 2; i++);	//keo dai toi thieu 1 us
	LCD_EN = 0;
	temp2 = dat & 0x0F;			//Lay 4 bit thap
	LCD_D4 =  temp2 & 1;		//Xuat 4 bit thap
	LCD_D5 = (temp2 & 2) >>1;
	LCD_D6 = (temp2 & 4) >>2;
	LCD_D7 = (temp2 & 8) >>3;
	LCD_EN = 1;					//Tao xung Enable
	for (i = 0; i < 2; i++);	//keo dai toi thieu 1 us
	LCD_EN = 0;
}
//Chuong trinh con xuat 1 ky tu hay 1 chuoi ky tu
//------------------------------------------------------------------------------
void lcd_putstr(char *buffer)
{

    while(*buffer != '\0')
    {
        LCD_dat4(*buffer); 	/* calling another function */
                                /* to write each char to the lcd module */
        buffer++;
		Delay_ms(1);
		
    }
}
//Chuong trinh con nhay den cot x, dong y
//------------------------------------------------------------------------------
void lcd_gotoxy(int x, int y)
{
	int address;
	
	if(y != 1) address = lcd_line_two;
	else address=0;
	
	address += x-1;
	LCD_cmd4( 0x80 | address);
	Delay_ms(1);
}
tungtuantu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn