Thông báo

Collapse
No announcement yet.

Viết code CCS cho LCD, LCD không hiển thị. Nhờ mọi người chỉ giúp

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Viết code CCS cho LCD, LCD không hiển thị. Nhờ mọi người chỉ giúp

    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);
    }
    }Click image for larger version

Name:	01.gif
Views:	1
Size:	25.9 KB
ID:	1411419

  • #2
    Thạch anh có 4Mhz mà config HS sao? Mô phỏng nhìu khi không khớp với thực tế đâu, nên làm cái kit nạp rồi test thử mới chắc được.

    Comment


    • #3
      4Mhz HS được mà bạn. Nhờ mọi người cho ý kiến giúp để hoàn tất. Làm chưa được đang điên đây.

      Comment


      • #4
        No, 4Mhz = Crystal Osc ; Còn > 4Mhz mới được HS
        My Face :

        Comment


        • #5
          Tôi đã xem qua sơ đồ chân của bạn, cái này có thể dùng được Function luôn của CCS mà, chỉ việc đổi lại define pin thôi mà.
          Tại sao lại khổ sở đi xây dựng lại làm gì nhỉ ?
          Share Lib LCD 4bit thiếu gì đâu chứ ?
          Còn muốn chế thì đây : LCD Interface | Interfacing LCD with PIC18F4550 Microcontroller - Circuit
          còn ko muốn thì có thể dùng thư viện thông dụng này (4bit) : (sorry up mãi mà ko được, bạn kiếm trên 4rum nhé)
          My Face :

          Comment


          • #6
            Hi,
            Muốn LCD hoạt động trước hết cần phải init nó đã. Việc init được thực hiện bằng cách ghi cấu hình kết nối 8bit data 3 lần (xung EN kích 3 lần) sau đó thì mới làm việc khác không thì LCD không respond lại những gì bác làm đâu.
            Thân ái.
            Đường đến những ngày vinh quang không còn xa
            Con đường chúng ta... chúng ta đã chọn.

            Comment


            • #7
              Mình dùng file header lcd.c thì ok. Nhưng muốn tự viết hết để hiểu cho rõ. Mong mọi người có kinh nghiệm cho ý kiến giúp đỡ. Chân thành cảm ơn

              Comment


              • #8
                mún rõ thêm à, bác này ngược đời nhỉ, vào đây, down cai video tôi làm về, coi trong đó, viet bang ccs, mô phòng protues đầy đủ và sơ khởi, bác có thề coi thêm các bài khác ở trang chính CƠ ĐIỆN TỬ CAO THẮNG tìm bài giao tiếp lcd 16*2 nằm phía dưới
                TamPhieuLuuKy@yahoo.com
                092 2838 712 --->>

                Comment


                • #9
                  Viết code ccs cho lcd

                  Cái này bạn có thể dùng sẵn file lcd.c trong ccs mà, mình có đoạn code đơn giản như sau:
                  // Chuong trình pic va lcd
                  #include <16f877a.h>
                  #use delay(clock=1000000)
                  #define use_portb_lcd true
                  /*
                  PIN_B0 -> en
                  PIN_B1 -> rs
                  PIN_B2 ->Rw
                  PIN_B4,5,6,7-> D4,5,6,7*/
                  #include "lcd.c"
                  void main(){
                  lcd_init();
                  lcd_gotoxy(1,1);
                  lcd_putc('H');lcd_putc('a');lcd_putc('t');lcd_putc ('u');
                  while(1){
                  }
                  }
                  Để tìm hiểu rõ hơn bạn xem cái lcd.c của ccs
                  path name: C:\\program files\\PICC\\Drivers\\LCD.c

                  Comment


                  • #10
                    Bạn sửa lại trong hàm main là printf(ghichuoikitu,"ABC");=printf(ghikitu,"ABC"); bỏ hoàn toàn hàm ghichuoikitu đi và giảm thời gian trễ đi.Như vậy mạch sẽ hoạt động và thực hiện ghi chuỗi kí tự lên LCD.....

                    Comment

                    Về tác giả

                    Collapse

                    electronicvn Tìm hiểu thêm về electronicvn

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X