Thông báo

Collapse
No announcement yet.

Không hiển thị được trên LCD - mọi người chỉ cho em lỗi sai ở đâu với

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

  • Không hiển thị được trên LCD - mọi người chỉ cho em lỗi sai ở đâu với

    #include <REGX51.H>
    #include <string.h>
    #define LCDdata P2
    sbit RS=P1^0;
    sbit RW=P1^1;
    sbit E=P1^2;
    sbit BF=0xA7;
    void delay(long time)
    {long n;
    for(n=0;n<time;n++)
    {
    ;
    }
    }
    void lcd_wait()
    {long n=0;
    E=1;
    RS=0; //ghi lenh
    RW=1; // doc dl
    LCDdata=0xff;
    while(BF) // bit ban
    {n++;if(n>100)break;
    }
    E=0;
    RW=0;
    }
    void lcd_control(unsigned char x)
    {E=1;
    RS=0;
    RW=0;
    LCDdata=x;
    E=0;
    lcd_wait();
    }
    void lcd_init()
    {
    lcd_control(0x30);
    lcd_control(0x30);
    lcd_control(0x30);
    lcd_control(0x38);
    lcd_control(0x0c);
    lcd_control(0x06);
    lcd_control(0x01);
    }
    void lcd_writedata(unsigned char c)
    {
    RS=1;
    RS=0;
    LCDdata=c;
    E=1;
    E=0;
    delay(1000);
    }
    void lcd_write()
    {unsigned char i;
    E=1;
    RS=1;
    RW=0;
    LCDdata=i;
    E=0;
    lcd_wait();
    }
    void lcd_puts(unsigned char *s)
    {
    while (*s)
    {
    lcd_writedata(*s);
    s++;
    }
    }

  • #2
    Nguyên văn bởi aligato Xem bài viết
    #include <REGX51.H>
    #include <string.h>
    #define LCDdata P2
    sbit RS=P1^0;
    sbit RW=P1^1;
    sbit E=P1^2;
    sbit BF=0xA7;
    void delay(long time)
    {long n;
    for(n=0;n<time;n++)
    {
    ;
    }
    }
    void lcd_wait()
    {long n=0;
    E=1;
    RS=0; //ghi lenh
    RW=1; // doc dl
    LCDdata=0xff;
    while(BF) // bit ban
    {n++;if(n>100)break;
    }
    E=0;
    RW=0;
    }
    void lcd_control(unsigned char x)
    {E=1;
    RS=0;
    RW=0;
    LCDdata=x;
    E=0;
    lcd_wait();
    }
    void lcd_init()
    {
    lcd_control(0x30);
    lcd_control(0x30);
    lcd_control(0x30);
    lcd_control(0x38);
    lcd_control(0x0c);
    lcd_control(0x06);
    lcd_control(0x01);
    }
    void lcd_writedata(unsigned char c)
    {
    RS=1;
    RS=0;
    LCDdata=c;
    E=1;
    E=0;
    delay(1000);
    }
    void lcd_write()
    {unsigned char i;
    E=1;
    RS=1;
    RW=0;
    LCDdata=i;
    E=0;
    lcd_wait();
    }
    void lcd_puts(unsigned char *s)
    {
    while (*s)
    {
    lcd_writedata(*s);
    s++;
    }
    }
    Chẳng hiểu bạn viết cái gì nữa bạn xem thử của mình nhé
    // CAC CHUONG TRINH GIANH CHO LCD
    // Ham kiem tra ban
    void ban()
    {
    P0=0xFF;
    Rs=0;
    Rw=1;
    while(Bf)
    {
    En=0;
    delay(1);
    En=1;
    }
    }
    // Ham ghi lenh
    void lenh(unsigned char x)
    {
    ban();
    P0=x;
    Rs=0;
    Rw=0;
    delay_us(50);
    En=1;
    delay_us(50);
    En=0;
    }
    // Ham ghi du lieu
    void kitu(unsigned char x)
    {
    ban();
    P0=x;
    Rs=1;
    Rw=0;
    delay_us(50);
    En=1;
    delay_us(50);
    En=0;
    }
    // Ham ghi chuoi
    void chuoi(unsigned char *s)
    {
    char i;
    for(i=0;i<strlen(s);i++)
    {
    kitu(s[i]);
    }
    }
    // Ham ghi cham 1 chuoi
    void chuoi_cham(unsigned char *s)
    {
    char i;
    for(i=0;i<strlen(s);i++)
    {
    kitu(s[i]);
    delay(75);
    }
    }
    // Ham khoi tao LCD
    void khoitao()
    {
    lenh(0x38);
    lenh(0x0c);
    lenh(0x01);
    lenh(0x80);
    }
    vanduc0211@gmail.com

    Comment


    • #3
      Chỉ đơn giản nó là thế này :
      Code:
      #include <REGX51.h>           //	Thu vien S51,C51						
      #include <Delay.c>		//  Thu vien delay
      
      #define  LCD_RS P2_7		//	Chan LCD_Reset
      #define  LCD_EN P2_5		//  Chan LCD_Eable
      #define  LCD_D4 P2_3		//  Chan LCD_Data 4
      #define  LCD_D5 P2_2		//  Chan LCD_Data 5
      #define  LCD_D6 P2_1		//  Chan LCD_Data 6
      #define  LCD_D7 P2_0		//  Chan LCD_Data 7
      
      #include <Lcd4bit.c>		//  Thu vien chua ham dieu khien LCD 16x2 che do 4 bit
      
      void main()
      {
      	LCD_Init();					//  Khoi dong LCD
      	LCD_Clear();				//	Xoa LCD
      	delay_ms(2);				//  Cho 2ms de LCD xoa xong ( LCD xoa mat 1.64ms)										
      	while(1)
      	{
      		LCD_Clear();		
      		delay_ms(2);
      		
      		LCD_GotoXY(line1,0);
      		LCD_PutC('T');
      		LCD_PutC('e');
      		LCD_PutC('s');
      		LCD_PutC('t');
      		LCD_PutC(' ');
      		LCD_PutC('L');
      		LCD_PutC('C');
      		LCD_PutC('D');
      		
      		LCD_GotoXY(line2,0);
      		LCD_PutS("VanDuongPCB");
      		delay_ms(500);
      		
      	}
      }
      Attached Files

      Comment


      • #4
        Chẳng hiểu bạn viết cái gì nữa bạn xem thử của mình nhé[/QUOTE]
        Cho mình hỏi tại sao bạn lại xen vào giữa lệnh chốt hàm delay_us(50);
        delay_us(50);
        En=1;
        delay_us(50);
        En=0;

        Comment


        • #5
          Cho mình hỏi tại sao bạn viboyth.haui lại xen vào giữa lệnh chốt hàm delay_us(50);
          delay_us(50);
          En=1;
          delay_us(50);
          En=0;

          Comment


          • #6
            Mọi người xem giúp em đoạn code em tự viết có sai sót gì k? sao mà cắm mạch thực tế k chạy, mà mô phỏng thì ngon lành
            #include<at89x51.h>
            #include<string.h>
            //==========================
            #define LCDdata P2
            #define DB7 P2_7
            #define RS P1_0
            #define RW P1_1
            #define E P1_2
            #define sensor P3_2
            //============================
            unsigned char pi=3.14;
            unsigned char l,S,j,fi,R,n;
            unsigned int i;
            void delay(unsigned int ms)
            {

            for(i=0;i<ms;i++) {
            for(j=0;j<125;j++){}}
            }
            //=================================
            void wait(void)
            {
            RS=0;
            RW=1;
            LCDdata=0xff;
            while(DB7)
            {
            E=0;
            E=1;
            }
            }
            //================================
            void LCDcontrol(unsigned char x)
            {
            RS=0;
            RW=0;
            LCDdata=x;
            E=1;
            E=0;
            wait();
            }
            //===============================
            void LCDinit(void)
            {
            LCDcontrol(0x38);
            LCDcontrol(0x0e);
            LCDcontrol(0x01);
            }
            //=====================================
            void LCDwrite(unsigned char y)
            {
            RS=1;
            RW=0;
            LCDdata=y;
            E=1;
            E=0;
            wait();
            }
            //=====================================
            void LCDwrites(unsigned char *z)
            {
            unsigned char data dai,dem;
            dai=strlen(z);
            for(dem=0;dem<dai;dem++)
            {
            LCDwrite(*(z+dem));
            }
            }
            //===============================
            void ngat_INT0(void) interrupt 0
            {
            l=1;//(2*pi*R*n)/360 // n: so goc giua 2 khe; R:ban kinh dia sensor
            S+=l;
            LCDcontrol(0xc0);
            LCDwrites("S=");
            LCDwrite((S/1000000)+48);LCDwrite(((S%1000000)/100000)+48);LCDwrite((((S%1000000)%100000)/10000)+48);
            LCDwrite(((((S%1000000)%100000)%10000)/1000)+48);LCDwrite((((((S%1000000)%100000)%10000)% 1000)/100)+48);
            LCDwrite(((((((S%1000000)%100000)%10000)%1000)%100 )/10)+48);LCDwrite(((((((S%1000000)%100000)%10000)%1 000)%100)%10)+48);
            LCDwrites(" Cm ");
            }
            //========================
            void main(void)
            {
            EA=1;
            EX0=1;
            IT0=1;
            LCDinit();
            LCDcontrol(0x82);
            LCDwrites("Welcome");
            LCDcontrol(0xc0);
            LCDwrites("S=");
            while(1);
            }

            trên kelc nó k báo lỗi, nhưng có cảnh báo ở đoạn code e bôi màu đỏ, hình đậy ạ!Click image for larger version

Name:	5.png
Views:	1
Size:	11.1 KB
ID:	1379009
            _Và đây là phần cứng năm nối k biết sai đâu k mà lắp thật k chạy: Click image for larger version

Name:	6.jpg
Views:	1
Size:	113.9 KB
ID:	1379010
            +/Chân Vee trên LCD của e là V0 và e nối V0 --> chân giữa của VR 10k còn 1 trong 2 chân kia e nối mass
            +/E dùng TA 12Mhz
            +/ IC 89C52
            _ À trong đoạn code có CT delay đúng ra là để phục vụ hiện thị chạy chữ, nhưng e bỏ quên k xóa! nhưng nó vẫn cứ cảnh báo ở dòng 15, có khi nào hàm wait LCD e sai k! hic hic
            _ E nạp CT vào IC bật LCD thì lúc thì hiện 1 hàng, lúc thì k hiện gì luôn, lúc thì chỉ hiện 1 nửa bên trái màn hình, được dụy nhất 1 lần hiện thị đúng nhưng là k nhận tín hiệu vào coi như cũng k đựoc luôn! K biết do phần cứng nối sai hay do code! hic hic!
            Thanks mọi ng đã quan tâm!
            Last edited by caosang1992; 19-05-2013, 18:49.

            Comment


            • #7
              Nguyên văn bởi caosang1992 Xem bài viết
              Mọi người xem giúp em đoạn code em tự viết có sai sót gì k? sao mà cắm mạch thực tế k chạy, mà mô phỏng thì ngon lành
              #include<at89x51.h>
              #include<string.h>
              //==========================
              #define LCDdata P2
              #define DB7 P2_7
              #define RS P1_0
              #define RW P1_1
              #define E P1_2
              #define sensor P3_2
              //============================
              unsigned char pi=3.14;
              unsigned char l,S,j,fi,R,n;
              unsigned int i;
              void delay(unsigned int ms)
              {

              for(i=0;i<ms;i++) {
              for(j=0;j<125;j++){}}
              }
              //=================================
              void wait(void)
              {
              RS=0;
              RW=1;
              LCDdata=0xff;
              while(DB7)
              {
              E=0;
              E=1;
              }
              }
              //================================
              void LCDcontrol(unsigned char x)
              {
              RS=0;
              RW=0;
              LCDdata=x;
              E=1;
              E=0;
              wait();
              }
              //===============================
              void LCDinit(void)
              {
              LCDcontrol(0x38);
              LCDcontrol(0x0e);
              LCDcontrol(0x01);
              }
              //=====================================
              void LCDwrite(unsigned char y)
              {
              RS=1;
              RW=0;
              LCDdata=y;
              E=1;
              E=0;
              wait();
              }
              //=====================================
              void LCDwrites(unsigned char *z)
              {
              unsigned char data dai,dem;
              dai=strlen(z);
              for(dem=0;dem<dai;dem++)
              {
              LCDwrite(*(z+dem));
              }
              }
              //===============================
              void ngat_INT0(void) interrupt 0
              {
              l=1;//(2*pi*R*n)/360 // n: so goc giua 2 khe; R:ban kinh dia sensor
              S+=l;
              LCDcontrol(0xc0);
              LCDwrites("S=");
              LCDwrite((S/1000000)+48);LCDwrite(((S%1000000)/100000)+48);LCDwrite((((S%1000000)%100000)/10000)+48);
              LCDwrite(((((S%1000000)%100000)%10000)/1000)+48);LCDwrite((((((S%1000000)%100000)%10000)% 1000)/100)+48);
              LCDwrite(((((((S%1000000)%100000)%10000)%1000)%100 )/10)+48);LCDwrite(((((((S%1000000)%100000)%10000)%1 000)%100)%10)+48);
              LCDwrites(" Cm ");
              }
              //========================
              void main(void)
              {
              EA=1;
              EX0=1;
              IT0=1;
              LCDinit();
              LCDcontrol(0x82);
              LCDwrites("Welcome");
              LCDcontrol(0xc0);
              LCDwrites("S=");
              while(1);
              }

              trên kelc nó k báo lỗi, nhưng có cảnh báo ở đoạn code e bôi màu đỏ, hình đậy ạ![ATTACH=CONFIG]66312[/ATTACH]
              _Và đây là phần cứng năm nối k biết sai đâu k mà lắp thật k chạy: [ATTACH=CONFIG]66313[/ATTACH]
              +/Chân Vee trên LCD của e là V0 và e nối V0 --> chân giữa của VR 10k còn 1 trong 2 chân kia e nối mass
              +/E dùng TA 12Mhz
              +/ IC 89C52
              _ À trong đoạn code có CT delay đúng ra là để phục vụ hiện thị chạy chữ, nhưng e bỏ quên k xóa! nhưng nó vẫn cứ cảnh báo ở dòng 15, có khi nào hàm wait LCD e sai k! hic hic
              _ E nạp CT vào IC bật LCD thì lúc thì hiện 1 hàng, lúc thì k hiện gì luôn, lúc thì chỉ hiện 1 nửa bên trái màn hình, được dụy nhất 1 lần hiện thị đúng nhưng là k nhận tín hiệu vào coi như cũng k đựoc luôn! K biết do phần cứng nối sai hay do code! hic hic!
              Thanks mọi ng đã quan tâm!
              1: Theo mình có thể do thời gian delay khi gửi lệnh tới LCD của bạn quá ngắn nên có hiện tượng lúc được lúc không còn Code của bạn thì thú thực nhìn vào thấy nản chả muốn đọc gì hết.
              2: 2 dòng cảnh báo đó dòng 1 là có hàm bạn định nghĩa ra mà không dùng đến (delay), dòng cảnh báo tiếp theo là bạn thực hiện lời gọi tới 1 hàm quá nhiều lần.
              Ngoài ra mình có đọc trên mạng bài C51: CALLING FUNCTIONS FROM INTERRUPTS có nói về việc trong 1 ngắt thực hiện lời gọi tới 1 hàm bên ngoài. Hình như nếu không có 1 số chỉ thị biên dịch đặc biệt thì lời gọi này không được thực hiện.

              Comment


              • #8
                E đang tìm hiểu, hiện tại vẫn chưa chạy! mong mọi ng cho ý kiến!
                Thanhks!

                Comment


                • #9
                  ai giúp e với!

                  Comment


                  • #10
                    //==================== Main library ===================================
                    #ifndef __LCD_16x2_4bit__
                    //
                    //===============Khai bao bien================
                    sfr LCD_data = 0xA0;
                    sbit RS = P2^0 ;
                    sbit RW = P2^1 ;
                    sbit EN = P2^2 ;

                    //=================== DELAY ==================
                    void delay_LCD(unsigned int time)
                    {
                    while(time--);
                    }

                    //================ Write command ==============
                    void write_command(unsigned char str)
                    {
                    RW = 0 ; //Chon write
                    RS = 0 ; //Chon thanh ghi lenh
                    EN = 1 ;
                    LCD_data = ((LCD_data & 0x0f ) | ( str & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                    EN = 0 ; //Tao xung canh len(enable)
                    EN = 1 ;
                    LCD_data = ((LCD_data & 0x0f ) | (( str<<4) & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                    EN = 0 ;
                    delay_LCD(500); //wait busy LCD
                    }

                    //================= Write data 1char =================
                    void write_data(unsigned char str)
                    {
                    RW = 0 ; //Chon write
                    RS = 1 ; //Chon thanh ghi data
                    EN = 1 ;
                    LCD_data = ((LCD_data & 0x0f ) | ( str & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                    EN = 0 ; //Tao xung canh len(enable)
                    EN = 1 ;
                    LCD_data = ((LCD_data & 0x0f ) | (( str<<4) & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                    EN = 0 ;
                    delay_LCD(500); //wait busy LCD
                    }

                    //================= Khoi tao LCD ================
                    void LCD_khoitao(void)
                    {
                    write_command(0x02); //Tro ve dau dong
                    write_command(0x28); //2 dong va font 5x7 che do 4bit
                    write_command(0x0e); // bat man hinh va con tro
                    write_command(0x01); // xoa man hinh
                    }

                    #endif
                    bạn save đoạn code này vào file.h rồi sau đó include vào chương trình là chạy đc nhé.mình đã test thực tế.oke rồi!!

                    Comment


                    • #11
                      Nguyên văn bởi phuphuongbk Xem bài viết
                      //==================== Main library ===================================
                      #ifndef __LCD_16x2_4bit__
                      //
                      //===============Khai bao bien================
                      sfr LCD_data = 0xA0;
                      sbit RS = P2^0 ;
                      sbit RW = P2^1 ;
                      sbit EN = P2^2 ;

                      //=================== DELAY ==================
                      void delay_LCD(unsigned int time)
                      {
                      while(time--);
                      }

                      //================ Write command ==============
                      void write_command(unsigned char str)
                      {
                      RW = 0 ; //Chon write
                      RS = 0 ; //Chon thanh ghi lenh
                      EN = 1 ;
                      LCD_data = ((LCD_data & 0x0f ) | ( str & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                      EN = 0 ; //Tao xung canh len(enable)
                      EN = 1 ;
                      LCD_data = ((LCD_data & 0x0f ) | (( str<<4) & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                      EN = 0 ;
                      delay_LCD(500); //wait busy LCD
                      }

                      //================= Write data 1char =================
                      void write_data(unsigned char str)
                      {
                      RW = 0 ; //Chon write
                      RS = 1 ; //Chon thanh ghi data
                      EN = 1 ;
                      LCD_data = ((LCD_data & 0x0f ) | ( str & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                      EN = 0 ; //Tao xung canh len(enable)
                      EN = 1 ;
                      LCD_data = ((LCD_data & 0x0f ) | (( str<<4) & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                      EN = 0 ;
                      delay_LCD(500); //wait busy LCD
                      }

                      //================= Khoi tao LCD ================
                      void LCD_khoitao(void)
                      {
                      write_command(0x02); //Tro ve dau dong
                      write_command(0x28); //2 dong va font 5x7 che do 4bit
                      write_command(0x0e); // bat man hinh va con tro
                      write_command(0x01); // xoa man hinh
                      }

                      #endif
                      bạn save đoạn code này vào file.h rồi sau đó include vào chương trình là chạy đc nhé.mình đã test thực tế.oke rồi!!
                      Cho e hỏi khi e thay phần khở tạo LCD 4bit này vào thì hàm wait cũ của e có phải bỏ đi k? như này phải k a? e sửa cái write_data thành LCDwrite và chuyển chân RS,RW,EN của a trên file.h ra port k như phần cứng e nối nhưng mô phỏng hiẻn thị k như ý muốn! a xem giúp e! e cũng k hiểu lắm về LCD để ở 4bit này!
                      #include<at89x51.h>
                      #include<LCD4bit.h>
                      //==========================
                      #define sensor P3_2
                      //============================
                      //unsigned char pi=3.14;
                      unsigned char l,S; //fi,R
                      //===============================
                      void ngat_INT0(void) interrupt 0
                      {
                      l=1; // l=(2*pi*R*n)/360 =1 cm n: so goc giua 2 khe; R:ban kinh dia sensor
                      S+=l;
                      }
                      //========================
                      void main(void)
                      {
                      EA=1;
                      EX0=1;
                      IT0=1;
                      LCD_khoitao();
                      delay_LCD(2);
                      while(1)
                      {
                      LCDwrite((S/1000000)+48);LCDwrite(((S%1000000)/100000)+48);LCDwrite((((S%1000000)%100000)/10000)+48);
                      LCDwrite(((((S%1000000)%100000)%10000)/1000)+48);LCDwrite((((((S%1000000)%100000)%10000)% 1000)/100)+48);
                      LCDwrite(((((((S%1000000)%100000)%10000)%1000)%100 )/10)+48);LCDwrite(((((((S%1000000)%100000)%10000)%1 000)%100)%10)+48);
                      delay_LCD(1);
                      }
                      }

                      Comment


                      • #12
                        Nguyên văn bởi caosang1992 Xem bài viết
                        Cho e hỏi khi e thay phần khở tạo LCD 4bit này vào thì hàm wait cũ của e có phải bỏ đi k? như này phải k a? e sửa cái write_data thành LCDwrite và chuyển chân RS,RW,EN của a trên file.h ra port k như phần cứng e nối nhưng mô phỏng hiẻn thị k như ý muốn! a xem giúp e! e cũng k hiểu lắm về LCD để ở 4bit này!
                        #include<at89x51.h>
                        #include<LCD4bit.h>
                        //==========================
                        #define sensor P3_2
                        //============================
                        //unsigned char pi=3.14;
                        unsigned char l,S; //fi,R
                        //===============================
                        void ngat_INT0(void) interrupt 0
                        {
                        l=1; // l=(2*pi*R*n)/360 =1 cm n: so goc giua 2 khe; R:ban kinh dia sensor
                        S+=l;
                        }
                        //========================
                        void main(void)
                        {
                        EA=1;
                        EX0=1;
                        IT0=1;
                        LCD_khoitao();
                        delay_LCD(2);
                        while(1)
                        {
                        LCDwrite((S/1000000)+48);LCDwrite(((S%1000000)/100000)+48);LCDwrite((((S%1000000)%100000)/10000)+48);
                        LCDwrite(((((S%1000000)%100000)%10000)/1000)+48);LCDwrite((((((S%1000000)%100000)%10000)% 1000)/100)+48);
                        LCDwrite(((((((S%1000000)%100000)%10000)%1000)%100 )/10)+48);LCDwrite(((((((S%1000000)%100000)%10000)%1 000)%100)%10)+48);
                        delay_LCD(1);
                        }
                        }
                        Xodi b vì dạo này bận nên ko lên đc.hxhx.Mình ko hiểu ý bạn hỏi ở đây. còn về sự khác nhau giữa 4bit và 8 bit thì ở điểm
                        1.dùng 4bit cao của LCD(từ chân 11>14) để nối vs vxl + 3 chân điều khiển RS,RW,EN thay vì phải dùng cả 8bit như ở chêt độ 8bit.
                        2.khác nhau ở 8bit gửi 1 phát 8 bit liền ra còn 4bit thì gửi lần lượt 4 bit 1 ra.
                        3.lúc khởi tạo nhớ chọn chết độ 4bit (write_command(0x28); //2 dong va font 5x7 che do 4bit).

                        Comment


                        • #13
                          Nguyên văn bởi phuphuongbk Xem bài viết
                          Xodi b vì dạo này bận nên ko lên đc.hxhx.Mình ko hiểu ý bạn hỏi ở đây. còn về sự khác nhau giữa 4bit và 8 bit thì ở điểm
                          1.dùng 4bit cao của LCD(từ chân 11>14) để nối vs vxl + 3 chân điều khiển RS,RW,EN thay vì phải dùng cả 8bit như ở chêt độ 8bit.
                          2.khác nhau ở 8bit gửi 1 phát 8 bit liền ra còn 4bit thì gửi lần lượt 4 bit 1 ra.
                          3.lúc khởi tạo nhớ chọn chết độ 4bit (write_command(0x28); //2 dong va font 5x7 che do 4bit).
                          Cám ơn anh! vậy là mức độ hiển thị vẫn như chế độ 8 bit nhưng nó tiết kiểm chân cho vdk, và hình như là như vậy tốc độ xử lý nó sẽ chẫm hơn 8 bit a nhỉ(cái này thì e nghĩ mắt thường k phân biệt được)!, e cũng hay thấy mọi ng dùng chế độ 4 bit ,e hỏi để rõ hơn 1 chút là khi lập trình hiển thị 4bit giống như 8 bit nhưng chỉ khác ở lúc mình khởi tao LCD ban đầu đúng k a? "
                          3.lúc khởi tạo nhớ chọn chết độ 4bit (write_command(0x28); //2 dong va font 5x7 che do 4bit)."
                          thay vì mình LCDcontrol(0x38);
                          E hiểu vậy chuẩn chứ ạ!

                          Comment


                          • #14
                            Nguyên văn bởi caosang1992 Xem bài viết
                            Cám ơn anh! vậy là mức độ hiển thị vẫn như chế độ 8 bit nhưng nó tiết kiểm chân cho vdk, và hình như là như vậy tốc độ xử lý nó sẽ chẫm hơn 8 bit a nhỉ(cái này thì e nghĩ mắt thường k phân biệt được)!, e cũng hay thấy mọi ng dùng chế độ 4 bit ,e hỏi để rõ hơn 1 chút là khi lập trình hiển thị 4bit giống như 8 bit nhưng chỉ khác ở lúc mình khởi tao LCD ban đầu đúng k a? "
                            3.lúc khởi tạo nhớ chọn chết độ 4bit (write_command(0x28); //2 dong va font 5x7 che do 4bit)."
                            thay vì mình LCDcontrol(0x38);
                            E hiểu vậy chuẩn chứ ạ!
                            Bạn xem tài liệu về giao tiếp LCD sẽ thấy rằng khi hiện thị chế độ 4 bit khác 8 bit ở chân EN. Vì 8bit thì tạo 1 xung và LCD sẽ đọc dữ liệu từ 8 chân(lấy 8 bit luôn ).còn 4 bit thì phải tạo ra 2 xung gồm xung 1 LCD lấy 4 bit cao, xung 2 LCD lấy 4 bit thấp và khoảng cách giữa 2 xung là rất ít.
                            void write_command(unsigned char str)
                            {
                            RW = 0 ; //Chon write
                            RS = 0 ; //Chon thanh ghi lenh
                            EN = 1 ;
                            LCD_data = ((LCD_data & 0x0f ) | ( str & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                            EN = 0 ; //Tao xung canh len(enable)
                            EN = 1 ;
                            LCD_data = ((LCD_data & 0x0f ) | (( str<<4) & 0xf0)); //Xoa 4bit cao LCD_data + 4bit cao data
                            EN = 0 ;
                            delay_LCD(500); //wait busy LCD
                            }
                            bạn thấy ko trong khi lập trình thì khoảng cách giữa 2 lần rất nhỏ nên ko ảnh hưởng đến tốc độ hiện thị. Tốc độ hiện thị phụ thuộc vào cái hàm delay_LCD(500); //wait busy LCD này cơ.

                            Comment


                            • #15
                              cảm ơn bạn nhé. mình làm xong cái hiển thị lcd , má lúc đc lúc không? xác xuất tàm 20%. sau đọc được cái chỉnh delay khi gửi lệnh tới lcd thì mình chỉnh lại phát đc 100% luôn. có thể mà làm mình đau đầu hết lên

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X