Hướng dẫn hiển thị LCD dùng ccs cho người mới bắt đầu

hoanganh234

Học sinh trung cấp
e đang viết chương trình chạy chữ trên lcd 20x4 khi e cho mảng chứa hơn 20 ký tự thì lcd chạy loạn lên còn khi cho nhỏ hơn thi n chạy bt vậy bác có biết lỗi gì không .Đối với lcd16x2 thì lại chạy bt e k biết lỗi gì mong bác chỉ giáo
 

hd03

Sinh viên đại học
e đang viết chương trình chạy chữ trên lcd 20x4 khi e cho mảng chứa hơn 20 ký tự thì lcd chạy loạn lên còn khi cho nhỏ hơn thi n chạy bt vậy bác có biết lỗi gì không .Đối với lcd16x2 thì lại chạy bt e k biết lỗi gì mong bác chỉ giáo
mô tả "bệnh lý" kiểu này gây khó cho gà mờ tập sự như mình quá!
tuy nhiên "chuẩn đoán ban đầu" có thể do bộ nhớ đệm trên LCD bị tràn hay gì gì đó...
"thuốc" cho bạn nhé:
Mã:
//khai báo 1 chuỗi thiệt là dài...
//------------
for <chạy từ 0 -> độ dài chuỗi - 1>
{
//lần 1
<đọc 20 ký tự đầu tiên> //0>>20

//lần 2
<đọc 20 ký tự tiếp> //1>>21

//lần 3
<đọc 20 ký tự tiếp> //2>>22

...

<đưa con trỏ về đầu dòng>
<hiển thị>
}
 

Hiếu Ròm

Học sinh phổ thông
mình muốn làm mạch đếm sản phẩm dùng led thu phát hồng ngoại hiển thị lcd+PIC16f877a
mà hình như led thu phát hồng ngoại đóng vai trò như 1 cảm biến nên nó sẽ xuất ra xung => nên sẽ đọc xung từ chân RB0 (RB0 có chức năng đọc xung ngoài) của pic để hiển thị lên LCD đúng ko ạ
hay mình muốn đọc = chân nào cũng được ( chắc là sai :))).
Mình muốn làm 3 cặp led thu phát hồng ngoại để đếm sản phẩm mà mình chỉ bik chân RB0 đọc xung thôi nên chỉ đếm dc 1 fb:(
 

hd03

Sinh viên đại học
mình muốn làm mạch đếm sản phẩm dùng led thu phát hồng ngoại hiển thị lcd+PIC16f877a
mà hình như led thu phát hồng ngoại đóng vai trò như 1 cảm biến nên nó sẽ xuất ra xung => nên sẽ đọc xung từ chân RB0 (RB0 có chức năng đọc xung ngoài) của pic để hiển thị lên LCD đúng ko ạ
hay mình muốn đọc = chân nào cũng được ( chắc là sai :))).
Mình muốn làm 3 cặp led thu phát hồng ngoại để đếm sản phẩm mà mình chỉ bik chân RB0 đọc xung thôi nên chỉ đếm dc 1 fb:(
bạn muốn đọc vào chân nào là tùy bạn thôi. ngõ ra từ cặp thu phát hồng ngoại kia là xung mức cao - thấp và tốc độ đưa về không nhanh lắm nên các I/O của PIC đều đáp ứng được.
RB0 nên dùng cho các ứng dụng tốc độ cao như encoder, đo tần số này nọ, ...dùng vào đây thì phí quá!
 

Hiếu Ròm

Học sinh phổ thông
bạn muốn đọc vào chân nào là tùy bạn thôi. ngõ ra từ cặp thu phát hồng ngoại kia là xung mức cao - thấp và tốc độ đưa về không nhanh lắm nên các I/O của PIC đều đáp ứng được.
RB0 nên dùng cho các ứng dụng tốc độ cao như encoder, đo tần số này nọ, ...dùng vào đây thì phí quá!
à cảm ơn bạn zậy là chân nào của pic cũng dùng dc hết phải ko, ko nhất thiết là chân đọc xung phải ko, zậy để em viết code rồi có gì anh góp ý nha :)) mà em viết hơi yếu nên chắc hơi bị lâu :))
 

hd03

Sinh viên đại học
à cảm ơn bạn zậy là chân nào của pic cũng dùng dc hết phải ko, ko nhất thiết là chân đọc xung phải ko, zậy để em viết code rồi có gì anh góp ý nha :)) mà em viết hơi yếu nên chắc hơi bị lâu :))
bạn viết yếu nhưng biết tìm tòi nghiên cứu là rất tốt rồi. code có thể chưa hay nhưng bạn có cả một codientu sẵn sàng giúp bạn.

Thân!
 

Hiếu Ròm

Học sinh phổ thông
mình viết dc rồi nhưng có gì đó sai sai
nếu có xung từ rb0, rb1 thì nó đếm mà rb2 nó ko đếm, mà proteus nếu để sw ở rb0 trước khi bấm play thì nó đếm dc còn nếu để sw ở rb2 trước thì nó ko đếm được, để ở rb1 trước cũng ko đếm dc. phải để ở rb0 trước mới đếm dc.
mà sao em ko gửi mấy cái file code với mô phỏng lên ko dc dzo tệp thì trống rỗng à
Mã:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(d)
#use fast_io(e)
#byte portd=0x08
#bit rs=0x09.0
#bit rw=0x09.1
#bit e=0x09.2
#bit rb0=0x06.0
#bit rb1=0x06.1
#bit rb2=0x06.2
int16 x,y,z,tram,chuc,dv;
int16 u[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

void ghi_ir()
{
e=1;rs=0;rw=0;e=0;
delay_ms(3);
}
void ghi_dr()
{
e=1;rs=1;rw=0;e=0;
delay_ms(3);
}
void main()
{
{
set_tris_a(0b1);
set_tris_d(0);
set_tris_e(0b000);

portd=0x01;
ghi_ir();
portd=0x0e;
ghi_ir();
portd=0x38;// 2 dong
ghi_ir();
portd=0x81;
ghi_ir();
portd="R";
ghi_dr();
portd="E";
ghi_dr();
portd="D";
ghi_dr();
portd=0x85;
ghi_ir();
portd="B";
ghi_dr();
portd="L";
ghi_dr();
portd="U";
ghi_dr();
portd="E";
ghi_dr();
portd=0x8a;
ghi_ir();
portd="G";
ghi_dr();
portd="R";
ghi_dr();
portd="E";
ghi_dr();
portd="E";
ghi_dr();
portd="N";
ghi_dr();
}

While(1)
{
  {
   if(rb0==0)
      {
       delay_ms(50);
       x++;
       if(x==11)
        {x=0;}
        While(rb0==0);
        delay_ms(50);
      }
  else if(rb1==0)
     {
      delay_ms(50);
      y++;
      if(y==11)
      {
      y=0;}
      While(rb1==0);
      delay_ms(50);
      }
  else if(rb2==0)
   {
      delay_ms(50);
      z++;
      if(z==11)
      {
      z=0;}
      While (rb2==0);
      delay_ms(50);
   }
  else
   {
   }
}

{

tram=x/100;
chuc=(x/10)%10;
dv=x%10;
portd=0xc1;
ghi_ir();
portd=u[tram];
ghi_dr();
portd=u[chuc];
ghi_dr();
portd=u[dv];
ghi_dr();
}

{
tram=y/100;
chuc=(y/10)%10;
dv=y%10;
portd=0xc5;
ghi_ir();
portd=u[tram];
ghi_dr();
portd=u[chuc];
ghi_dr();
portd=u[dv];
ghi_dr();
}
{
tram=z/100;
chuc=(z/10)%10;
dv=z%10;
portd=0xca;
ghi_ir();
portd=u[tram];
ghi_dr();
portd=u[chuc];
ghi_dr();
portd=u[dv];
ghi_dr();
}
}
}
Untitled.png
 
Sửa lần cuối:

hd03

Sinh viên đại học
mình viết dc rồi nhưng có gì đó sai sai
nếu có xung từ rb0, rb1 thì nó đếm mà rb2 nó ko đếm, mà proteus nếu để sw ở rb0 trước khi bấm play thì nó đếm dc còn nếu để sw ở rb2 trước thì nó ko đếm được, để ở rb1 trước cũng ko đếm dc. phải để ở rb0 trước mới đếm dc.
mà sao em ko gửi mấy cái file code với mô phỏng lên ko dc dzo tệp thì trống rỗng à
chương trình của bạn có vấn đề: không khai báo cho PortB mặc dù bạn truy xuất tới bit nhớ; nhận tín hiệu vào cần xét "INPUT_STATE" tại chân đó; hàm delay và while lúc chạy chương trình sẽ làm trôi sản phẩm khi c.trình đang ở đó mà có s.phẩm đi qua cảm biến...
phần cứng cũng không đúng, ngõ ra của cảm biến là '1' hoặc '0' làm gì có chuyện thả nổi như bạn vẽ trong hình được??
 

Quảng cáo Google