Chào các bạn.
Tình hình là tôi đang viết code cho LCD, dịch ra thì không lỗi nhưng lại không thấy hiển thị gì cả, sai đâu đó, chưa rõ.
Tôi mới bắt đầu học viết code cho Pic, kiến thức còn hạn hẹp. Nhờ các bạn chỉ giúp lỗi. Tôi đã tìm mà vẫn chưa ra.
Xin cảm ơn và chúc tất cả sức khỏe.
Code hơi dài nhưng cũng xin được post trực tiếp lên. Mong mod thông cảm.
#include <16f877A.h>
#fuses HS, NOLVP, NOWDT, NOPROTECT
#use delay (clock=4000000)
/*--------------------------------------------
Xac dinh cac chan dieu khien o che do 8 bit
Pins: D0-D7 cua VXL -> D0-D7 LCD
RS pin_E0
R/W pin_E1
E pin_E2
--------------------------------------------*/
#define RS pin_E0
#define RW pin_E1
#define E pin_E2
/*--------------------------------------------
Chot du lieu
Xung toi thieu 450ns tu cao xuong thap
--------------------------------------------*/
void Enable()
{ output_high(E);
delay_ms(5);
output_low(E);
}
/*--------------------------------------------
Kiem tra co ban (Busy Flag)
Khi ban, co ban xuat ra DB7
Lenh tiep theo se thuc thi khi chac chan BF=0
--------------------------------------------*/
void kiemtraBusyFlag()
{ int x;
output_low(RS);
output_high(RW);
do
{ Enable();
x=input_D();
x=x&0x80;
}
while (x==0x80);
}
/*--------------------------------------------
Ghi lenh toi LCD
--------------------------------------------*/
void ghilenh(unsigned char lenh)
{ kiemtraBusyFlag();
delay_ms(20);
output_B(lenh);
output_low(RS);
output_low(RW);
Enable();
}
/*--------------------------------------------
Ghi ki tu len LCD
--------------------------------------------*/
void ghikitu(unsigned char kitu)
{ kiemtraBusyFlag();
delay_ms(20);
output_B(kitu);
output_high(RS);
output_low(RW);
Enable();
}
/*--------------------------------------------
Ghi chuoi ki tu len LCD
--------------------------------------------*/
void ghichuoikitu(char *string)
{ while (*string)
{ ghikitu(*string);
string++;
}
}
/*--------------------------------------------
Ghi so nguyen len LCD
Unsigned char 0-255
Unsigned int 0-65535
--------------------------------------------*/
void ghisonguyen(unsigned char songuyen)
{ unsigned char a,b,c;
a=songuyen/100; //lay tram
b=(songuyen-100*a)/10; //lay chuc
c=(songuyen-100*a-10*b); //lay don vi
ghikitu(a+48);
ghikitu(b+48);
ghikitu(c+48);
}
/*--------------------------------------------
Thiet lap LCD
0x1 : Xoa man hinh 1.53 ms
0x2 : Tro ve dau dong 1.53 ms
0x4 : Dich con tro sang trai 39 us
0x6 : Dich con tro sang phai 39 us
0x5 : Dich hien thi sang phai 39 us
0x7 : Dich hien thi sang trai 39 us
0x8 : Tat con tro, tat hien thi 39 us
0xA : tat hien thi, bat con tro 39 us
0xC : Bat hien thi, tat con tro 39 us
0xE : Bat hien thi, nhap nhay con tro 39 us
0xF : Tat con tro, nhap nhay con tro 39 us
0x10 : Dich vi tri con tro sang trai 39 us
0x14 : Dich vi tri con tro sang phai 39 us
0x18 : Dich ton bo hien thi sang trai 39 us
0x1C : Dich ton bo hien thi sang phai 39 us
0x80 : Ep con tro ve dau dong thu nhat 39 us
0xC0 : Ep con tro ve dau dong thu hai 39 us
0x38 : Hai dòng va ma tran 5x7 39 us
Tra bang de biet them
--------------------------------------------*/
void setLCD()
{ ghilenh(0x38); //Hai dòng va ma tran 5x7 39 us
delay_ms(1);
ghilenh(0x01); //Xoa man hinh 1.53 ms
delay_ms(3);
ghilenh(0x0F); //Tat con tro, nhap nhay con tro 39 us
delay_ms(1);
}
/*--------------------------------------------
Chuong trinh chinh
--------------------------------------------*/
void main(void)
{ while(true)
{ setLCD();
ghilenh(0x0C);
printf(ghichuoikitu,"ABC");
ghilenh(0xC0);
ghilenh(0x0C);
printf(ghichuoikitu,"123");
delay_ms(500);
}
}
Tình hình là tôi đang viết code cho LCD, dịch ra thì không lỗi nhưng lại không thấy hiển thị gì cả, sai đâu đó, chưa rõ.
Tôi mới bắt đầu học viết code cho Pic, kiến thức còn hạn hẹp. Nhờ các bạn chỉ giúp lỗi. Tôi đã tìm mà vẫn chưa ra.

Xin cảm ơn và chúc tất cả sức khỏe.
Code hơi dài nhưng cũng xin được post trực tiếp lên. Mong mod thông cảm.
#include <16f877A.h>
#fuses HS, NOLVP, NOWDT, NOPROTECT
#use delay (clock=4000000)
/*--------------------------------------------
Xac dinh cac chan dieu khien o che do 8 bit
Pins: D0-D7 cua VXL -> D0-D7 LCD
RS pin_E0
R/W pin_E1
E pin_E2
--------------------------------------------*/
#define RS pin_E0
#define RW pin_E1
#define E pin_E2
/*--------------------------------------------
Chot du lieu
Xung toi thieu 450ns tu cao xuong thap
--------------------------------------------*/
void Enable()
{ output_high(E);
delay_ms(5);
output_low(E);
}
/*--------------------------------------------
Kiem tra co ban (Busy Flag)
Khi ban, co ban xuat ra DB7
Lenh tiep theo se thuc thi khi chac chan BF=0
--------------------------------------------*/
void kiemtraBusyFlag()
{ int x;
output_low(RS);
output_high(RW);
do
{ Enable();
x=input_D();
x=x&0x80;
}
while (x==0x80);
}
/*--------------------------------------------
Ghi lenh toi LCD
--------------------------------------------*/
void ghilenh(unsigned char lenh)
{ kiemtraBusyFlag();
delay_ms(20);
output_B(lenh);
output_low(RS);
output_low(RW);
Enable();
}
/*--------------------------------------------
Ghi ki tu len LCD
--------------------------------------------*/
void ghikitu(unsigned char kitu)
{ kiemtraBusyFlag();
delay_ms(20);
output_B(kitu);
output_high(RS);
output_low(RW);
Enable();
}
/*--------------------------------------------
Ghi chuoi ki tu len LCD
--------------------------------------------*/
void ghichuoikitu(char *string)
{ while (*string)
{ ghikitu(*string);
string++;
}
}
/*--------------------------------------------
Ghi so nguyen len LCD
Unsigned char 0-255
Unsigned int 0-65535
--------------------------------------------*/
void ghisonguyen(unsigned char songuyen)
{ unsigned char a,b,c;
a=songuyen/100; //lay tram
b=(songuyen-100*a)/10; //lay chuc
c=(songuyen-100*a-10*b); //lay don vi
ghikitu(a+48);
ghikitu(b+48);
ghikitu(c+48);
}
/*--------------------------------------------
Thiet lap LCD
0x1 : Xoa man hinh 1.53 ms
0x2 : Tro ve dau dong 1.53 ms
0x4 : Dich con tro sang trai 39 us
0x6 : Dich con tro sang phai 39 us
0x5 : Dich hien thi sang phai 39 us
0x7 : Dich hien thi sang trai 39 us
0x8 : Tat con tro, tat hien thi 39 us
0xA : tat hien thi, bat con tro 39 us
0xC : Bat hien thi, tat con tro 39 us
0xE : Bat hien thi, nhap nhay con tro 39 us
0xF : Tat con tro, nhap nhay con tro 39 us
0x10 : Dich vi tri con tro sang trai 39 us
0x14 : Dich vi tri con tro sang phai 39 us
0x18 : Dich ton bo hien thi sang trai 39 us
0x1C : Dich ton bo hien thi sang phai 39 us
0x80 : Ep con tro ve dau dong thu nhat 39 us
0xC0 : Ep con tro ve dau dong thu hai 39 us
0x38 : Hai dòng va ma tran 5x7 39 us
Tra bang de biet them
--------------------------------------------*/
void setLCD()
{ ghilenh(0x38); //Hai dòng va ma tran 5x7 39 us
delay_ms(1);
ghilenh(0x01); //Xoa man hinh 1.53 ms
delay_ms(3);
ghilenh(0x0F); //Tat con tro, nhap nhay con tro 39 us
delay_ms(1);
}
/*--------------------------------------------
Chuong trinh chinh
--------------------------------------------*/
void main(void)
{ while(true)
{ setLCD();
ghilenh(0x0C);
printf(ghichuoikitu,"ABC");
ghilenh(0xC0);
ghilenh(0x0C);
printf(ghichuoikitu,"123");
delay_ms(500);
}
}

Comment