Thông báo

Collapse
No announcement yet.

Giúp mình với 89c52 vs LCD 16x2 (LM016L)

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

  • Giúp mình với 89c52 vs LCD 16x2 (LM016L)

    Như tiêu đề, mình đang thử điều khiển màn hình LCD 16x2 (LM016L). Mình chật vật với nó từ chiều qua tới giờ mà mãi không làm cái LCD kia hiện chữ đựoc, kính nhờ các cao thủ giúp đỡ. Mình không phải là dân chuyên điện tử, chỉ là muốn tìm hiểu và làm 1 số thứ mà mình thích nếu có sai sót gì thì mọi người chỉ bảo giúp mình với. Mình đính dưới đây 1 mạch vẽ bằng Proteus và 1 chưong trình keil c mà mình đang làm.Click image for larger version

Name:	xProject.jpg
Views:	1
Size:	89.2 KB
ID:	1417133
    còn đây là chương trình C để mọi người tiện theo dõi
    Code:
    #include <REGX52.H>
    
    #define	LCD_port	P2
    #define	LCD_rs		P2.0
    #define	LCD_en		P2.1
    #define	LCD_D4		P2.4
    #define	LCD_D5 		P2.5
    #define	LCD_D6		P2.6
    #define	LCD_D7		P2.7
    #define MAX_INT		0xffff;
    
    /*
    void delay_us(unsigned);
    void delay_ms(char);
    */
    void LCD_data (char);
    void LCD_cmd(unsigned char d);
    void LCD_reset(void);
    void LCD_init(void);
    int time=0;
    
    sbit RS=P2^0;
    sbit RW=P2^1;
    sbit EN=P2^2;
    sbit BF=P2^7;
    sbit LED=P2^3;
    
    void main(void)
    {
    	P0=P1=P2=P3=0x00;
    
    	LCD_init();
    	LCD_data('B');
    	//LED=1;
    	while(1);
    }
    
    
    
    /*
    void delay_ms(char n)
    {
    	int i=0, z=n*10;
    	TMOD=0x02; // timer 0, mode 2 (8 bit)
    	TL0=TH0=155;
    	for(;i<=z;i++)
    	{
    		TR0=1;
    		while(!TF0);
    		TR0=0;
    		TF0=0;
    	}
    }
    
    void delay_us(unsigned n)
    {
    	unsigned z=MAX_INT - n;
    	TMOD=0x01; // timer 0, mode 1 16 bit
    	TH0=((z>>8)&0xff);
    	TL0=(z&0xff);
    	TR0=1;	// Start counter
    	while(!TF0);// Wait TF0 gone 1
    	TR0=0;	// Stop counter
    	TF0=0;	// Clear TF0
    }
    */
    LCD_busy()
    {
    	/*
    	RS=0;
    	EN=BF=RW=1;
    	*/
    	LCD_port=0x86;
    	while(BF)
    	{
    		EN=0;
    		EN=1;
    	}
    	LCD_port=0;
    }
    
    void LCD_data (unsigned char dat)
    {
    	LCD_port = (dat & 0xF0)|5;
    	LCD_port=(dat & 0xF0);
    
    	LCD_port = ((dat << 4)&0xf0)|5;
    	LCD_port=((dat << 4)&0xf0);
    
    	LCD_busy();
    }
    
    void LCD_cmd(unsigned char d)
    {
    	LCD_port=(d&0xf0)|4;
    	LCD_port=(d&0xf0);
    
    	LCD_port=((d<<4)&0xf0)|4;
    	LCD_port=((d<<4)&0xf0);
    
    	LCD_busy();
    }
    
    void LCD_reset(void)
    {
    	LCD_port=0xff; //Clear all state
    	
    	LCD_busy();
    	LCD_cmd(0x30);
    	
    	LCD_cmd(0x30);
    
    	LCD_cmd(0x30);
    
    	LCD_cmd(0x20);
    }
    
    void LCD_init(void)
    {
    	LCD_reset();
    
    	LCD_cmd(0x28); //4bit mode 2 line 5x7 font
    	LCD_cmd(0x28);
    
    	LCD_cmd(0x0e); // No cursor no blink
    
    	LCD_cmd(0x06);  // Automatic increment no shift display
    
    	//LCD_cmd(0x80);	//Address DDRAM with 0 offset 80h
    }
    Last edited by myth-coder; 09-05-2013, 17:13.

  • #2
    Nhìn lại thấy mình vẽ mạch rối quá. Mình map nó như thế này
    RS->P2.0
    RW->P2.1
    E->P2.2
    Led->P2.3 Cái này mình dùng để test IO với P2_3 và sbit P2^3
    D4->P2.4
    D5->P2.5
    .......
    D7->P2.7

    Mình định đặt LCD hoạt động ở chế độ 4 bit và 2 dòng hiển thị.
    ----------------
    Mình mới tiếp xúc với Proteus và keil c từ hôm qua mọi thứ đều là tự học nên chắc có nhiều sai xót, mọi người chỉ giùm mình với. thanks!

    Comment


    • #3
      Nản quá, chẳng ai quan tâm cả , hay do mình không biết cách hỏi thế?

      Comment


      • #4
        Code:
        #define	LCD_port	P2
        #define	LCD_rs		P2_0
        #define	LCD_en		P2_1
        #define	LCD_D4		P2_4
        #define	LCD_D5 		P2_5
        #define	LCD_D6		P2_6
        #define	LCD_D7		P2_7
        sơ qua có đoạn này sai, sr đang vội nên ko xem hết
        Website chính thức đổi địa chỉ website thành
        Mời các bạn ghé thăm !!!

        Comment


        • #5
          bạn tham khảo các bước khởi tạo cho lcd :
          Click image for larger version

Name:	init_lcd.PNG
Views:	1
Size:	210.8 KB
ID:	1378469
          Code:
          void LCD_busy(void)
          {
          	LCD_D7 = 1;
          	LCD_en = 1;
          	LCD_rs = 0;
          	LCD_rw = 1;
          	LCD_en = 0;
          	while(BF)
          	{
          		LCD_en = 1;
          		LCD_en = 0;
          	}
          	LCD_D7 = 0;
          }
          
          void LCD_data (unsigned char dat)
          {
          	LCD_rs = 1;
          	LCD_port = (LCD_port & 0x0F)|(dat & 0xF0);
          	LCD_en = 1;
          	LCD_en = 0;
          	delay(20);
          	
          	LCD_port = (LCD_port & 0x0F) | (dat<<4);
          	LCD_en = 1;
          	LCD_en = 0;
          	delay(100);
          }
          
          void LCD_cmd(unsigned char dat)
          {
          	LCD_rs = 0;
          	LCD_port = (LCD_port & 0x0F)|(dat & 0xF0);
          	LCD_en = 1;
          	LCD_en = 0;
          	delay(20);
          	
          	LCD_port = (LCD_port & 0x0F) | (dat<<4);
          	LCD_en = 1;
          	LCD_en = 0;
          	delay(100);
          }
          void LCD_init(void)
          {
          	delay(800);
          	LCD_cmd(0x30);
          	delay(500);
          	LCD_cmd(0x30);
          	delay(10);
          	LCD_cmd(0x30);
          	delay(100);
          	LCD_cmd(0x02);
          	delay(100);
          	LCD_cmd(0x28);
          	delay(100);
          	LCD_cmd(0x0e); // No cursor no blink
          	delay(100);
          	LCD_cmd(0x06);  // Automatic increment no shift display
          	delay(100);
          }
          và trong hàm gửi lệnh và gửi dữ liệu ko dùng hàm LCD_busy nhé.

          Comment


          • #6
            Thank các bạn![br] [MENTION=158837]mast090[/MENTION]: đúng là mình sai chỗ đó, nhưng là do trước đó mình vẽ mạch giống thế sau đó cho thêm chân RW và LED nữa và quên không chỉnh lại, có điều ở dưới mình cũng không dùng nó [br][MENTION=206198]huuthobka[/MENTION]: Mình đã thử code bạn sửa nhưng không được.
            Dưới đây là code tối qua mình làm nó bắt đầu hiển thị được ký tự = LCD_data nhưng nếu mình gọi 2 hàm LCD_data thì nó chỉ hiển thị được 1 chữ, nếu có thêm LCD_data lần thứ 3(4,5,6) thì nó hiển thị được kí tự số 1 và số 3(4,5,6) còn thiếu ký tự số 2.
            Nếu mình dùng hàm LCD_string thì không hiển thị được ký tự nào cả
            Code:
            #include <REGX52.H>
            /**    My maps
             *  P2.0 -> RS
             *  P2.1 -> RW
             *  P2.2 -> EN
             *  P2.3 -> LED
             *  P2.4 -> D4
             *  P2.5 -> D5
             *  P2.6 -> D6
             *  P2.7 -> D7
             *  D0-D3 to GND
             *  LCD Work in 4 bit mode
            **/
            #define	LCD_port	P2
            #define MAX_INT		0xffff;
            
            void delay_us(unsigned);
            void delay_ms(char);
            void LCD_data (unsigned char);
            void LCD_cmd(unsigned char d);
            void LCD_init(void);
            void LCD_string(unsigned char *s);
            
            sbit RS=P2^0;
            sbit RW=P2^1;
            sbit EN=P2^2;
            sbit BF=P2^7;
            sbit LED=P2^3;
            
            //int time=0;
            char *logo="Viet Nam chao the gioi";
            
            void main(void)
            {
            	unsigned char j=0;
            	P0=P1=P2=P3=0x00;
            	LCD_init();
            	// Remove '/' below to chose LCD_string
            	//*/
            	LCD_data('V');
            	LCD_data('i');
            	LCD_data('e');
            	/*/
            	LCD_string(logo);
            	//*/
            	LED=1;
            	while(1);
            }
            
            void LCD_string(unsigned char *s)
            {
                 while(*s++)              //till string ends
                  { 
            	  	LCD_data(*s);  //send characters one by one
            	  	//delay_ms(100);
            	  }
            }
            
            
            void delay_ms(char n)
            {
            	int i=0, z=n*10;
            	TMOD=0x02; // timer 0, mode 2 (8 bit)
            	TL0=TH0=155;
            	for(;i<=z;i++)
            	{
            		TR0=1;
            		while(!TF0);
            		TR0=0;
            		TF0=0;
            	}
            }
            
            void delay_us(unsigned n)
            {
            	unsigned z=MAX_INT - n;
            	TMOD=0x01; // timer 0, mode 1 16 bit
            	TH0=((z>>8)&0xff);//High
            	TL0=(z&0xff);//Low
            	TR0=1;	// Start counter
            	while(!TF0);// Wait TF0 gone 1
            	TR0=0;	// Stop counter
            	TF0=0;	// Clear TF0
            }
            
            
            LCD_busy()
            {
            	EN=0;
            	LCD_port=0x86;//BF=1, EN=1, RW=1
            	while(BF)
            	{
            		EN=0;
            		EN=1;
            	}
            	//*/
            	EN=0;
            	BF=0;
            	EN=0;
            	//*/
            }
            
            void LCD_data (unsigned char dat)
            {
            	LCD_port = (dat & 0xF0)|5; // RW=1, EN=1, RS=0
            	EN=0;
            
            	LCD_port = ((dat << 4)&0xf0)|5;// RW=1, EN=1, RS=0
            	LCD_busy();	
            }
            
            void LCD_cmd(unsigned char d)
            {
            	LCD_port=(d&0xf0)|4; // EN=0, RS=RW=0
            	EN=0;
            
            	LCD_port=((d<<4)&0xf0)|4;// EN=0, RS=RW=0
            	LCD_busy();
            }
            
            void LCD_init(void)
            {
            	LCD_port=0x00; //Clear all state
            	
            	LCD_busy();
            	LCD_cmd(0x28); // in 4bits mode with 7x5 font
            	
            	LCD_cmd(0x28);  // in 4bits mode with 7x5 font
            
            	LCD_cmd(0x0f); // No cursor no blink
            
            	LCD_cmd(0x06);  // Automatic increment no shift display
            }

            Comment


            • #7
              LCD de thôi mà. Hiển thị LCD dễ nhất trong mọi thứ. Chỉ việc khởi tạo. Gởi tín hiệu điều khiển hay dữ liệu. Đưa con trỏ về vị trí cần hiển thị. Cho hiển thị dữ liệu là xong.
              Email:
              Phone: 0969 226 539

              Comment


              • #8
                giá con đó na nhiêu vậy các bác? LCD đó

                Comment

                Về tác giả

                Collapse

                myth-coder Tìm hiểu thêm về myth-coder

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

                Collapse

                Đang tải...
                X