Trích:
Nguyên văn bởi namqn
Code của tôi dùng cho trường hợp 4 bit dữ liệu vào ra LCD nằm ở 4-bit của port E. Bạn dùng cả hai port E và F để xuất/nhập dữ liệu với LCD thì trước khi xuất xung Enable bạn phải thao tác dữ liệu trên cả hai port E và F, để ghi ra LCD. Code hiện thời của bạn chưa làm được điều đó.
Thân,
|
Em đã cấu hình lại chân và thực hiện thao tác bit như anh nói nhưng không hiểu sao nó không chạy. đây là code em viết lại :
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);
//------------------------------------------------------------------------------
//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)
{
LATFbits.D4 = (Nibber & 0x08)>>3;
LATFbits.D5 = (Nibber & 0x04)>>2;
LATEbits.D6 = (Nibber & 0x02)>>1;
LATEbits.D7 = (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;
}