اطلاعیه

Collapse
No announcement yet.

سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

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

    سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

    سلام و خسته نباشید
    من تازه دارم از کد ویژن کوچ می کنم به Atmel Studio .
    در کل باید بگم ازش خیلی خوشم اومده .
    ولی الان برای LCD کاراکتری یه مشکل دارم و نتونستم راهش بندازم
    نمیدونم مشکل چی هست . توضیح میدم .
    من فایل lcd.h رو در برنامه در قسمت lib اضافه کردم و دستورات اینکلود و غیره همگی بنظر ok می یاد چون برنامه از اونا ایراد نمی گیره !
    (قبلا ایراد میگرفت تا اینکه پدرم در اومد تا درست شد ) :mrgreen:
    الان تنظیم پورت برای lcd رو که در هدر فایل lcd.h انجام میشه رو این طوری گذاشتم

    #define LCD_DATA D

    #define LCD_E B
    #define LCD_E_POS PB2

    #define LCD_RS B
    #define LCD_RS_POS PB0

    #define LCD_RW B
    #define LCD_RW_POS PB1

    در مورد rs , rw , e فکر کنم دررست باشه ولی در مورد پورت D که بعنوان دیتا تعریف شده از لحاظ سخت افزاری من پین های 4 تا 7 رو به پین های 11 تا 14 lcd وصل کردم .
    نمی دونم الان چطوری اینو بهش بفهمونم ؟ :angry:
    - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

    #2
    پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

    سلام.
    اگه اون فایل هدر تو بذاری شاید بتونم کمکت کنم.
    چون هدرفایل های زیادی برای این نوع ال سی دی هست.
    تو اون فایلی که من برای این ال سی دی دارم به عنوان مثال خبری از define LCD_RS_POS نیس.

    دیدگاه


      #3
      پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

      این فایل هدرش با پسوند .h هست
      کد:
      #include <avr/io.h>
      
      #ifndef F_CPU
      	#define F_CPU 8000000UL
      #endif
      
      #include <util/delay.h>
      
      #include "myutils.h"
      
      #ifndef _LCD_H
      #define _LCD_H
      /*_________________________________________________________________________________________*/
      
      /************************************************
      	LCD CONNECTIONS
      *************************************************/
      
      #define LCD_DATA D  //Port PC0-PC3 are connected to D4-D7
      
      #define LCD_E B 		//Enable OR strobe signal
      #define LCD_E_POS	PB2	//Position of enable in above port
      
      #define LCD_RS B	
      #define LCD_RS_POS 	PB0
      
      #define LCD_RW B
      #define LCD_RW_POS 	PB1
      
      
      //************************************************
      
      #define LS_BLINK 0B00000001   
      #define LS_ULINE 0B00000010   
      
      
      
      /***************************************************
      			F U N C T I O N S
      ****************************************************/
      
      
      
      void InitLCD(uint8_t style);
      void LCDWriteString(const char *msg);
      void LCDWriteInt(int val,unsigned int field_length);
      void LCDGotoXY(uint8_t x,uint8_t y);
      
      //Low level
      void LCDByte(uint8_t,uint8_t);
      #define LCDCmd(d) (LCDByte(d,0))
      #define LCDData(b) (LCDByte(b,1))
      
      void LCDBusyLoop();
      
      
      
      
      
      /***************************************************
      			F U N C T I O N S   E N D
      ****************************************************/
      
      
      /***************************************************
      	M A C R O S
      ***************************************************/
      #define LCDClear() LCDCmd(0b00000001)
      #define LCDHome() LCDCmd(0b00000010);
      
      #define LCDWriteStringXY(x,y,msg) {\
       LCDGotoXY(x,y);\
       LCDWriteString(msg);\
      }
      
      #define LCDWriteIntXY(x,y,val,fl) {\
       LCDGotoXY(x,y);\
       LCDWriteInt(val,fl);\
      }
      /***************************************************/
      
      
      
      
      /*_________________________________________________________________________________________*/
      #endif
      و این هم فایل هدر با پسوند .c :


      کد:
      #include <avr/io.h>
      #include <inttypes.h>
      
      #ifndef F_CPU
      	#define F_CPU 8000000UL
      #endif
      
      #include <util/delay.h>
      
      #include "lcd.h"
      
      
      #define LCD_DATA_PORT 	PORT(LCD_DATA)
      #define LCD_E_PORT 		PORT(LCD_E)
      #define LCD_RS_PORT 	PORT(LCD_RS)
      #define LCD_RW_PORT 	PORT(LCD_RW)
      
      #define LCD_DATA_DDR 	DDR(LCD_DATA)
      #define LCD_E_DDR 		DDR(LCD_E)
      #define LCD_RS_DDR 		DDR(LCD_RS)
      #define LCD_RW_DDR 		DDR(LCD_RW)
      
      #define LCD_DATA_PIN	PIN(LCD_DATA)
      
      #define SET_E() (LCD_E_PORT|=(1<<LCD_E_POS))
      #define SET_RS() (LCD_RS_PORT|=(1<<LCD_RS_POS))
      #define SET_RW() (LCD_RW_PORT|=(1<<LCD_RW_POS))
      
      #define CLEAR_E() (LCD_E_PORT&=(~(1<<LCD_E_POS)))
      #define CLEAR_RS() (LCD_RS_PORT&=(~(1<<LCD_RS_POS)))
      #define CLEAR_RW() (LCD_RW_PORT&=(~(1<<LCD_RW_POS)))
      
      
      
      void LCDByte(uint8_t d,uint8_t isdata)
      {
      //Sends a byte to the LCD in 4bit mode
      //cmd=0 for data
      //cmd=1 for command
      
      
      //NOTE: THIS FUNCTION RETURS ONLY WHEN LCD HAS PROCESSED THE COMMAND
      
      uint8_t hn,ln;			//Nibbles
      uint8_t temp;
      
      hn=d>>4;
      ln=(d & 0xF0);
      
      if(isdata==0)
      	CLEAR_RS();
      else
      	SET_RS();
      
      _delay_us(0.500);		//tAS
      
      SET_E();
      
      //Send high nibble
      
      temp=(LCD_DATA_PORT & 0X0F)|(hn);
      LCD_DATA_PORT=temp;
      
      _delay_us(1);			//tEH
      
      //Now data lines are stable pull E low for transmission
      
      CLEAR_E();
      
      _delay_us(1);
      
      //Send the lower nibble
      SET_E();
      
      temp=(LCD_DATA_PORT & 0X0F)|(ln);
      
      LCD_DATA_PORT=temp;
      
      _delay_us(1);			//tEH
      
      //SEND
      
      CLEAR_E();
      
      _delay_us(1);			//tEL
      
      LCDBusyLoop();
      }
      
      void LCDBusyLoop()
      {
      	//This function waits till lcd is BUSY
      
      	uint8_t busy,status=0x00,temp;
      
      	//Change Port to input type because we are reading data
      	LCD_DATA_DDR&=0X0F;
      
      	//change LCD mode
      	SET_RW();		//Read mode
      	CLEAR_RS();		//Read status
      
      	//Let the RW/RS lines stabilize
      
      	_delay_us(0.5);		//tAS
      
      	
      	do
      	{
      
      		SET_E();
      
      		//Wait tDA for data to become available
      		_delay_us(0.5);
      
      		status=LCD_DATA_PIN;
      		status=status<<4;
      
      		_delay_us(0.5);
      
      		//Pull E low
      		CLEAR_E();
      		_delay_us(1);	//tEL
      
      		SET_E();
      		_delay_us(0.5);
      
      		temp=LCD_DATA_PIN;
      		temp&=0X0F;
      
      		status=status|temp;
      
      		busy=status & 0b10000000;
      
      		_delay_us(0.5);
      		CLEAR_E();
      		_delay_us(1);	//tEL
      	}while(busy);
      
      	CLEAR_RW();		//write mode
      	//Change Port to output
      	LCD_DATA_DDR|=0X0F;
      
      }
      
      void InitLCD(uint8_t style)
      {
      	//After power on Wait for LCD to Initialize
      	_delay_ms(30);
      	
      	//Set IO Ports
      	LCD_DATA_DDR|=(0xF0);      // old 0x0F
      	LCD_E_DDR|=(1<<LCD_E_POS);   
      	LCD_RS_DDR|=(1<<LCD_RS_POS);
      	LCD_RW_DDR|=(1<<LCD_RW_POS);
      
      	LCD_DATA_PORT&=0X0F;  // old 0xF0
      	CLEAR_E();
      	CLEAR_RW();
      	CLEAR_RS();
      
      	//Set 4-bit mode
      	_delay_us(0.3);	//tAS
      
      	SET_E();
      	LCD_DATA_PORT|=(0b00100000); //[B] To transfer 0b00100000 i was using LCD_DATA_PORT|=0b00100000         old  0b00000010
      	_delay_us(1);
      	CLEAR_E();
      	_delay_us(1);
      	
      	//Wait for LCD to execute the Functionset Command
      	LCDBusyLoop();                  //[B] Forgot this delay
      
      	//Now the LCD is in 4-bit mode
      
      	LCDCmd(0b00001100|style);	//Display On
      	LCDCmd(0b00101000);			//function set 4-bit,2 line 5x7 dot format
      }
      void LCDWriteString(const char *msg)
      {
      	/*****************************************************************
      	
      	This function Writes a given string to lcd at the current cursor
      	location.
      
      	Arguments:
      	msg: a null terminated string to print
      
      
      	*****************************************************************/
       while(*msg!='\0')
       {
      	LCDData(*msg);
      	msg++;
       }
      }
      
      void LCDWriteInt(int val,unsigned int field_length)
      {
      	/***************************************************************
      	This function writes a integer type value to LCD module
      
      	Arguments:
      	1)int val	: Value to print
      
      	2)unsigned int field_length :total length of field in which the value is printed
      	must be between 1-5 if it is -1 the field length is no of digits in the val
      
      	****************************************************************/
      
      	char str[5]={0,0,0,0,0};
      	int i=4,j=0;
      	while(val)
      	{
      	str[i]=val%10;
      	val=val/10;
      	i--;
      	}
      	if(field_length==-1)
      		while(str[j]==0) j++;
      	else
      		j=5-field_length;
      
      	if(val<0) LCDData('-');
      	for(i=j;i<5;i++)
      	{
      	LCDData(48+str[i]);
      	}
      }
      void LCDGotoXY(uint8_t x,uint8_t y)
      {
       if(x<40)
       {
       if(y) x|=0b01000000;
       x|=0b10000000;
       LCDCmd(x);
       }
      }

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

      دیدگاه


        #4
        پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

        در این قسمت فکر میکنم یه مشکلی هست:
        کد:
        #define LCD_DATA D  //Port PC0-PC3 are connected to D4-D7
        
        #define LCD_E B 		//Enable OR strobe signal
        #define LCD_E_POS	PB2	//Position of enable in above port
        
        #define LCD_RS B	
        #define LCD_RS_POS 	PB0
        
        #define LCD_RW B
        #define LCD_RW_POS 	PB1
        به نظر میاد هر سه رو B تعریف کرده‎اید، و بعد از آن هم من جایی ندیدم که برای همون متغیر B مقداری تخصیص داده شود.
        در ضمن ابتدای همین قسمت فکر میکنم کلمه PORT رو هم فراموش کردین بنویسید.
        چون داخل برنامه من جایی ندیدم که از LCD_DATA استفده کرده باشین.

        دیدگاه


          #5
          پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

          :surprised: من که استفاده کردم ! :mrgreen:
          راستی گفتید که مدل های مختلفی دارند آیا می تونید یه هدر خوب برای lcd کاراکتری در atmel studio بهم معرفی کنید یا بهم بدید . در ضمن من چون تازه وارد م در atmel studio نیاز به خیلی از هدر های دیگه هم دارم
          مثل هدر lcd ، هدر I2C ، و غیره :rolleyes:
          خیلی ممنون از شما و دیگر دوستان
          - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

          دیدگاه


            #6
            پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

            سلام.
            این لینک پایینی فکر میکنم خیلی به دردتون بخوره.
            برا من که خیلی مفید بود.
            http://www.eca.ir/forum2/index.php?topic=81025.0
            و در این لینک هم دوستمون سید یه هدر فایل برای ال سی دی گذاشتن همراه با آموزش نوشتن هدر فایل.
            http://www.eca.ir/forum2/index.php?topic=82130.0
            امیدوارم به دردتون بخورن.

            دیدگاه


              #7
              پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

              :smile:
              خیلی ممنون سر فرصت بررسی میکنم بهتون جواب میدم . مرسی
              - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

              دیدگاه


                #8
                پاسخ : سوال در مورد چگونگی تنظیم پایه های data در lcd کاراکتری در Atmel Studio

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

                دیدگاه

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