Em thử vẫn vẫn cảnh báo như vậy anh ạ . Em thử chương trình khác nó cũng cảnh báo như vậy nhưng vẫn chạy, còn chương trình LCD thì nó vẫn không chịu hiển thị. Anh xem lại cho em chương trình LCD xem sao.
Code:
#include "p30f4012.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);
_FICD(ICS_NONE);
//------------------------------------------------------------------------------
//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 EN LATB2 //Tin hieu Enable cho LCD, chan RB2 //
#define RS LATB1 //Tin hieu Reset cho LCD, chan RB1 //
#define D4 LATF2 //Cac tin hieu Data cho LCD, chan RE0..RE3 (D4..D7) // // // //
#define LCD_TRISD4 TRISD4
#define D5 LATF3
#define LCD_TRISD5 TRISD5
#define D6 LATE4
#define LCD_TRISD6 TRISD6
#define D7 LATE5
#define LCD_TRISD7 TRISD7 // //
#define LCD_homeL1 0x80 //Ve dau dong 1
#define LCD_homeL2 0xC0 //Ve dau dong 2
//Cac prototype cho cac chuong trinh con
void Init_PORTS(void); //Khoi tao cac cong I/O
void Init_TMR1(void); //Khoi tao Timer 1
void Delay_ms(unsigned int); //Tao tre mot so 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
//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0x0400)))
//Chuoi ky tu se xuat ra LCD
Chuoi1[]="Hello world!\0"; //Chuoi ky tu se duoc xuat ra LCD
//Cac bien toan cuc
unsigned char time_out, idx;
//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
Init_TMR1(); //Khoi tao cho TMR1
Init_PORTS(); //Khoi tao cac cong I/O
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);
idx = 0;
Delay_ms(50);
Init_LCD();
Delay_ms(500);
while (Chuoi1[idx]) { //Xuat chuoi ra dong thu nhat cua LCD
LCD_dat4(Chuoi1[idx++]);
Delay_ms(1);
};
LCD_cmd4(LCD_homeL2);
Delay_ms(1);
idx = 0;
while (Chuoi1[idx]) { //Xuat chuoi ra dong thu hai cua LCD
LCD_dat4(Chuoi1[idx++]);
Delay_ms(1);
};
while (1) { //Vong lap chinh
};
}
//Chuong trinh con khoi tao Timer 1
//TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 MHz)
//------------------------------------------------------------------------------
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = ms_count; //TMR1 tran moi ms
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x0020; //Dung fcy lam clock, prescale = 1:64, tat Timer 1
_T1IE = 1; //Cho phep ngat Timer 1
}
//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
//------------------------------------------------------------------------------
void Init_PORTS(void) {
LATFbits.D4 = 0;
LATFbits.D5 = 0;
LATEbits.D6 = 0;
LATEbits.D7 = 0;
_TRISF2 = 0;
_TRISF3 = 0; //Cac chan du lieu LCD la ngo ra
_TRISE4 = 0;
_TRISE5 = 0;
//LATFbits.LCD_BL = 1;
//_TRISF3 = 0; //RF3 la ngo ra, noi vao back light LED
LATBbits.EN = 0;
_TRISB2 = 0; //RE8 la ngo ra, noi vao Enable cua LCD
//LATDbits.LCD_RW = 0;
//_TRISD0 = 0; //RD0 la ngo ra, noi vao R/W cua LCD
LATBbits.RS = 0;
_TRISB1 = 0; //RD1 la ngo ra, noi vao Reset cua LCD
}
//Chuong trinh con delay bang timer 1, nhan 1 tham so la so ms can delay
//------------------------------------------------------------------------------
void Delay_ms(unsigned n) {
PR1 = n*ms_count; //Dat nguong tran vao PR1
time_out = 0; //Xoa co het thoi gian cho
T1CONbits.TON = 1; //Bat timer 1
while (time_out == 0); //Cho den khi het thoi gian cho
T1CONbits.TON = 0; //Tat timer 1
TMR1 = 0;
}
//Chuong trinh con khoi tao module LCD
//------------------------------------------------------------------------------
void Init_LCD(void)
{
Delay_ms(1); // Delay 1 mS
LCD_cmd4(0x32); // 4 bits interface
LCD_cmd4(0x28); // Display 2 rows, font of sistem is 5x7
LCD_cmd4(0x0e); // Display and blink the cursor
LCD_cmd4(0x01); // Clear screen and return to the head of the first line
LCD_cmd4(0x06); // Shift all display to the right
Delay_ms(3); // Delay 3 mS
}
void Write2Pins(unsigned char Nibber)
{
LATEbits.D7 = (Nibber & 0x08)>>3;
LATEbits.D6 = (Nibber & 0x04)>>2;
LATFbits.D5 = (Nibber & 0x02)>>1;
LATFbits.D4 = (Nibber & 0x01);
}
//Chuong trinh con xuat lenh o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char Data)
{
unsigned char LowNibble,HighNibble;
LowNibble = Data & 0x0f;
HighNibble = (Data & 0xf0)>>4;
Write2Pins(HighNibble);
LATBbits.RS = 0;
LATBbits.EN = 1;
LATBbits.EN = 0;
Write2Pins(LowNibble);
LATBbits.EN = 1;
LATBbits.EN = 0;
Delay_ms(11);
}
//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_cmd4(unsigned char Str)
{
unsigned char LowNibble,HighNibble;
LowNibble = Str & 0x0f;
HighNibble = (Str & 0xf0)>>4;
Write2Pins(HighNibble);
LATBbits.RS = 0;
LATBbits.EN = 1;
LATBbits.EN = 0;
Write2Pins(LowNibble);
LATBbits.EN = 1;
LATBbits.EN = 0;
Delay_ms(11);
}
//Chuong trinh xu ly ngat Timer 1
//------------------------------------------------------------------------------
void _ISR _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
time_out = 1;
}