Thông báo

Collapse
No announcement yet.

đến nản với con LCD. cao thủ nào giúp em vói

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

  • #31
    nó hiện như vậy là đã khởi tạo được LCD rồi đó bạn. Bạn xem trong file lcd.c có khúc này trong hàm lcd_putc:

    if(isprint(c)){
    lcd_put_byte(1, c);
    while(lcd_busy());
    }


    mình không biết hàm isprint có tác dụng gì nhưng mình nghĩ nên sửa lại thành :

    lcd_put_byte(1,c);
    while(lcd_busy());


    Do bạn đã khởi tạo được LCD nên chắc chắn là bạn đã gửi được byte ra LCD do đó trong hàm main bạn có thể dùng hàm lcd_put_byte để test việc gửi kí tự cũng được. Ví dụ ghi là : lcd_put_byte(1,65);(Hiện chữ A)

    Comment


    • #32
      tình hình là mình đã sửa file lcd.c như bạn nói, thử đủ kiểu (lcd_putc(0x30); lcd_puts("hello"); lcd_put_byte(1, 65);...) nhưng vẫn không có hiện tượng gì hết ! có phải lỗi của thư viện lcd.c ???

      Comment


      • #33
        Mình đã chạy debug và phát hiện ra đoạn code sau không chạy

        Code:
        	temp.Val = b;
        	
        	// send the high nibble
        	LCD_DATA4 = temp.bits.b4;
        	LCD_DATA5 = temp.bits.b5;
        	LCD_DATA6 = temp.bits.b6;
        	LCD_DATA7 = temp.bits.b7;
        	__delay_us(20);
        	LCD_EN =  1;
        	__delay_us(20);
        	LCD_EN = 0;
        	// send the low nibble
        	LCD_DATA4 = temp.bits.b0;
        	LCD_DATA5 = temp.bits.b1;
        	LCD_DATA6 = temp.bits.b2;
        	LCD_DATA7 = temp.bits.b3;
        nó nằm trong hàm lcd_put_byte(); của thư viện LCD.c. Khi debug thì giá trị port A lẫn port E không thay đổi bất kể giá trị của temp.bits.bx tương ưng là 1 hay 0. Tại sao nhỉ ???

        Comment


        • #34
          TRISE = 0x00; // thiết lập là output
          TRISA = 0x00; // thiết lập la output

          không biết bạn có dùng portE hay portA de dùng cho LCD ko
          mình nghĩ bạn thiếu phần configure cổng vào và ra (TRIS PORT sử dụng cho LCD), trong lcd.h

          Comment


          • #35
            Nguyên văn bởi quang102 Xem bài viết
            TRISE = 0x00; // thiết lập là output
            TRISA = 0x00; // thiết lập la output

            không biết bạn có dùng portE hay portA de dùng cho LCD ko
            mình nghĩ bạn thiếu phần configure cổng vào và ra (TRIS PORT sử dụng cho LCD), trong lcd.h
            Mình đã thiết lập trong void main(); như sau:

            Code:
            TRISA = 0x00;
            	ADCON1 = 0x07;
            	PORTA = 0x00;
            	TRISE = 0x00;
            	PORTE = 0x00;
            Trong thư viện lcd.h mình cũng đã cấu hình các chân cho LCD tương ứng với mạch mình làm:

            Code:
            /* Pins mapping */
            #ifndef		LCD_RS
            #define	LCD_RS		RE2
            #define	LCD_EN		RE0
            #define	LCD_RW		RE1
            #define	LCD_DATA4	RA3
            #define	LCD_DATA5	RA2
            #define	LCD_DATA6	RA1
            #define	LCD_DATA7	RA0
            
            #define	LCD_RS_TRIS		TRISE2
            #define	LCD_EN_TRIS		TRISE0
            #define	LCD_RW_TRIS		TRISE1
            #define	LCD_DATA4_TRIS	TRISA3
            #define	LCD_DATA5_TRIS	TRISA2
            #define	LCD_DATA6_TRIS	TRISA1
            #define	LCD_DATA7_TRIS	TRISA0
            #endif
            Vậy lỗi do đâu ? Mình cũng đã cấu hình lại thanh ghi ADCON1 = 0x07;

            Comment


            • #36
              Cuối cùng mình cũng phát hiện ra chỗ sai.
              @trimen: không phải cấu hình thanh ghi ADCON1 = 0x07; đâu. Đúng ra là phải cấu hình thanh ghi ANSEL = 0x00; mới đúng (tất cả các chân đều là chân digital i/o)

              Comment


              • #37
                à bạn xài pic16f877a đúng không, thanh ghi ANSEL mình tìm không thấy trong datasheet mình chỉ thấy thanh ghi ADCON1 ghi vậy, vậy chạy chưa bạn, bạn xem kĩ trong file LCD.h có ghi :

                #ifndef LCD_RS
                #define LCD_RS RE2
                #define LCD_EN RE0
                #define LCD_RW RE1
                #define LCD_DATA4 RA3
                #define LCD_DATA5 RA2
                #define LCD_DATA6 RA1
                #define LCD_DATA7 RA0

                #define LCD_RS_TRIS TRISE2
                #define LCD_EN_TRIS TRISE0
                #define LCD_RW_TRIS TRISE1
                #define LCD_DATA4_TRIS TRISA3
                #define LCD_DATA5_TRIS TRISA2
                #define LCD_DATA6_TRIS TRISA1
                #define LCD_DATA7_TRIS TRISA0
                #endif

                Tức là trong chuơng trình chính phải define LCD_RS thì nó mới hiểu các chân bạn định nghĩa cho LCD.Trong chuơng trình chính bạn phải ghi là:
                #define LCD_RS

                Comment


                • #38
                  À, mình dùng 887 chứ không phải 877A. Trong chương trình chính mình cũng không ghi #define LCD_RS như bạn nói. Vẫn chạy được bình thường

                  Comment


                  • #39
                    Nhân tiện mình còn 1 vấn đề với cái LCD này, nhờ mọi người vào tìm cách khắc phục giúp.
                    Cụ thể là khi cắm nguồn lên thì LCD hoạt động bình thường, sau đó bấm nút reset PIC thì LCD xuất ra những kí tự lạ, bấm reset lần nữa thì nội dung hiển thị trở lại như mong muốn. Trong ct chính mình đã __delay_ms(100); trước lệnh lcd_init(); và sau đó là __delay_ms(10);. Tại sao ?

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X