سلام دوستان
به نظر ساده می یاد ولی وقتی بخواد اذیت کنه دیگه نمیشه کاریش کرد . راستش خوب اولین بار هست که می خوام 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 نیز در بین راه قرار گرفته که شامل همه پین ها است .
کد هدر
کد C++ هدر :
کد تابع اصلی :
این رو هم اضافه کنم که این هدر رو برای mega 32 استفاده کردم و مشکلی نداشته . :angry:
به نظر ساده می یاد ولی وقتی بخواد اذیت کنه دیگه نمیشه کاریش کرد . راستش خوب اولین بار هست که می خوام 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 };
کد:
#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); } }
دیدگاه