خوب اینم الوعده وفا
در اولین قدم باید کتابخانه ی lpc17xx_gpio.h رو به برنامه اضافه کنید.
#include “lpc17xx_gpio.h”
همون طوری که میدونید در میکرو های lpc میشه با پورتها به صورت 32 بیتی //16 بیتی//8بیتی کار کرد
کار کردن با پورتها به صورت 32 بیتی:
حالا میتونید از توابع زیر توی برنامه استفاده کنید و حالش رو ببرید.
1-توسط این دستورات پایه های یک پورت به صورت ورودی یا خزوجی پیکر بندی میگردند.
GPIO_SetDir( شماره پورت, پایه های مورد نظر , 0 یا 1)
FIO_SetDir( شماره پورت, پایه های مورد نظر , 0 یا 1)
شماره پورت : پورتی که میخواییم اون رو ورودی یا خروجی کنیم.(از 0 تا 4)
پایه های مورد نظر :عددی بین 0X00000000 تا 0XFFFFFFFF که به پینهای پورت اشاره دارد.
برای ورودی کردن از عدد 0 و برای خروجی از عدد 1 استفاده میکنیم.
مثال:
GPIO_SetDir(0,0X00000005,1);
در این حالت پینهای 0 و 2 از پورت 0 به عنوان خروجی پیکربندی شده اند.
2- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده اند یک میگردند.
GPIO_SetValue( شماره پورت , پایه های مورد نظر )
FIO_SetValue( شماره پورت , پایه های مورد نظر )
3- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده اند صفر میگردند.
GPIO_ClearValue( شماره پورت , پایه های مورد نظر )
FIO_ClearValue( شماره پورت , پایه های مورد نظر )
یه توضیح کوچیک اینکه دستورات صفر و یک کننده ی پایه ها رو پینهایی که به صورت ورودی پیکربندی شدن یا اینکه
اصلا پیکربندی نشدن هیچ تاثیری ندارن.
- توسط این دستورات عدد روی پایه های یک پورت رو بخونین.
Value= GPIO_ReadValue( شماره پورت , پایه های مورد نظر )
Value=FIO_ReadValue( شماره پورت , پایه های مورد نظر )
راستی این رو هم بگم که value یه متغیر 32 بیتیه
5-توسط این دستورات میتونید یه دسته از پینهای یه پورت رو از دسترس خارج کنین.
GPIO_SetMask( شماره پورت, پایه های مورد نظر , 0 یا 1)
FIO_SetMask( شماره پورت, پایه های مورد نظر , 0 یا 1)
در صورت قرار دادن عدد 1 عمل mask انجام و پینها غیر فعال میگردند واگر 0 بگذاریم دوباره به حالت عادی باز گشته و امکان نوشتن و خواندن از انها فراهم میگردد.
کار کردن با پورتها به صورت 16 بیتی:
1-توسط این دستورات پایه های یک پورت به صورت ورودی یا خزوجی پیکر بندی میگردند.
FIO_HalfWordSetDir( شماره پورت, بیت بالا یا پایین16 , پایه های مورد نظر , 0 یا 1)
شماره پورت : پورتی که میخواییم اون رو ورودی یا خروجی کنیم.(از 0 تا 4)
برای 16 بیت پایین رتبه عدد 0 و16 بیت بالا رتبه عدد 1 میگذاریم
پایه های مورد نظر :عددی بین 0X0000 تا 0XFFFF که به پینهای پورت اشاره دارد.
برای ورودی کردن از عدد 0 و برای خروجی از عدد 1 استفاده میکنیم.
مثال:
FIO_HalfWordSetDir(0,0,0X0005,1);
در این حالت پینهای 0 و 2 از پورت 0 به عنوان خروجی پیکربندی شده اند.
2- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده اند یک میگردند.
FIO_HalfWordSetDir( شماره پورت, بیت بالا یا پایین16 , پایه های مورد نظر )
- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده صفر میگردند.
FIO_HalfWordClearDir( شماره پورت, بیت بالا یا پایین16 , پایه های مورد نظر )
- توسط این دستورات عدد روی پایه های یک پورت رو بخونین.
Value=FIO_HalfWordReadValue( شماره پورت , بیت بالا یا پایین16)
راستی این رو هم بگم که value یه متغیر 16 بیتیه
توسط دستور زیر عمل mask انجام یا غیر فعال میگردد
FIO_HalfWordSetMAsk( شماره پورت, بیت بالا یا پایین16 , پایه های مورد نظر , 0 یا 1)
کار کردن با پورتها به صورت 8 بیتی:
1-توسط این دستورات پایه های یک پورت به صورت ورودی یا خزوجی پیکر بندی میگردند.
FIO_ByteSetDir( شماره پورت,8بیت صفرم/اول/دوم/سوم , پایه های مورد نظر , 0 یا 1)
شماره پورت : پورتی که میخواییم اون رو ورودی یا خروجی کنیم.(از 0 تا 4)
پایه های مورد نظر :عددی بین 0X00 تا 0XFF که به پینهای پورت اشاره دارد.
برای ورودی کردن از عدد 0 و برای خروجی از عدد 1 استفاده میکنیم.
مثال:
FIO_ByteSetDir(0,0,0X05,1);
در این حالت پینهای 0 و 2 از پورت 0 به عنوان خروجی پیکربندی شده اند.
2- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده اند یک میگردند.
FIO_ByteSetDir( شماره پورت, 8بیت صفرم/اول/دوم/سوم , پایه های مورد نظر )
- توسط این دستورات پایه های یک پورت که به صورت خزوجی پیکر بندی شده صفر میگردند.
FIO_ByteClearDir( شماره پورت, 8بیت صفرم/اول/دوم/سوم , پایه های مورد نظر )
- توسط این دستورات عدد روی پایه های یک پورت رو بخونین.
Value=FIO_ByteReadValue( شماره پورت , 8بیت صفرم/اول/دوم/سوم)
راستی این رو هم بگم که value یه متغیر 8 بیتیه
توسط دستور زیر عمل mask انجام یا غیر فعال میگردد
FIO_ByteSetMAsk( شماره پورت, 8بیت صفرم/اول/دوم/سوم, پایه های مورد نظر , 0 یا 1)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////خوب حالا میریم سراغ دستوراتی که با وقفه پورتا کار میکنن.
دوستان میدونن که میشه در این خانواده از میکروها از تمامی پینهای پورت 0 وپینهای 0 تا 13 پورت 2 به عنوان ورودی وقفه استفاده کرد.
همچنین میشه تایین کرد که وقفه روی لبه ی بالارونده یا پایین رونده اتفاق بیفته.
1-توسط این دستور میشه پورت 0 یا 2 رو به عنوان ورودی وقفه پیکربندی کرد.
GPIO_IntCmd(شماره پورت ,پینهای مورد نظر , لبه بالا رونده یا پایین رونده)
FIO_IntCmd(شماره پورت ,پینهای مورد نظر , لبه بالا رونده یا پایین رونده)
شماره پورت : میتونه 0 یا 2 باشه(چون وقفه فقط روی این پورتا تعریف شده.
پینهای مورد نظر:پینهایی از پورت که ورودی وقفه هستند.
برای لبه بالا رونده عدد 0 ولبه پایین رونده عدد 1 بزارید.
2-توسط این دستور میتونید بفهمید وقفه روی کدوم پایه از پورت اتفاق افتاده-
GPIO_GetIntStatus(شماره پورت ,شماره پین مورد نظر , لبه بالا رونده یا پایین رونده)
FIO_GetIntStatus(شماره پورت ,شماره پین مورد نظر, لبه بالا رونده یا پایین رونده)
حتما حواستون باشه که توی این قسمت باید شماره پین مورد نظرتون رو بنویسید که اعداد 0 تا 31 برای پورت 0 و اعداد 0 تا 13 برای پورت 2 هستش.
3-توسط این دستور میتونید پرچم وقفه اتفاق افتاده رو پاک کنین.
GPIO_ClearInt(شماره پورت ,شماره پینهای مورد نظر ه)
FIO_ClearInt(شماره پورت ,شماره پینهای مورد نظر,)
لازم اینم بگم که وقفه پورت میکرو روی وقفه خارجی 3 تنظیم شده.پس بایستی حتما اینم بنویسید که
NVIC_EnableIRQ(EINT3_IRQn);
اینم یه نمونه برنامه کامل واسه تست مطالب بالا.
#include <lpc17xx_gpio.h>
//----------------------------------------------
void delay(void);
void EINT3_IRQHandler(void);
//----------------------------------------------
int main(void)
{
GPIO_SetDir(1,0Xffffffff,1);
GPIO_ClearValue(1,0Xffffffff);
GPIO_IntCmd(0,0xffffffff,1);
NVIC_EnableIRQ(EINT3_IRQn);
while(1);
return 0;
}
//---------------------------------------------
void delay(void)
{
long int i;
for(i=0;i<400000;i++);
}
//---------------------------------------------
void EINT3_IRQHandler(void)
{
char esi;
for(esi=0;esi<32;esi++)
{
if(GPIO_GetIntStatus(0,esi,1))
{
GPIO_ClearInt(0,1<<esi);
GPIO_SetValue(1,1<<esi);
delay();
GPIO_ClearValue(1,1<<esi);
delay();
}
}
}