هدف ار این پروژه طراحی یک ساعت آنالوگ است که به صورت گرافیکی بر روی lcd های 64 در 128 خانه ای عقربه های ساعت را به نمایش در آورد.ما سعی کردیم تا این ساعت به بهترین شکل طراحی شود و نکات لازم در حد امکان در این ساعت گنجانده شده است.نکته ی اول استفاده از rtc داخلی میکرو برای عملکرد درست ساعت بوده تا دقت کافی را داشته باشد.دومین نکته طراحی انعطاف پذیر در برنامه نویسی است به نحوی که ساعت را میتوان در طول صفحه حرکت داد و فقط با تغییر دو متغییر که در مرکز قرار گرفتن ساعت را نشان میدهند این حالت قابل تغییر است.نکته ی بعدی استفاده نکردن از عکس در پروژه بوده که حجم برنامه را به شدت کاهش میدهد و علاوه بر این سرعت اجرای برنامه را افزایش میدهد و همچنین قابلین اجرا بر روی هر سخت افزاری را به ما خواهد داد.عدم استفاده از عکس قابلیت بیشتری هم به ما داده که نکته ی اساسی در این پروژه است که به توضیح آن خواهم پرداخت.
شمارش ثانیه شمار در هر ثاینه:
این قابلیت کار اصلی برنامه ی نوشته شده بر اساس زاویه است که حرکت ثانیه شمار به مقدار 360 درجه همراه با 60 تیک ثاینه خواهد بود که این حالت بر اساس فرمولهای مربوط به دایره و sin وcos حاصل شده:
که بر اساس روابط مثلثاتی:
که بر اساس همین دو رابطه میتوان مقدار X و Y که محل قرار گرفتن ثانیه شمار است را تشخیص داد.مقدار شعاع که همان R است برای ثانیه شمار از مقدار عقربه ی دقیقه و ساعت بزرگتر در نظر خواهیم گرفت. در این رابطه تنها چیزی که نامعلوم است مقدار cosθ است که زاویه ی قرار گرفتن عقربه خواهد بود.همانطور که میدانیم ثانیه شمار باید در هر دور یعنی در هر 360 درجه به تعداد 60 بار تیک بزند یعنی 360 درجه به 60 قسمت تقسیم گردد یعنی هر ثانیه معادل با 6 درجه خواهد بود.برای دقیقه نیز به همین شکل خواهد بود ولی برای ساعت به دلیل این که ساعت به 12 قسمت تقسیم میشود این مقدار 30 خواهد بود:
zaveh_s=second*6
zaveh_m=minute*6
zaveh_h=hour*30
LCD گرافیکی مدل KS0108
این LCD در سایزهای مختلف در بازار موجود است که در اینجا از مدل 64 در 128 استفاده شده است و ساختار پایه های آن به شکل زیر است:
در واقع پایه ها در این LCD به شکل زیر باید بسته شوند و هر پایه بر اساس جدول زیر عمل خواهد کرد:
توضیح توابع کتابخانه GLCD
در اینجا از کتابخانه ی GLCD.h برای راه اندازی LCD استفاده کردیم که قابلیتهای زیادی از قبیل فارسی نویسی و پذیرش فونتهای مختلف را دارد.در ابتدای این کتابخانه باید پایه های LCD گرافیکی را بر اساس شکاتیک پروژه بدهیم به کتابخانه بدهیم به شکل زیر:
#define DATAPORT PORTA
#define DATADDR DDRA
#define DATAPIN PINA
//#define CONTROLPORT PORTB
#define CS1 PORTB.4
#define CS2 PORTB.3
#define RS PORTB.2
#define RW PORTB.0
#define EN PORTB.1
تمام توابع مورد استفاده در کتابخانه GLCD.h
GLCD توابعکتاب خانه | توضیحات | پارامتر ها |
glcd_on() | GLCD روشن کردن | ندارد |
glcd_off() | GLCD خاموش کردن | ندارد |
set_start_line(unsigned char line) | Changes the top line on the display | line: line number to be set at the top (Range: 0 ⇒۶۳) |
goto_col(unsigned int x) | رفتن به ستون ایکس | x : شماره ستون مورد نظر شمامحدوده ایکس : از ۰ تا ۱۲۷ |
goto_row(unsigned int y) | رفتن به سطر وای | y : شماره سطر مورد نظر شما محدوده وای : از ۰ تا ۷ |
goto_xy(unsigned int x, unsigned ,int y) | رفتن به سطر و ستون مورد نظر | x : شماره ستون y : شماره سطر |
glcd_write(unsigned char b) |
Writes 1 byte data at the current location |
b: 1 – byte data to be written at the current location |
glcd_clrln(unsigned char ln) | پاک کردن سطر دلخواه | ln : شماره سطر مورد نظر بازه : ۰ تا ۷ |
glcd_clear() | پاک کردن کل صفحه نمایش | ندارد |
glcd_read(unsigned char column) | Reads the byte at the current position | column: Current column number |
point_at( unsigned int x, unsigned int y, byte color) | اضافه کردن نقطه در مختصات دلخواه شما | x : شماره ستون y : شماره سطرcolor : ۰⇒نقطه سفید باشد ۱⇒نقطه سیاه باید |
h_line( unsigned int x,unsigned int y, byte l,byte s,byte c) | رسم یه خطافقی | x : مختصات ایکس شروع خط y : مختصاتوای شروع خطl : اندازه خط ماs : فاصله بین نقاط خطمون ۰⇒نقاط پیوسته باشن ۱⇒نقاط از هم فاصله داشته باشن یا گسسته باشن اعداد از یک بیشتر⇒ هر چی عدد بزرگ تر بشه فاصله بین نقاط هم افزایش پیدا میکنه c : ۰⇒نقاط روشن یا سفید ۱⇒نقاط تاریک یا همون سیاه |
v_line( unsigned int x,unsigned int y, signed int l,byte s,byte c) | رسم یه خط عمودی | x : مختصات ایکس شروع خط y : مختصاتوای شروع خطl : اندازه خط ماs : فاصله بین نقاط خطمون ۰⇒نقاط پیوسته باشن ۱⇒نقاط از هم فاصله داشته باشن یا گسسته باشن اعداد از یک بیشتر⇒ هر چی عدد بزرگ تر بشه فاصله بین نقاط هم افزایش پیدا میکنه c : ۰⇒نقاط روشن یا سفید ۱⇒نقاط تاریک یا همون سیاه |
line(unsigned int x1,unsigned int y1, unsigned int x2,unsigned int y2, byte s,byte c) | رسم یه خط با زاویه دلخواه | x1: مختصات ایکس اول خط y1: مختصات وای اول خط x2: مختصات ایکس آخر خط y2: مختصاط وای آخر خطs: فاصله بین نقاط خطمون ۰⇒نقاط پیوسته باشن ۱⇒نقاط از هم فاصله داشته باشن یا گسسته باشن اعداد از یک بیشتر⇒ هر چی عدد بزرگ تر بشه فاصله بین نقاط هم افزایش پیدا میکنهc: ۰⇒نقاط روشن یا سفید ۱⇒نقاط تاریک یا همون سیاه |
rectangle( unsigned int x1,unsigned int y1, unsigned int x2,unsigned int y2, byte s,byte c) | رسم یه ۴ ظلعی حالا میتونه مربع باشه -مستطیل باشه ویا … |
x1: The x of the upper left point y1: The y of the upper left pointx2: The x of the lower right pointy2: The y of the lower right points: The space between each line points: ۰⇒ solid line ۱⇒ dotted line >1 ⇒ dashed linec: 0 ⇒ Light spots ۱⇒ Dark spots |
cuboid( unsigned int x11,unsigned int y11, unsigned int x12,unsigned int y12, unsigned int x21,unsigned int y21, unsigned int x22,unsigned int y22, byte s,byte c) | Draws a cuboid by defining two surfaces | x11: The x of the upper left point of the first surface y11: The y of the upper left point of the first surfacex12: The x of the lower right point of the first surfacey12: The y of the lower right point of the first surface |
X21: The x of the upper left point of the second surface Y21: The y of the upper left point of the second surfacex22: The x of the lower right point of the second surfacey22: The y of the lower right point of the second surface | ||
s: The space between each line points: ۰⇒ solid line ۱⇒ dotted line >1 ⇒ dashed linec: 0 ⇒ Light spots ۱⇒ Dark spots | ||
h_parallelogram( unsigned int x1,unsigned int y1, unsigned int x2,unsigned int y2, byte l,byte s,byte c) | Draws a parallelogram its upper and lower sides are horizontal | x1: The x of the upper left point y1: The y of the upper left pointx2: The x of the lower right pointy2: The y of the lower right pointl: The length of the horizontal side (upper or lower)s: The space between each line points: ۰⇒solid line ۱⇒dotted line >1 ⇒ dashed linec: 0 ⇒Light spots ۱⇒Dark spots |
v_parallelogram( unsigned int x1,unsigned int y1, unsigned int x2,unsigned int y2, byte l,byte s,byte c) | Draws a parallelogram its right and left sides are vertical | x1: The x of the upper left point y1: The y of the upper left pointx2: The x of the lower right pointy2: The y of the lower right pointl: The length of the vertical side (right or left)s: The space between each line points: ۰⇒solid line ۱⇒dotted line >1 ⇒dashed linec: 0 ⇒Light spots ۱⇒ Dark spots |
h_parallelepiped( unsigned int x11,unsigned int y11, unsigned int x12,unsigned int y12, byte l1, unsigned int x21,unsigned int y21, unsigned int x22,unsigned int y22, byte l2, byte s,byte c) |
Draws a parallelepiped its bases are two horizontal parallelograms (Seeh_parallelogram) |
x11: The x of the upper left point of the first surface y11: The y of the upper left point of the first surfacex12: The x of the lower right point of the first surfacey12: The y of the lower right point of the first surface |
X21: The x of the upper left point of the second surface Y21: The y of the upper left point of the second surfacex22: The x of the lower right point of the second surfacey22: The y of the lower right point of the second surface | ||
s: The space between each line points: ۰⇒ solid line ۱⇒ dotted line >1 ⇒ dashed linec: 0 ⇒ Light spots ۱⇒ Dark spotsl1: The length of the horizontal side of the first surfacel2: The length of the horizontal side of the second surface | ||
v_parallelepiped( unsigned int x11,unsigned int y11, unsigned int x12,unsigned int y12, byte l1, unsigned int x21,unsigned int y21, unsigned int x22,unsigned int y22, byte l2, byte s,byte c) |
Draws a parallelepiped its bases are two vertical parallelograms (Seev_parallelogram) |
x11: The x of the upper left point of the first surface y11: The y of the upper left point of the first surfacex12: The x of the lower right point of the first surfacey12: The y of the lower right point of the first surface |
X21: The x of the upper left point of the second surface Y21: The y of the upper left point of the second surfacex22: The x of the lower right point of the second surfacey22: The y of the lower right point of the second surface | ||
s: The space between each line points: ۰⇒ solid line ۱⇒dotted line >1 ⇒ dashed linec: 0 ⇒ Light spots ۱⇒ Dark spotsl1: The length of the vertical side of the first surfacel2: The length of the vertical side of the second surface | ||
circle( unsigned int x0,unsigned int y0, unsigned int r,byte s,byte c) | رسم یه دایره | x0 : مختصات ایکس مرکز دایره y0 : مختصات وای مرکز دایره r : اندازه شعاع دایرهs : فاصله بین نقطه های خط ۰⇒نقاط متصل به هم ۱⇒نقاط با فاصله کنار همc : ۰⇒ Light spots ۱⇒Dark spots |
glcd_putchar(byte c,int x,int y,byte l, byte sz) | نوشتن یه کاراکتر دلخواه در مختصات دلخواه | c :کاراکتر شما x : ستون نوشتن کاراکتر y : سطر نوشتن کاراکترl : زبان کاراکتر ۰⇒ English ۱⇒ Arabicsz : انداره متن-از ۱ تا ۷ |
glcd_puts( byte *c,int x,int y,unsigned char l, byte sz,signed char space) | نوشتن یه رشته که در حافظه flash .ذخیره شده است |
c : نام رشته ایجاد شده توسط شما x :شماره ستونی که نوشتن از آنجاشروع خواهد شد y : شماره سطری که نوشتن از آنجا شروع خواهد شدl : زبان نوشته شما ۰⇒English ۱⇒ Arabicsz : انداره متن-از ۱ تا ۷space: English: فاصله بین حروف Arabic and Farsi:فاصله بین کلمات |
bmp_disp(flash byte *bmp, unsigned int x1,unsigned int y1, unsigned int x2,unsigned int y2) | نمایش یه تصویر bmp که در حافظه .ذخیره شده است flash |
bmp: نام آرایه x1: مختصات ایکس نقطه سمت چپ بالای تصویر y1: مختصات وای نقطه سمت چپ بالای تصویر x2: مختصات ایکس نقطه سمت راست پایین تصویر y2: مختصات وای نقطه سمت راست پایین تصویر |
استفاده از RTC تایمر کانتر شماره ی دوم
نکته ای که در پروژه ساعت ساخته شده را متمایز می کند، دقت بالا و سادگی ساخت برنامه است. در تنظیمات codwizard باید به چند نکته توجه داشت تا بتوان بدون دردسر 1Hz دقیق را تولید کرد. پس از آنکه در تایمر 2 منبع کلاک را پایه TOSC1 قرار دادیم فرکانس ها به صورت تقسیمی از کلاک ورودی نمایش داده می شوند. برای ساخت 1Hz علاوه بر اینکه کریستال 32.768kHz را به پایه های TOSC1 و TOSC2 وصل می کنیم، باید تقسیم کلاک را PCK2/128 انتخاب کنیم. دلیل اینکه این تقسیم فرکانس را انتخاب می کنیم به شرح زیر است: اگر فرکانس کریستال را بر 128 تقسیم کنیم عدد بدست آمده برابر است با 256 یعنی هر شمارش تایمر 2 برابر است با 1/256 پس اگر تایمر 2 که 8 بیتی است، از صفر تا ماکزیمم (یعنی 256 تا) بشمارد، هر سرریز تایمر 1 ثانیه می شود و ما می توانیم برنامه ساعت و تقویم را در وقفه سرریز تایمر 2 بنویسیم. با استفاده از چند کلید می توان این ساعت را براحتی قابل تنظیم کرد. که در اینجا برای سادگی برنامه از سه کلیت SETT و بالا و پایین استفاده کرده ایم.
عدم استفاده از عکس در پروژه
شاید راحترین راه برای نمایش یک تصویر پس زمینه برای پروژه هایی مانند ساعت که نیاز به یک پس زمینه ی ثابت دارند استفاده از یک عکس بیت مپ باشد ولی ما سعی کردیم این کا را با استفاده از توابع شکل بدهیم و این کار باعث افزایش سرعت اجرا و انعطاف پذیری بیشتر و کم حجم شدن برنامه شده است.
فایلهای موجود در پروژه:
- فایل ورد توضیحات خط به خط برنامه و..
- فایل پروتیوس برنامه در دو ورژن که ورژن 0 کاملتر است
- فایل تست برای تست راه اندازی اولیه که با بسکام نوشته شده است و در صورتی که lcd جواب نداد میتوانید برای تست از این فایل هم استفاده کنید.
- فایل پروژه ی با بسکام و پروتیوس در دو دانلود متفاوت قابل دانلود میباشد.
حداقل اشتراک | محتویات | زمان ایجاد | حجم فایل | تعداد دانلودها |
یک ماهه (VIP) | پروتیوس و کدویژن | پنج شنبه, 06 خرداد 1395 22:23 | 8.48 MB | 7 |
تنها کاربران عضو یا دارای مجوز میتوانند دانلود نمایند |
حداقل اشتراک | محتویات | زمان ایجاد | حجم فایل | تعداد دانلودها |
یک ماهه (VIP) | پروتیوس و بسکام | پنج شنبه, 06 خرداد 1395 22:29 | 130.26 KB | 10 |
تنها کاربران عضو یا دارای مجوز میتوانند دانلود نمایند |