اطلاعیه

Collapse
No announcement yet.

اتصال lcd کاراکتری به Xmega

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    اتصال lcd کاراکتری به Xmega

    سلام دوستان
    به نظر ساده می یاد ولی وقتی بخواد اذیت کنه دیگه نمیشه کاریش کرد . راستش خوب اولین بار هست که می خوام lcd کاراکتری رو به xmega وصل کنم از کتابخانه های مختلفی که در قسمت کد های آماده برای xmega اومده استفاده کردم ولی هر کدوم یه مشکلاتی و خطاهایی داشت که نشد که نشد .
    الان lcd من مثل اینکه متصل شده فقط اطلاعات رو ناخوانا و چرت و پرت نشون میده . ! اتصال پایه های کنترلی و دیتا رو هم یکبار دیگه چک کردم . مشکلی وجود نداره ترتیب پایه ها درست است . lcd روی پورت B میکرو atxmega 128A1 متصل شده و jtag نیز غیر فعال شده است .

    1 - - آیا برای اتصال یه lcd کاراکتری به xmega نیاز به قطعات واسطی هست یا مثل ATmega ال سی دی رو بزنیم به پورت و تموم .؟ !
    2 - البته یه چیزایی دیدم که کامل توضیح نداشت فقطط بهش اشاره شده بود که مثل اینکه باید از یه 74hc245 استفاده کنیم ؟ آیا قطعه دیگه ای هم نیاز هست ؟

    این رو هم اضافه کنم که این 74hc245 رو هم واسط نمودم و هیچ تغییری مشاهده نشد .

    چون شماتیک ندارم . (در واقع روی کاغذ کشیدم مدارو . ) پایه ها رو بصورت زیر می آورم و سپس کد ها .

    RS----------B0
    RW----------B1
    E----------B2
    D4----------B4
    D5----------B5
    D6----------B6
    D7----------B7

    البته یک آی سی 74hc245 نیز در بین راه قرار گرفته که شامل همه پین ها است .

    کد هدر

    کد:
    #pragma once
    #include <stdio.h>
    
    
    #define LCD_RS			0 	//define MCU pin connected to LCD RS
    #define LCD_RW			1 	//define MCU pin connected to LCD R/W
    #define LCD_E			2	//define MCU pin connected to LCD E
    #define LCD_D4			4	//define MCU pin connected to LCD D3
    #define LCD_D5			5	//define MCU pin connected to LCD D4
    #define LCD_D6			6	//define MCU pin connected to LCD D5
    #define LCD_D7			7	//define MCU pin connected to LCD D6
    #define LCD_DATA 		PORTB_OUT	//define MCU port connected to LCD data pins
    #define LCD_CONTROL 		PORTB_OUT	//define MCU port connected to LCD control pins
    #define LCD_DATA_DIR 		PORTB_DIR	//define MCU direction register for port connected to LCD data pins
    #define LCD_CONTROL_DIR 	PORTB_DIR	//define MCU direction register for port connected to LCD control pins
    
    //LCD Command
    #define LCD_CLR      	 0	//clear display
    #define LCD_HOME      	1	//return to home position
    #define LCD_ENTRY_MODE   	2	//set entry mode
    #define LCD_ENTRY_INC    	1	//increment
    #define LCD_ENTRY_SHIFT   	0	//shift
    #define LCD_ON_CTRL     	3	//turn lcd/cursor on
    #define LCD_ON_DISPLAY   	2	//turn display on
    #define LCD_ON_CURSOR    	1	//turn cursor on
    #define LCD_ON_BLINK    	0	//blinking cursor
    #define LCD_MOVE      	4	//move cursor/display
    #define LCD_MOVE_DISP    	3	//move display (0-> move cursor)
    #define LCD_MOVE_RIGHT   	2	//move right (0-> left)
    #define LCD_FUNCTION    	5	//function set
    #define LCD_FUNCTION_8BIT  	4	//set 8BIT mode (0->4BIT mode)
    #define LCD_FUNCTION_2LINES 	3	//two lines (0->one line)
    #define LCD_FUNCTION_10DOTS 	2	//5x10 font (0->5x7 font)
    #define LCD_CGRAM      	0x40	//set CG RAM address
    #define LCD_DDRAM      	0x80	//set DD RAM address
    // cursor position to DDRAM mapping
    #define LCD_LINE0_DDRAMADDR		0x00
    #define LCD_LINE1_DDRAMADDR		0x40
    #define LCD_LINE2_DDRAMADDR		0x14
    #define LCD_LINE3_DDRAMADDR		0x54
    
    class LCD_Rose {
     
    	
    	public:
    	void LCDsendChar(char);				//send data to 74HC164
    	void LCDsendCommand(unsigned char);		//send command to 74HC164
    	void LCDinit(void);				//Initializes LCD
    	void LCDstring(char *);				//Outputs string to LCD
    	void LCDGotoXY(unsigned char, unsigned char);	//Cursor to X Y position
    	void LCDstring_Flash(const char* );       //Outputs string to LCD of Flash
    	void LCDshiftRight(unsigned char);		//shift by n characters Right
    	void LCDshiftLeft(unsigned char);		//shift by n characters Left
    	void LCDcursorOn(void);				//Underline cursor ON
    	void LCDcursorOnBlink(void);			//Underline blinking cursor ON
    	void LCDcursorOFF(void);			//Cursor OFF
    	void LCDblank(void);				//LCD blank but not cleared
    	void LCDvisible(void);				//LCD visible
    	void LCDcursorLeft(unsigned char);		//Shift cursor left by n
    	void LCDcursorRight(unsigned char);		//shif cursor right by n
    	void LCDclr(void);				//Clear LCD
    	void LCDnum(unsigned long int num);    	//Display number
    
    };
    کد C++ هدر :
    کد:
    #include "RoseLCD.h"
    #include <avr/io.h>
    #include <util/delay.h>
    //#include <>
    const char Flashnum[]="0123456789";
    
    
    //---------------------------------------------------------------------------------------------------
    void LCD_Rose::LCDsendCommand(unsigned char command)	//Sends Command to LCD
    {
    	LCD_DATA=(command&0xf0);
    	LCD_CONTROL|=1<<LCD_E;
    	_delay_ms(1);
    	LCD_CONTROL&=~(1<<LCD_E);
    	_delay_ms(1);
    	LCD_DATA=((command&0x0f)<<4);
    	LCD_CONTROL|=1<<LCD_E;
    	_delay_ms(1);
    	LCD_CONTROL&=~(1<<LCD_E);
    	_delay_ms(1);
    }
    //------------------------------------------------------------------------------------------------------
    
    
    //----------------------------------------------------------------------------
    void LCD_Rose::LCDinit(void)//Initializes LCD
    {
    	_delay_ms(10);
    	LCD_DATA_DIR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;
    	LCD_CONTROL_DIR|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
    
    	for( char i=0; i<3; i++)
    	{
    		LCD_DATA=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4; //4 bit mode
    		LCD_CONTROL|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
    		_delay_ms(1);
    		LCD_CONTROL&=~(1<<LCD_E);
    		_delay_ms(1);
    	}
    
    	
    	LCD_DATA=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //4 bit mode
    	LCD_CONTROL|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
    	_delay_ms(1);
    	LCD_CONTROL&=~(1<<LCD_E);
    	_delay_ms(1);
    	
    	LCDsendCommand(0x28);
    	LCDsendCommand(0x01);
    	LCDsendCommand(0x06);
    	LCDsendCommand(0x0f);
    }
    //---------------------------------------------------------------------------------------------------
    //
    
    //
    //------------------------------------------------------------------------------------------------------
    void LCD_Rose::LCDsendChar(char ch)		//Sends Char to LCD
    {
    	LCD_DATA=(ch&0xf0);
    	LCD_CONTROL|=1<<LCD_RS;
    	LCD_CONTROL|=1<<LCD_E;
    	_delay_ms(1);
    	LCD_CONTROL&=~(1<<LCD_E);
    	LCD_CONTROL&=~(1<<LCD_RS); 
    	_delay_ms(1);
    	LCD_DATA=((ch&0x0f)<<4);
    	LCD_CONTROL|=1<<LCD_RS;
    	LCD_CONTROL|=1<<LCD_E;
    	_delay_ms(1);
    	LCD_CONTROL&=~(1<<LCD_E);
    	LCD_CONTROL&=~(1<<LCD_RS);
    	_delay_ms(1);
    }
    //---------------------------------------------------------------------------------------------------------
    //
    //----------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDstring(char* data)	//Outputs string to LCD
    {
    	unsigned char i=0;
    	while(data[i])
    	{
    		LCDsendChar(data[i]);
    		i++;
    	}
    }
    //---------------------------------------------------------------------------------------------------------
    //
    //---------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDGotoXY(unsigned char x, unsigned char y)	//Cursor to X Y position
    {
    	unsigned char DDRAMAddr;
    
    	switch(y)
    	{
    		case 0: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; break;
    		case 1: DDRAMAddr = LCD_LINE1_DDRAMADDR+x; break;
    		case 2: DDRAMAddr = LCD_LINE2_DDRAMADDR+x; break;
    		case 3: DDRAMAddr = LCD_LINE3_DDRAMADDR+x; break;
    	}
    	// set data address
    	LCDsendCommand(LCD_DDRAM | DDRAMAddr);
    	
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDstring_Flash(const char* data)	//Outputs string to LCD of Flash
    {
    	unsigned char i=0;
    	while(data[i])
    	{
    		LCDsendChar(data[i]);
    		i++;
    	}
    }
    //-----------------------------------------------------------------------------------------------------------
    //
    //-----------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDshiftLeft(unsigned char n)	//Scrol n of characters Right
    {
    	for (unsigned char i=0;i<n;i++)
    	LCDsendCommand(0x1E);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDshiftRight(unsigned char n)	//Scrol n of characters Left
    {
    	for (unsigned char i=0;i<n;i++)
    	LCDsendCommand(0x18);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDcursorOn(void) //displays LCD cursor
    {
    	LCDsendCommand(0x0E);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDcursorOnBlink(void)	//displays LCD blinking cursor
    {
    	LCDsendCommand(0x0F);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDcursorOFF(void)	//turns OFF cursor
    {
    	LCDsendCommand(0x0C);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDblank(void)		//blanks LCD
    {
    	LCDsendCommand(0x08);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDvisible(void)		//Shows LCD
    {
    	LCDsendCommand(0x0C);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDcursorLeft(unsigned char n)	//Moves cursor by n poisitions left
    {
    	for (unsigned char i=0;i<n;i++)
    	LCDsendCommand(0x10);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDcursorRight(unsigned char n)	//Moves cursor by n poisitions left
    {
    	for (unsigned char i=0;i<n;i++)
    	LCDsendCommand(0x14);
    }
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    
    void LCD_Rose::LCDclr(void)			//Clears LCD
    {
    	LCDsendCommand(1<<LCD_CLR);
    }
    
    //--------------------------------------------------------------------------------------------------------
    //
    //--------------------------------------------------------------------------------------------------------
    void LCD_Rose::LCDnum(unsigned long int num)
    {
    	volatile unsigned char Digit[7];
    	volatile unsigned char i;
    	for (i=0;i<8;i++)
    	{
    		Digit[i]=num%10;
    		num/=10;
    		if(num==0)
    		break;
    	}
    	do
    	{
    		 LCDsendChar(Flashnum[Digit[i]]);
    		i--;
    	}while(i<255);
    }

    کد تابع اصلی :

    کد:
    int main(void)
    {
    
    	system_clocks_init();
    	
    	LCD.LCDinit();
    	LCD.LCDcursorOFF();
    
    
    	
    
    	
    	
    	
    	while(1)
    	{
    
    			LCD.LCDclr();
    		LCD.LCDGotoXY(0,0);
    		LCD.LCDstring("Ready...");	
    		fcpu_delay_ms(3000);
    	}
    }
    این رو هم اضافه کنم که این هدر رو برای mega 32 استفاده کردم و مشکلی نداشته . :angry:
    - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

    #2
    پاسخ : اتصال lcd کاراکتری به Xmega

    نسخه دیگری از کتابخانه با c را که از جهاتی تکمیل شده تر است، برای IAR قرار داده ام که اگر جزئیات آن را ببینید و با سورس خود مقایسه کنید، احتمالا به مشکل پی خواهید برد:

    http://knowledgeplus.ir/userfiles/Lcd_char_farsi_1.rar
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : اتصال lcd کاراکتری به Xmega

      با سلام و عرض ادب
      استاد همون طور که فرمودید عمل کردم و فایل هدر خودم را با هدر شما مقایسه نموده و تقریبا تمام قسمت ها رو تغییر دادم بجز موارد جزئی .
      قسمت مربوط به ساپورت انواع LCD رو هم حذف کردم .
      با تشکر از شما باید بعرض برسانم در حال حاضر مشکل اصلی برطرف شده یعنی نوشته ها رو روی LCD دارم ولی یه اشکال کوچولو هنوز وجود داره که با تغییراتی مختلف در کد ها و مغادیر نتونستم حلش کنم . لطفا راهنمایی فرمائید . (چون با Atmel Studio و زبان C++ کار می کنم مجبور شدم تغییراتی را در هدر ها بدهم )

      البته این رو هم اضافه کنم که سه پایه کنترلی رو به پورت A پین های
      2- RS
      3- RW
      4 - E
      منتقل کردم

      مشکل فعلی : در خط اول LCD کلماتی که برای نمایش ارسال میشوند . 10 کارکتر اول حذف میشود یا نمایش داده نمی شود مثل اینکه نشانگر درست روی نقطه 0 و 0 نمی رود . ولی در خط دوم مشکلی مشاهده نشد .

      کد هدر h
      کد:
      #pragma once
      #include <stdio.h>
      
      #define LCD_D4_DIR	PORTB_DIR
      #define LCD_D4_DATA	PORTB_OUT
      #define LCD_D4_BIT	4
      
      #define LCD_D5_DIR	PORTB_DIR
      #define LCD_D5_DATA	PORTB_OUT
      #define LCD_D5_BIT	5
      
      #define LCD_D6_DIR	PORTB_DIR
      #define LCD_D6_DATA	PORTB_OUT
      #define LCD_D6_BIT	6
      
      #define LCD_D7_DIR	PORTB_DIR
      #define LCD_D7_DATA	PORTB_OUT
      #define LCD_D7_IN	PORTB_IN
      #define LCD_D7_BIT	7
      
      #define LCD_E_DIR	PORTA_DIR
      #define LCD_E_PORT 	PORTA_OUT
      #define LCD_E_BIT 	4
      
      #define LCD_RW_DIR	PORTA_DIR
      #define LCD_RW_PORT 	PORTA_OUT
      #define LCD_RW_BIT 	3
      
      #define LCD_RS_DIR	PORTA_DIR
      #define LCD_RS_PORT 	PORTA_OUT
      #define LCD_RS_BIT 	2
      
      #define E_High()	LCD_E_PORT|=(1<<LCD_E_BIT)
      #define E_Low()		LCD_E_PORT&=~(1<<LCD_E_BIT)
      
      #define RW_High()	LCD_RW_PORT|=(1<<LCD_RW_BIT)
      #define RW_Low()	LCD_RW_PORT&=~(1<<LCD_RW_BIT)
      
      #define RS_High()	LCD_RS_PORT|=(1<<LCD_RS_BIT)
      #define RS_Low()	LCD_RS_PORT&=~(1<<LCD_RS_BIT)
      
      
      
      #define LCD_CLR  1	 // clear display 1
      #define LCD_HOME  2	 // return to home position 2
      #define LCD_DDRAM 0x80	 //DB7: set DD RAM address 7 
      
      // cursor position to DDRAM mapping
      
      #define LCD_LINE0_DDRAMADDR		0x00
      #define LCD_LINE1_DDRAMADDR		0x40
      
      
      class LCD_Rose {
      
      	public:
      	void LCDsendChar(char);				//send data to 74HC164
      	void LCDSendCommand(unsigned char);		//send command to 74HC164
      	void LCDinit(void);				//Initializes LCD
      	void LCDstring(char *);				//Outputs string to LCD
      	void LCDGotoXY(unsigned char, unsigned char);	//Cursor to X Y position
      	void LCDstring_Flash(const char* );       //Outputs string to LCD of Flash
      	void LCDshiftRight(unsigned char);		//shift by n characters Right
      	void LCDshiftLeft(unsigned char);		//shift by n characters Left
      	void LCDcursorOn(void);				//Underline cursor ON
      	void LCDcursorOnBlink(void);			//Underline blinking cursor ON
      	void LCDcursorOFF(void);			//Cursor OFF
      	void LCDblank(void);				//LCD blank but not cleared
      	void LCDvisible(void);				//LCD visible
      	void LCDcursorLeft(unsigned char);		//Shift cursor left by n
      	void LCDcursorRight(unsigned char);		//shif cursor right by n
      	void LCDclr(void);				//Clear LCD
      	void LCDnum(unsigned long int num);    	//Display number
      	void LCDBusyWait(void);
      	void LCDDataLines(unsigned char Data);
      	void LCDDirOut(void);
      	void LCDDirIn(void);
      };
      فایل C++
      کد:
      #include "RoseLCD.h"
      #include <avr/io.h>
      #include <util/delay.h>
      //#include <>
      const char Flashnum[]="0123456789";
      
      
      //---------------------------------------------------------------------------------------------------
      void LCD_Rose::LCDSendCommand(unsigned char Command)	//Sends Command to LCD
      {
      	if ((Command==LCD_CLR)||(Command==LCD_HOME))
      	_delay_ms(5);
      	else _delay_ms(1);
      
      	LCDDataLines((Command>>4));
      	RS_Low();
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_us(20);
      	LCDDataLines(Command);
      	E_High();
      	_delay_us(20);
      	E_Low();
      }
      //------------------------------------------------------------------------------------------------------
      
      
      //----------------------------------------------------------------------------
      void LCD_Rose::LCDinit(void)//Initializes LCD
      {
      	E_Low();
      	LCDDirIn();
      	_delay_ms(40);
      	LCDDirOut();
      	LCDDataLines(0x30>>4);
      	LCD_RS_DIR|=(1<<LCD_RS_BIT);
      	LCD_RW_DIR|=(1<<LCD_RW_BIT);
      	RS_Low();
      	RW_Low();
      	LCD_E_DIR|=(1<<LCD_E_BIT);
      	_delay_us(20);
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_ms(20);
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_us(100);
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_us(100);
      	LCDDataLines(0x20>>4);
      	_delay_us(20);
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_us(100);
      	LCDSendCommand(0x28);
      	LCDSendCommand(0x08);
      	LCDSendCommand(0x01);
      	LCDSendCommand(0x06);
      	LCDSendCommand(0x0C);
      }
      //---------------------------------------------------------------------------------------------------
      //
      
      //
      //------------------------------------------------------------------------------------------------------
      void LCD_Rose::LCDsendChar(char Data)		//Sends Char to LCD
      {
      	_delay_us(100);
      	LCDDataLines(Data>>4);
      	RS_High();
      	E_High();
      	_delay_us(20);
      	E_Low();
      	_delay_us(20);
      	LCDDataLines(Data);
      	E_High();
      	_delay_us(20);
      	E_Low();
      }
      //---------------------------------------------------------------------------------------------------------
      //
      //----------------------------------------------------------------------------------------------------------
      
      
      
      
      void LCD_Rose::LCDstring(char* data)	//Outputs string to LCD
      {
      	unsigned char i=0;
      	while(data[i])
      	{
      		LCDsendChar(data[i]);
      		i++;
      	}
      }
      //---------------------------------------------------------------------------------------------------------
      //
      //---------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDGotoXY(unsigned char x, unsigned char y)	//Cursor to X Y position
      {
      	unsigned char DDRAMAddr;
      
      	DDRAMAddr = LCD_LINE0_DDRAMADDR+x;
      
      	switch(y)
      	{
      		case 0: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; break;
      		case 1: DDRAMAddr = LCD_LINE1_DDRAMADDR+x; break;
      	}
      
      
      	LCDSendCommand( LCD_DDRAM | DDRAMAddr);  // 1<<LCD_DDRAM
      	
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      
      void LCD_Rose::LCDstring_Flash(const char* data)	//Outputs string to LCD of Flash
      {
      	unsigned char i=0;
      	while(data[i])
      	{
      		LCDsendChar(data[i]);
      		i++;
      	}
      }
      //-----------------------------------------------------------------------------------------------------------
      //
      //-----------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDshiftLeft(unsigned char n)	//Scrol n of characters Right
      {
      	for (unsigned char i=0;i<n;i++)
      	{
      		LCDSendCommand(0x1E);
      	}
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDshiftRight(unsigned char n)	//Scrol n of characters Left
      {
      	for (unsigned char i=0;i<n;i++)
      	{
      		LCDSendCommand(0x18);
      	}
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDcursorOn(void) //displays LCD cursor
      {
      	LCDSendCommand(0x0E);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDcursorOnBlink(void)	//displays LCD blinking cursor
      {
      	LCDSendCommand(0x0F);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDcursorOFF(void)	//turns OFF cursor
      {
      	LCDSendCommand(0x0C);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDblank(void)		//blanks LCD
      {
      	LCDSendCommand(0x08);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDvisible(void)		//Shows LCD
      {
      	LCDSendCommand(0x0C);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDcursorLeft(unsigned char n)	//Moves cursor by n poisitions left
      {
      	for (unsigned char i=0;i<n;i++)
      	LCDSendCommand(0x10);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDcursorRight(unsigned char n)	//Moves cursor by n poisitions left
      {
      	for (unsigned char i=0;i<n;i++)
      	LCDSendCommand(0x14);
      }
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      
      void LCD_Rose::LCDclr(void)			//Clears LCD
      {
      	LCDSendCommand(LCD_CLR);
      }
      
      
      //--------------------------------------------------------------------------------------------------------
      //
      //--------------------------------------------------------------------------------------------------------
      void LCD_Rose::LCDnum(unsigned long int num)
      {
      	volatile unsigned char Digit[7];
      	volatile unsigned char i;
      	for (i=0;i<8;i++)
      	{
      		Digit[i]=num%10;
      		num/=10;
      		if(num==0)
      		break;
      	}
      	do
      	{
      		LCDsendChar(Flashnum[Digit[i]]);
      		i--;
      	}while(i<255);
      }
      
      
      void LCD_Rose::LCDBusyWait(void)
      {
      	RS_Low();
      	LCDDirIn();
      	RW_High();
      	E_High();
      	_delay_us(1);
      	while(LCD_D7_IN&(1<<LCD_D7_BIT))
      	{
      		E_Low();
      		_delay_us(1);
      		E_High();
      		_delay_us(1);
      		E_Low();
      		_delay_us(1);
      		E_High();
      		_delay_us(1);
      	}
      	E_Low();
      	LCDDirOut();
      }
      
      void LCD_Rose::LCDDataLines(unsigned char Data)
      {
      	unsigned char temp;
      	temp=(Data&0x01);
      	LCD_D4_DATA=((LCD_D4_DATA&~(1<<LCD_D4_BIT))|(temp<<LCD_D4_BIT));
      	temp=((Data&0x02)>>1);
      	LCD_D5_DATA=((LCD_D5_DATA&~(1<<LCD_D5_BIT))|(temp<<LCD_D5_BIT));
      	temp=((Data&0x04)>>2);
      	LCD_D6_DATA=((LCD_D6_DATA&~(1<<LCD_D6_BIT))|(temp<<LCD_D6_BIT));
      	temp=((Data&0x08)>>3);
      	LCD_D7_DATA=((LCD_D7_DATA&~(1<<LCD_D7_BIT))|(temp<<LCD_D7_BIT));
      }
      
      void LCD_Rose::LCDDirOut(void)
      {
      	LCD_D4_DIR|=(1<<LCD_D4_BIT);
      	LCD_D5_DIR|=(1<<LCD_D5_BIT);
      	LCD_D6_DIR|=(1<<LCD_D6_BIT);
      	LCD_D7_DIR|=(1<<LCD_D7_BIT);
      }
      
      void LCD_Rose::LCDDirIn(void)
      {
      	LCD_D4_DIR&=~(1<<LCD_D4_BIT);
      	LCD_D5_DIR&=~(1<<LCD_D5_BIT);
      	LCD_D6_DIR&=~(1<<LCD_D6_BIT);
      	LCD_D7_DIR&=~(1<<LCD_D7_BIT);
      }
      در تابع اصل برای مثال کد زیر که اجرا میشود
      کد:
      	LCD.LCDclr();
      	LCD.LCDGotoXY(0,0);
      	LCD.LCDstring("Model:RE-15000");



      در LCD در خط اول فقط قسمت عدد 5000 در ابتدای خط نمایش داده میشود. با تشکر فراوان از راهنمایی های شما و دیگر دوستان امیدوارم بتوانم به سهم و سواد خود در این انجمن زحمتهای شما را جبران نمایم .
      - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

      دیدگاه


        #4
        پاسخ : اتصال lcd کاراکتری به Xmega

        اشکال احتمالا ناشی از سایز LCD مورد استفاده است. اگر در کتابخانه ای که قرار دادم دقت کنید، برای سایز های مختلف باید آدرس ها بصورت متفاوتی تعریف شوند. LCD مورد استفاده شما دارای چه سایزی است؟
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : اتصال lcd کاراکتری به Xmega

          با انجام تغییراتی در مقادیر فایل هدر مشکل برطرف شد . با تشکر از جناب طراح
          کد های زیر برای استفاده از LCD کاراکتری در ATmel Studio 6.1 بزبان C++ می باشد .

          هدر

          کد:
          #pragma once
          #include <stdio.h>
          
          #define LCD_D4_DIR	PORTB_DIR
          #define LCD_D4_DATA	PORTB_OUT
          #define LCD_D4_BIT	4
          
          #define LCD_D5_DIR	PORTB_DIR
          #define LCD_D5_DATA	PORTB_OUT
          #define LCD_D5_BIT	5
          
          #define LCD_D6_DIR	PORTB_DIR
          #define LCD_D6_DATA	PORTB_OUT
          #define LCD_D6_BIT	6
          
          #define LCD_D7_DIR	PORTB_DIR
          #define LCD_D7_DATA	PORTB_OUT
          #define LCD_D7_IN	PORTB_IN
          #define LCD_D7_BIT	7
          
          #define LCD_E_DIR	PORTA_DIR
          #define LCD_E_PORT 	PORTA_OUT
          #define LCD_E_BIT 	4
          
          #define LCD_RW_DIR	PORTA_DIR
          #define LCD_RW_PORT 	PORTA_OUT
          #define LCD_RW_BIT 	3
          
          #define LCD_RS_DIR	PORTA_DIR
          #define LCD_RS_PORT 	PORTA_OUT
          #define LCD_RS_BIT 	2
          
          #define E_High()	LCD_E_PORT|=(1<<LCD_E_BIT)
          #define E_Low()		LCD_E_PORT&=~(1<<LCD_E_BIT)
          
          #define RW_High()	LCD_RW_PORT|=(1<<LCD_RW_BIT)
          #define RW_Low()	LCD_RW_PORT&=~(1<<LCD_RW_BIT)
          
          #define RS_High()	LCD_RS_PORT|=(1<<LCD_RS_BIT)
          #define RS_Low()	LCD_RS_PORT&=~(1<<LCD_RS_BIT)
          
          
          
          #define LCD_CLR  1	 // clear display 1
          #define LCD_HOME  2	 // return to home position 2
          #define LCD_DDRAM 0x20	 //DB7: set DD RAM address 7 
          
          // cursor position to DDRAM mapping
          
          #define LCD_LINE0_DDRAMADDR		0x00
          #define LCD_LINE1_DDRAMADDR		0x40
          
          
          class LCD_Rose {
          
          	public:
          	void LCDsendChar(char);				//send data to 74HC164
          	void LCDSendCommand(unsigned char);		//send command to 74HC164
          	void LCDinit(void);				//Initializes LCD
          	void LCDstring(char *);				//Outputs string to LCD
          	void LCDGotoXY(unsigned char, unsigned char);	//Cursor to X Y position
          	void LCDstring_Flash(const char* );       //Outputs string to LCD of Flash
          	void LCDshiftRight(unsigned char);		//shift by n characters Right
          	void LCDshiftLeft(unsigned char);		//shift by n characters Left
          	void LCDcursorOn(void);				//Underline cursor ON
          	void LCDcursorOnBlink(void);			//Underline blinking cursor ON
          	void LCDcursorOFF(void);			//Cursor OFF
          	void LCDblank(void);				//LCD blank but not cleared
          	void LCDvisible(void);				//LCD visible
          	void LCDcursorLeft(unsigned char);		//Shift cursor left by n
          	void LCDcursorRight(unsigned char);		//shif cursor right by n
          	void LCDclr(void);				//Clear LCD
          	void LCDnum(unsigned long int num);    	//Display number
          	void LCDBusyWait(void);
          	void LCDDataLines(unsigned char Data);
          	void LCDDirOut(void);
          	void LCDDirIn(void);
          };
          فایل C++

          کد:
          #include "RoseLCD.h"
          #include <avr/io.h>
          #include <util/delay.h>
          //#include <>
          const char Flashnum[]="0123456789";
          
          
          //---------------------------------------------------------------------------------------------------
          void LCD_Rose::LCDSendCommand(unsigned char Command)	//Sends Command to LCD
          {
          	//if ((Command==LCD_CLR)||(Command==LCD_HOME))
          	//_delay_ms(5);
          	//else _delay_ms(1);
            _delay_ms(10);
          	LCDDataLines((Command>>4));
          	RS_Low();
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_us(20);
          	LCDDataLines(Command);
          	E_High();
          	_delay_us(20);
          	E_Low();
          }
          //------------------------------------------------------------------------------------------------------
          
          
          //----------------------------------------------------------------------------
          void LCD_Rose::LCDinit(void)//Initializes LCD
          {
          	E_Low();
          	LCDDirIn();
          	_delay_ms(40);
          	LCDDirOut();
          	LCDDataLines(0x30>>4);
          	LCD_RS_DIR|=(1<<LCD_RS_BIT);
          	LCD_RW_DIR|=(1<<LCD_RW_BIT);
          	RS_Low();
          	RW_Low();
          	LCD_E_DIR|=(1<<LCD_E_BIT);
          	_delay_us(20);
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_ms(20);
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_us(100);
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_us(100);
          	LCDDataLines(0x20>>4);
          	_delay_us(20);
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_us(100);
          	LCDSendCommand(0x28);
          	LCDSendCommand(0x08);
          	LCDSendCommand(0x01);
          	LCDSendCommand(0x06);
          	LCDSendCommand(0x0C);
          }
          //---------------------------------------------------------------------------------------------------
          //
          
          //
          //------------------------------------------------------------------------------------------------------
          void LCD_Rose::LCDsendChar(char Data)		//Sends Char to LCD
          {
          	_delay_us(100);
          	LCDDataLines(Data>>4);
          	RS_High();
          	E_High();
          	_delay_us(20);
          	E_Low();
          	_delay_us(20);
          	LCDDataLines(Data);
          	E_High();
          	_delay_us(20);
          	E_Low();
          }
          //---------------------------------------------------------------------------------------------------------
          //
          //----------------------------------------------------------------------------------------------------------
          
          
          
          
          void LCD_Rose::LCDstring(char* data)	//Outputs string to LCD
          {
          	unsigned char i=0;
          	while(data[i])
          	{
          		LCDsendChar(data[i]);
          		i++;
          	}
          }
          //---------------------------------------------------------------------------------------------------------
          //
          //---------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDGotoXY(unsigned char x, unsigned char y)	//Cursor to X Y position
          {
          	unsigned char DDRAMAddr;
          
          		if(y==0) DDRAMAddr = LCD_LINE0_DDRAMADDR+x;
          		else if(y==1) DDRAMAddr = LCD_LINE1_DDRAMADDR+x; 
          
          	LCDSendCommand( 1 << 0x07 | DDRAMAddr);  //1<< 
          	
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          
          void LCD_Rose::LCDstring_Flash(const char* data)	//Outputs string to LCD of Flash
          {
          	unsigned char i=0;
          	while(data[i])
          	{
          		LCDsendChar(data[i]);
          		i++;
          	}
          }
          //-----------------------------------------------------------------------------------------------------------
          //
          //-----------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDshiftLeft(unsigned char n)	//Scrol n of characters Right
          {
          	for (unsigned char i=0;i<n;i++)
          	{
          		LCDSendCommand(0x1E);
          	}
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDshiftRight(unsigned char n)	//Scrol n of characters Left
          {
          	for (unsigned char i=0;i<n;i++)
          	{
          		LCDSendCommand(0x18);
          	}
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDcursorOn(void) //displays LCD cursor
          {
          	LCDSendCommand(0x0E);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDcursorOnBlink(void)	//displays LCD blinking cursor
          {
          	LCDSendCommand(0x0F);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDcursorOFF(void)	//turns OFF cursor
          {
          	LCDSendCommand(0x0C);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDblank(void)		//blanks LCD
          {
          	LCDSendCommand(0x08);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDvisible(void)		//Shows LCD
          {
          	LCDSendCommand(0x0C);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDcursorLeft(unsigned char n)	//Moves cursor by n poisitions left
          {
          	for (unsigned char i=0;i<n;i++)
          	LCDSendCommand(0x10);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDcursorRight(unsigned char n)	//Moves cursor by n poisitions left
          {
          	for (unsigned char i=0;i<n;i++)
          	LCDSendCommand(0x14);
          }
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          
          void LCD_Rose::LCDclr(void)			//Clears LCD
          {
          	LCDSendCommand(0x01);
          }
          
          
          //--------------------------------------------------------------------------------------------------------
          //
          //--------------------------------------------------------------------------------------------------------
          void LCD_Rose::LCDnum(unsigned long int num)
          {
          	volatile unsigned char Digit[7];
          	volatile unsigned char i;
          	for (i=0;i<8;i++)
          	{
          		Digit[i]=num%10;
          		num/=10;
          		if(num==0)
          		break;
          	}
          	do
          	{
          		LCDsendChar(Flashnum[Digit[i]]);
          		i--;
          	}while(i<255);
          }
          
          
          void LCD_Rose::LCDBusyWait(void)
          {
          	RS_Low();
          	LCDDirIn();
          	RW_High();
          	E_High();
          	_delay_us(1);
          	while(LCD_D7_IN&(1<<LCD_D7_BIT))
          	{
          		E_Low();
          		_delay_us(1);
          		E_High();
          		_delay_us(1);
          		E_Low();
          		_delay_us(1);
          		E_High();
          		_delay_us(1);
          	}
          	E_Low();
          	LCDDirOut();
          }
          
          void LCD_Rose::LCDDataLines(unsigned char Data)
          {
          	unsigned char temp;
          	temp=(Data&0x01);
          	LCD_D4_DATA=((LCD_D4_DATA&~(1<<LCD_D4_BIT))|(temp<<LCD_D4_BIT));
          	temp=((Data&0x02)>>1);
          	LCD_D5_DATA=((LCD_D5_DATA&~(1<<LCD_D5_BIT))|(temp<<LCD_D5_BIT));
          	temp=((Data&0x04)>>2);
          	LCD_D6_DATA=((LCD_D6_DATA&~(1<<LCD_D6_BIT))|(temp<<LCD_D6_BIT));
          	temp=((Data&0x08)>>3);
          	LCD_D7_DATA=((LCD_D7_DATA&~(1<<LCD_D7_BIT))|(temp<<LCD_D7_BIT));
          }
          
          void LCD_Rose::LCDDirOut(void)
          {
          	LCD_D4_DIR|=(1<<LCD_D4_BIT);
          	LCD_D5_DIR|=(1<<LCD_D5_BIT);
          	LCD_D6_DIR|=(1<<LCD_D6_BIT);
          	LCD_D7_DIR|=(1<<LCD_D7_BIT);
          }
          
          void LCD_Rose::LCDDirIn(void)
          {
          	LCD_D4_DIR&=~(1<<LCD_D4_BIT);
          	LCD_D5_DIR&=~(1<<LCD_D5_BIT);
          	LCD_D6_DIR&=~(1<<LCD_D6_BIT);
          	LCD_D7_DIR&=~(1<<LCD_D7_BIT);
          }
          قبل از Main
          includ نمودن فایل هدر و تعریف یک Object از نام کلاس LCD که در فایل هدر تعریف شده است مثل :
          کد:
          
          LCD_Rose LCD;


          استفاده در Main

          کد:
          int main(void)
           {
          	 system_clocks_init();
          	 LCD.LCDinit();
          	 
          	 
          	 
          	   LCD.LCDclr();
          	 	 LCD.LCDGotoXY(1,0);
          	 	 LCD.LCDstring("Test");
          		 	 fcpu_delay_ms(1000);
          			  
          	 
          	 
          	 while(1)
          	 {
          		 	   LCD.LCDclr();
          		 	   LCD.LCDGotoXY(0,0);
          		 	   LCD.LCDnum(VC);
          				 
          		 
          		 VC++;
          	 }
           }
          فقط توجه شود که در این هدر حالت ساپورت چند LCD حذف شده و برای LCD 2*16 تنظیم شده است . :mrgreen:
          - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

          دیدگاه


            #6
            پاسخ : اتصال lcd کاراکتری به Xmega

            از نظر سخت افزاری آیا میشه مستقیما lcd را به xmega متصل کرد یا برای تبدیل ولتاژ باید آی سی واسط استفاده کنیم؟
            در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

            1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
            2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
            3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

            دیدگاه


              #7
              پاسخ : اتصال lcd کاراکتری به Xmega

              راستش من روی برد آی سی 74hc245 رو گذاشتم و الان مشکلی نیست . اجازه بده تا فردا برش می دارم عملا تست می کنم به شما اطلاع می دم .

              توی یه فرصت کوچیک تستش کردم این آی سی رو حذف کردم . و مشکلی بوجود نیومد . پس می تونم بگم

              بله میشه بدون هیچ واسط lcd کارکتری رو می تونید به xmega متصل نمائید . موفق باشید
              - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

              دیدگاه


                #8
                پاسخ : اتصال lcd کاراکتری به Xmega

                ممنون از پاسختون.
                تغذیه lcd را چند ولت دادین ؟ 3.3 یا 5 ولت
                در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                دیدگاه


                  #9
                  پاسخ : اتصال lcd کاراکتری به Xmega

                  تغذیه LCD رو 5 ولت دادم .
                  - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

                  دیدگاه


                    #10
                    پاسخ : اتصال lcd کاراکتری به Xmega

                    من تصور می کنم تا زمانی که به صورت معمولی یعنی فقط نمایش اطلاعات بر روی lcd بخواهیم ازش استفاده کنیم با تغذیه 5 ولت مشکلی نداشته باشه چون همه پایه ها ورودی هستند ولی اگه بخواهیم از lcd چیزی بخونیم شاید این تغذیه 5 ولت مشکل ساز باشه.
                    یک سئوال دیگه اصلا lcd با تغذیه 3.3 ولت کار میکنه؟
                    در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                    1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                    2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                    3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                    دیدگاه


                      #11
                      پاسخ : اتصال lcd کاراکتری به Xmega

                      شاید درست میگید . نمی دونم باید در عمل تست بشه .
                      در مورد ولتاژ می تونم عملی هم تست کنم ولی در حال حاضر فرصت نمیشه . اگر تونستم انجام می دم اعلام می کنم .
                      - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

                      دیدگاه


                        #12
                        پاسخ : اتصال lcd کاراکتری به Xmega

                        ممنون از وقتی که صرف می کنید.
                        در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                        1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                        2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                        3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                        دیدگاه


                          #13
                          پاسخ : اتصال lcd کاراکتری به Xmega

                          نوشته اصلی توسط siyavash2k
                          یک سئوال دیگه اصلا lcd با تغذیه 3.3 ولت کار میکنه؟
                          LCD های کاراکتری (و سایر انواع LCD) با تغذیه 3.3 ولت هم وجود دارند که ظاهرا در بازار داخل موجود نیست:

                          http://www.futurlec.com/LED/LCD16X2BL-3V3.shtml

                          https://www.sparkfun.com/products/9054
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #14
                            پاسخ : اتصال lcd کاراکتری به Xmega

                            نوشته اصلی توسط مرد نامرئی
                            با انجام تغییراتی در مقادیر فایل هدر مشکل برطرف شد . با تشکر از جناب طراح
                            کد های زیر برای استفاده از LCD کاراکتری در ATmel Studio 6.1 بزبان C++ می باشد .

                            هدر

                            کد:
                            #pragma once
                            #include <stdio.h>
                            
                            #define LCD_D4_DIR	PORTB_DIR
                            #define LCD_D4_DATA	PORTB_OUT
                            #define LCD_D4_BIT	4
                            
                            #define LCD_D5_DIR	PORTB_DIR
                            #define LCD_D5_DATA	PORTB_OUT
                            #define LCD_D5_BIT	5
                            
                            #define LCD_D6_DIR	PORTB_DIR
                            #define LCD_D6_DATA	PORTB_OUT
                            #define LCD_D6_BIT	6
                            
                            #define LCD_D7_DIR	PORTB_DIR
                            #define LCD_D7_DATA	PORTB_OUT
                            #define LCD_D7_IN	PORTB_IN
                            #define LCD_D7_BIT	7
                            
                            #define LCD_E_DIR	PORTA_DIR
                            #define LCD_E_PORT 	PORTA_OUT
                            #define LCD_E_BIT 	4
                            
                            #define LCD_RW_DIR	PORTA_DIR
                            #define LCD_RW_PORT 	PORTA_OUT
                            #define LCD_RW_BIT 	3
                            
                            #define LCD_RS_DIR	PORTA_DIR
                            #define LCD_RS_PORT 	PORTA_OUT
                            #define LCD_RS_BIT 	2
                            
                            #define E_High()	LCD_E_PORT|=(1<<LCD_E_BIT)
                            #define E_Low()		LCD_E_PORT&=~(1<<LCD_E_BIT)
                            
                            #define RW_High()	LCD_RW_PORT|=(1<<LCD_RW_BIT)
                            #define RW_Low()	LCD_RW_PORT&=~(1<<LCD_RW_BIT)
                            
                            #define RS_High()	LCD_RS_PORT|=(1<<LCD_RS_BIT)
                            #define RS_Low()	LCD_RS_PORT&=~(1<<LCD_RS_BIT)
                            
                            
                            
                            #define LCD_CLR  1	 // clear display 1
                            #define LCD_HOME  2	 // return to home position 2
                            #define LCD_DDRAM 0x20	 //DB7: set DD RAM address 7 
                            
                            // cursor position to DDRAM mapping
                            
                            #define LCD_LINE0_DDRAMADDR		0x00
                            #define LCD_LINE1_DDRAMADDR		0x40
                            
                            
                            class LCD_Rose {
                            
                            	public:
                            	void LCDsendChar(char);				//send data to 74HC164
                            	void LCDSendCommand(unsigned char);		//send command to 74HC164
                            	void LCDinit(void);				//Initializes LCD
                            	void LCDstring(char *);				//Outputs string to LCD
                            	void LCDGotoXY(unsigned char, unsigned char);	//Cursor to X Y position
                            	void LCDstring_Flash(const char* );       //Outputs string to LCD of Flash
                            	void LCDshiftRight(unsigned char);		//shift by n characters Right
                            	void LCDshiftLeft(unsigned char);		//shift by n characters Left
                            	void LCDcursorOn(void);				//Underline cursor ON
                            	void LCDcursorOnBlink(void);			//Underline blinking cursor ON
                            	void LCDcursorOFF(void);			//Cursor OFF
                            	void LCDblank(void);				//LCD blank but not cleared
                            	void LCDvisible(void);				//LCD visible
                            	void LCDcursorLeft(unsigned char);		//Shift cursor left by n
                            	void LCDcursorRight(unsigned char);		//shif cursor right by n
                            	void LCDclr(void);				//Clear LCD
                            	void LCDnum(unsigned long int num);    	//Display number
                            	void LCDBusyWait(void);
                            	void LCDDataLines(unsigned char Data);
                            	void LCDDirOut(void);
                            	void LCDDirIn(void);
                            };
                            فایل C++

                            کد:
                            #include "RoseLCD.h"
                            #include <avr/io.h>
                            #include <util/delay.h>
                            //#include <>
                            const char Flashnum[]="0123456789";
                            
                            
                            //---------------------------------------------------------------------------------------------------
                            void LCD_Rose::LCDSendCommand(unsigned char Command)	//Sends Command to LCD
                            {
                            	//if ((Command==LCD_CLR)||(Command==LCD_HOME))
                            	//_delay_ms(5);
                            	//else _delay_ms(1);
                              _delay_ms(10);
                            	LCDDataLines((Command>>4));
                            	RS_Low();
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_us(20);
                            	LCDDataLines(Command);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            }
                            //------------------------------------------------------------------------------------------------------
                            
                            
                            //----------------------------------------------------------------------------
                            void LCD_Rose::LCDinit(void)//Initializes LCD
                            {
                            	E_Low();
                            	LCDDirIn();
                            	_delay_ms(40);
                            	LCDDirOut();
                            	LCDDataLines(0x30>>4);
                            	LCD_RS_DIR|=(1<<LCD_RS_BIT);
                            	LCD_RW_DIR|=(1<<LCD_RW_BIT);
                            	RS_Low();
                            	RW_Low();
                            	LCD_E_DIR|=(1<<LCD_E_BIT);
                            	_delay_us(20);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_ms(20);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_us(100);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_us(100);
                            	LCDDataLines(0x20>>4);
                            	_delay_us(20);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_us(100);
                            	LCDSendCommand(0x28);
                            	LCDSendCommand(0x08);
                            	LCDSendCommand(0x01);
                            	LCDSendCommand(0x06);
                            	LCDSendCommand(0x0C);
                            }
                            //---------------------------------------------------------------------------------------------------
                            //
                            
                            //
                            //------------------------------------------------------------------------------------------------------
                            void LCD_Rose::LCDsendChar(char Data)		//Sends Char to LCD
                            {
                            	_delay_us(100);
                            	LCDDataLines(Data>>4);
                            	RS_High();
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            	_delay_us(20);
                            	LCDDataLines(Data);
                            	E_High();
                            	_delay_us(20);
                            	E_Low();
                            }
                            //---------------------------------------------------------------------------------------------------------
                            //
                            //----------------------------------------------------------------------------------------------------------
                            
                            
                            
                            
                            void LCD_Rose::LCDstring(char* data)	//Outputs string to LCD
                            {
                            	unsigned char i=0;
                            	while(data[i])
                            	{
                            		LCDsendChar(data[i]);
                            		i++;
                            	}
                            }
                            //---------------------------------------------------------------------------------------------------------
                            //
                            //---------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDGotoXY(unsigned char x, unsigned char y)	//Cursor to X Y position
                            {
                            	unsigned char DDRAMAddr;
                            
                            		if(y==0) DDRAMAddr = LCD_LINE0_DDRAMADDR+x;
                            		else if(y==1) DDRAMAddr = LCD_LINE1_DDRAMADDR+x; 
                            
                            	LCDSendCommand( 1 << 0x07 | DDRAMAddr);  //1<< 
                            	
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            
                            void LCD_Rose::LCDstring_Flash(const char* data)	//Outputs string to LCD of Flash
                            {
                            	unsigned char i=0;
                            	while(data[i])
                            	{
                            		LCDsendChar(data[i]);
                            		i++;
                            	}
                            }
                            //-----------------------------------------------------------------------------------------------------------
                            //
                            //-----------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDshiftLeft(unsigned char n)	//Scrol n of characters Right
                            {
                            	for (unsigned char i=0;i<n;i++)
                            	{
                            		LCDSendCommand(0x1E);
                            	}
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDshiftRight(unsigned char n)	//Scrol n of characters Left
                            {
                            	for (unsigned char i=0;i<n;i++)
                            	{
                            		LCDSendCommand(0x18);
                            	}
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDcursorOn(void) //displays LCD cursor
                            {
                            	LCDSendCommand(0x0E);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDcursorOnBlink(void)	//displays LCD blinking cursor
                            {
                            	LCDSendCommand(0x0F);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDcursorOFF(void)	//turns OFF cursor
                            {
                            	LCDSendCommand(0x0C);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDblank(void)		//blanks LCD
                            {
                            	LCDSendCommand(0x08);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDvisible(void)		//Shows LCD
                            {
                            	LCDSendCommand(0x0C);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDcursorLeft(unsigned char n)	//Moves cursor by n poisitions left
                            {
                            	for (unsigned char i=0;i<n;i++)
                            	LCDSendCommand(0x10);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDcursorRight(unsigned char n)	//Moves cursor by n poisitions left
                            {
                            	for (unsigned char i=0;i<n;i++)
                            	LCDSendCommand(0x14);
                            }
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            
                            void LCD_Rose::LCDclr(void)			//Clears LCD
                            {
                            	LCDSendCommand(0x01);
                            }
                            
                            
                            //--------------------------------------------------------------------------------------------------------
                            //
                            //--------------------------------------------------------------------------------------------------------
                            void LCD_Rose::LCDnum(unsigned long int num)
                            {
                            	volatile unsigned char Digit[7];
                            	volatile unsigned char i;
                            	for (i=0;i<8;i++)
                            	{
                            		Digit[i]=num%10;
                            		num/=10;
                            		if(num==0)
                            		break;
                            	}
                            	do
                            	{
                            		LCDsendChar(Flashnum[Digit[i]]);
                            		i--;
                            	}while(i<255);
                            }
                            
                            
                            void LCD_Rose::LCDBusyWait(void)
                            {
                            	RS_Low();
                            	LCDDirIn();
                            	RW_High();
                            	E_High();
                            	_delay_us(1);
                            	while(LCD_D7_IN&(1<<LCD_D7_BIT))
                            	{
                            		E_Low();
                            		_delay_us(1);
                            		E_High();
                            		_delay_us(1);
                            		E_Low();
                            		_delay_us(1);
                            		E_High();
                            		_delay_us(1);
                            	}
                            	E_Low();
                            	LCDDirOut();
                            }
                            
                            void LCD_Rose::LCDDataLines(unsigned char Data)
                            {
                            	unsigned char temp;
                            	temp=(Data&0x01);
                            	LCD_D4_DATA=((LCD_D4_DATA&~(1<<LCD_D4_BIT))|(temp<<LCD_D4_BIT));
                            	temp=((Data&0x02)>>1);
                            	LCD_D5_DATA=((LCD_D5_DATA&~(1<<LCD_D5_BIT))|(temp<<LCD_D5_BIT));
                            	temp=((Data&0x04)>>2);
                            	LCD_D6_DATA=((LCD_D6_DATA&~(1<<LCD_D6_BIT))|(temp<<LCD_D6_BIT));
                            	temp=((Data&0x08)>>3);
                            	LCD_D7_DATA=((LCD_D7_DATA&~(1<<LCD_D7_BIT))|(temp<<LCD_D7_BIT));
                            }
                            
                            void LCD_Rose::LCDDirOut(void)
                            {
                            	LCD_D4_DIR|=(1<<LCD_D4_BIT);
                            	LCD_D5_DIR|=(1<<LCD_D5_BIT);
                            	LCD_D6_DIR|=(1<<LCD_D6_BIT);
                            	LCD_D7_DIR|=(1<<LCD_D7_BIT);
                            }
                            
                            void LCD_Rose::LCDDirIn(void)
                            {
                            	LCD_D4_DIR&=~(1<<LCD_D4_BIT);
                            	LCD_D5_DIR&=~(1<<LCD_D5_BIT);
                            	LCD_D6_DIR&=~(1<<LCD_D6_BIT);
                            	LCD_D7_DIR&=~(1<<LCD_D7_BIT);
                            }
                            قبل از Main
                            includ نمودن فایل هدر و تعریف یک Object از نام کلاس LCD که در فایل هدر تعریف شده است مثل :
                            کد:
                            
                            LCD_Rose LCD;


                            استفاده در Main

                            کد:
                            int main(void)
                             {
                            	 system_clocks_init();
                            	 LCD.LCDinit();
                            	 
                            	 
                            	 
                            	   LCD.LCDclr();
                            	 	 LCD.LCDGotoXY(1,0);
                            	 	 LCD.LCDstring("Test");
                            		 	 fcpu_delay_ms(1000);
                            			  
                            	 
                            	 
                            	 while(1)
                            	 {
                            		 	   LCD.LCDclr();
                            		 	   LCD.LCDGotoXY(0,0);
                            		 	   LCD.LCDnum(VC);
                            				 
                            		 
                            		 VC++;
                            	 }
                             }
                            فقط توجه شود که در این هدر حالت ساپورت چند LCD حذف شده و برای LCD 2*16 تنظیم شده است . :mrgreen:
                            سلام من هم با کد اصلی مشکل داشتم و جواب نداد ولی از کد شما که استفاده کردم مشکلم رفع شد فقط الان مشکلی که دارم اینه که شما این برنامه را برای سرعت 2 مگاهرتز نوشتی ولی من وقتی سرعتم را روی 32 مگ میزارم برنامه دیگه کار نمیکنه.
                            کسی پیشنهادی نداره برای حل این مشکل ؟

                            در واقع بعد از اضافه کردن اینتابع به برنامه مشکل ایجاد میشه
                            [pre]
                            کد:
                            void Config32MHzClock()
                            {
                            	CCP = CCP_IOREG_gc; //Security Signature to modify clock
                            	// initialize clock source to be 32MHz internal oscillator (no PLL)
                            	OSC.CTRL = OSC_RC32MEN_bm; // enable internal 32MHz oscillator
                            	while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // wait for oscillator ready
                            	CCP = CCP_IOREG_gc; //Security Signature to modify clock
                            	CLK.CTRL = CLK_SCLKSEL_RC32M_gc; //select sysclock 32MHz osc
                            }
                            [/pre]

                            دیدگاه


                              #15
                              پاسخ : اتصال lcd کاراکتری به Xmega

                              نوشته اصلی توسط nta_xyz
                              سلام من هم با کد اصلی مشکل داشتم و جواب نداد ولی از کد شما که استفاده کردم مشکلم رفع شد فقط الان مشکلی که دارم اینه که شما این برنامه را برای سرعت 2 مگاهرتز نوشتی ولی من وقتی سرعتم را روی 32 مگ میزارم برنامه دیگه کار نمیکنه.
                              کسی پیشنهادی نداره برای حل این مشکل ؟
                              راستش من برخورد نکردم با این مشکل . ولی از اونجایی که سرعت با تابع تاخیر در کد LCD نسبت مستقیم داره فکر کنم بخاطر بهم خوردن زمانهای تاخیر توی کد lcd باشه که این مشکل داره بوجود می یاد . پس شما شاید بتونید از این راه برای حل مشکل استفاده کنید و لطفا نتیجه رو همین جا اعلام کنید .

                              شما باید ابتدا به به فایل C++ استفاده شده برای lcd برید و بر روی تابع delay_us_ کلیک کنید و بعد کلید های ترکیبی ALT+G رو بزنید پرش می کنید به هدر فایل delay.h و بعد در بالای این فایل هدر فرکانس رو در خط زیر تنظیم کنید .

                              یا می تونید از فرم Solution Explorer و از زیر شاخه Dependencies فایل هدر delay.h رو باز کنید .

                              کد:
                              # define F_CPU 32000000UL
                              لطفا حتما خواهشا نتیجه رو اعلام کنید . ممنون
                              - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

                              دیدگاه

                              لطفا صبر کنید...
                              X