Bạn tham khảo code này nhé. chip của bạn và chíp của mình gần giống nhau. Bạn chỉ cần thay đổi chân kết nối nữa là dc
#include "p33FJ64MC802.h"
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD&OSCIOFNC_OFF&POSCMD_NONE);
_FICD(ICS_PGD1&JTAGEN_OFF);
_FWDT(FWDTEN_OFF);
#define LCD_RS LATBbits.LATB13
#define LCD_RW LATBbits.LATB14
#define LCD_E LATBbits.LATB15
#define LCD_D4 LATBbits.LATB2
#define LCD_D5 LATBbits.LATB3
#define LCD_D6 LATBbits.LATB4
#define LCD_D7 LATBbits.LATB5
#define LED LATBbits.LATB12
// DINH NGHIA CAC CHE DO HOAT DONG CUA LCD
#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_OSOC(void);
void Init_PORTS(void);
void Delay_ms(unsigned long i_ms);
void Init_LCD(void);
void LCD_OK(void);
void LCD_CMD(unsigned char cmd);
void LCD_DATA (unsigned char dat);
void lcd_putstr(char *buffer);
void lcd_gotoxy(int x, int y);
void khoi_tao(void);
void LCD_IN_INTER(unsigned int d);
void LCD_IN_FLOAT( float d);
//--------CHUONG TRINH CHINH-------------------------------------------------------------------------------------------
int main (void)
{
Init_OSOC();
Delay_ms(1000);
khoi_tao();
while(1) //Vong lap chinh
{
LED =1;
Delay_ms(1000);
LED=0;
Delay_ms(1000);
}
}
//--------Chuong trinh con khoi tao TRANG THAI BAN DAU----------------------------------------------------------
void khoi_tao(void)
{
Init_PORTS(); //Khoi tao cac cong I/O
Init_LCD(); //Khoi tao LCD
lcd_gotoxy(4,1);
lcd_putstr("HELLO");
lcd_gotoxy(1,2);
lcd_putstr("XIN CHAO");
}
//---------------------------------------------------------------------------------------------------------
void Init_OSOC(void)
{
//Config FCy=40MHz
PLLFBD=43; // M=45
CLKDIVbits.PLLPOST=0; // N2=2
CLKDIVbits.PLLPRE=0; // N1=2
OSCTUN=0;
// Disable Watch Dog Timer
RCONbits.SWDTEN=0; // N1=2
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.COSC != 0b001); // Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
}
//------------------------------------------------------------------------------------------------------
void Init_PORTS(void)
{
ADPCFG = 0xffff; // all digital
// All port is digital pin.
PMD1=0xffff;
PMD2=0xffff;
PMD3=0xffff;
TRISBbits.TRISB2 = 0; //LCD_D4
TRISBbits.TRISB3 = 0; //LCD_D5
TRISBbits.TRISB4 = 0; //LCD_D6
TRISBbits.TRISB5 = 0; //LCD_D7
TRISBbits.TRISB13 = 0; //LCD_RS
TRISBbits.TRISB14 = 0; //LCD_RW
TRISBbits.TRISB15 = 0; //LCD_E
TRISBbits.TRISB12 = 0; // led
}
//------------------------------------------------------------------------------
void Delay_ms(unsigned long i_ms)
{
unsigned long i,j;
for(i=0;i<i_ms;i++)
{
for(j=0;j<1750;j++)
asm("clrwdt");
}
}
//---------------------------------------------------------------------------------------------------------
void Init_LCD(void)
{
LCD_CMD(0x02); //Dat che do giao tiep 4-bit, man hinh 2 dong
Delay_ms(1);
LCD_CMD(0x2C); //Tat man hinh
Delay_ms(1);
LCD_CMD(0x0C); //Che do nhap du lieu binh thuong
Delay_ms(1);
LCD_CMD(0x06 ); //Bat man hinh, hien con tro nhap nhay
Delay_ms(1);
LCD_CMD(0x01); //Xoa man hinh
Delay_ms(9);
}
//---------------------------------------------------------------------------------------------------------
void LCD_OK(void)
{
unsigned u;
LCD_E = 1; //Tao xung Enable
for (u = 0; u < 2; u++); //keo dai toi thieu 1 us
LCD_E = 0;
}
//---------chuong trinh xuat lenh che do 4 bit--------------------------------------------------------------------------------
void LCD_CMD(unsigned char cmd)
{
unsigned temp1;
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_OK();
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_OK();
Delay_ms(5);
}
//----------Chuong trinh con ghi mot ky tu o che do 4 bit--------------------------
void LCD_DATA (unsigned char dat)
{
unsigned temp2;
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_OK();
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_OK();
Delay_ms(5);
}
//-----------Chuong trinh con hien thi 1 chuoi ky tu--------------------------------------------------------------------
void lcd_putstr(char *buffer)
{
while(*buffer != '\0')
{
LCD_DATA(*buffer); /* calling another function */
/* to write each char to the lcd module */
buffer++;
Delay_ms(2);
}
}
//-----------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_CMD( 0x80 | address);
Delay_ms(2);
}
//=======gui so nguyen len lcd==============================
void LCD_IN_INTER(unsigned int d)
{
unsigned i,j,k,l;
l=d/1000;//nghin
k=(d%1000)/100;//tram
j=((d%1000)%100)/10;//chuc
i=((d%1000)%100)%10;//donvi
LCD_DATA(0x30+l);
LCD_DATA(0x30+k);
LCD_DATA(0x30+j);
LCD_DATA(0x30+i);
}
//=======giu so thuc len lcd=============================
void LCD_IN_FLOAT( float d)
{
unsigned int e, i,j,k,l;
// d=round(d,1);
e=(int)(d*10);
l=e/1000;//nghin
k=(e%1000)/100;//tram
j=((e%1000)%100)/10;//chuc
i=((e%1000)%100)%10;//donvi
LCD_DATA(0x30+l);
LCD_DATA(0x30+k);
LCD_DATA(0x30+j);
lcd_putstr(".");
LCD_DATA(0x30+i);
}
|