به نام خدا : تو این مطلب، از سری مطالب پروژه آرم میخوام به راه اندازی کیپد با میکروکنترلر آرم lpc1768 بپردازم، برا این کار من یه کتابخونه نوشتم برا کیپد و یه کتابخونه هم نوشتم برا کار با GPIO ها، که دسترسی به پایه های میکرو آرم مون رو عین آردوینو ساده کرده تقریبا – من حتی اسم توابعش رو هم مثل آردوینو نوشتم ^_^ در این حد، بحث کیپد هم چیز خاصی نداره، همش دوتا تابع داره ^_^ ( پروژه راه اندازی کیپد با میکروکنترلر lpc1768 )
پروژه راه اندازی کیپد با میکروکنترلر lpc1768
شماتیک پروژه :
به توجه به شکل بالا که ترتیب پایه ها در کیپد فلت رو نشون داده، در زیر شماتیک پروژه رو بر مبنای عکس بالا توضیح میدم :
C به P1.24
B به P1.23
A به P1.22
2 به P1.26
3 به P1.19
توجه 2 : ممکنه بعضی پایه ها برا بحث کیپد مناسب نباشن و مثلا همین پایه P1.18، اگه شماتیک هدربرد ECA رو بببیند، متوجه میشید چرا نمیشه ازش استفاده کرد؛ شماتیک هدر برد LPC1768 شرکت ECA رو از زیر میتونید دانلود کنید :
کد پروژه : میبینید چقدر کم هستش کدش، چون کارم رو تابع تابع کردم، کتابخونه نوشتم، میبینید پروژه چقدر خلوته، پیدا کردن مشکلات هم ساده تره تا تو بعضی پروژه هایی که فیل هم تو اون پروژه گم میشه یهو میبینی 5 هزار خط تو برنامه اصلی هستش O_o البته خودم قبلا از این کارا کردما ^_^ ولی خب گزاشتیم کنار، چون حقیقتا وقتی پروژه رو بروت یکم شلوغ بشه، آدم گیج میشه و عیب یابی هم یکم سخت میشه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <lpc17xx.h> #include "serial.h" #include "gpio.h" #include "keypad.h" char Keypad_Data_Send[4][3] = { { '1', '2', '3' }, { '4', '5', '6' }, { '7', '8', '9' }, { '*', '0', '#' }, }; unsigned char Keypad_Pin_OutPut[4] = { P1_25, P1_24, P1_23, P1_22 }; unsigned char Keypad_Pin_InPut[3] = { P1_21, P1_26, P1_19 }; char key; unsigned long int j; int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); keypad_init( Keypad_Pin_OutPut, Keypad_Pin_InPut, Keypad_Data_Send, YES/*useInternalResistor*/ ); while(1) { do { key = keypad_scan(); } while( key == 0 ); write( key ); write( '\n' ); for(j=0; j<1000000; j++); // Delay !!! }; } |
عکس پروژه : در اول مطلب قرارش دادم ^_^
فیلم پروژه :
آموزش کار با کتابخانه کیپد میکروکنترلر LPC1768
این کتابخونه ای که براتون نوشتم، 2 تا همش تابع داره :
1 2 |
void keypad_init( unsigned char* _PinOutPut, unsigned char* _PinInput, char _KeypadDataSend[4][3], char useInternalResistor ); char keypad_scan( void ) ; |
keypad_init : راه اندازی کیپد، ورودی های زیر رو بهش باید بدیم.
- PinOutPut : یه آرایه ای از نوع unsigned char که نام پایه های خروجی ( 4 تا پایه سمت چپ کیپد فلت ) کیپد که تعیین میکنه این پایه ها به کدوم پایه های میکروکنترلر ما وصل هستش.
- PinInput : مثل مورد بالا هستش فقط برا پایه های ورودی ( سه تا پایه سمت راست ) هستش.
- KeypadDataSend : یه آرایه ای از نام هر دکمه کیپدمون، مثلا فلان دکمه فشرده شد، تابع keypad_scan چه متنی رو به ما بده و ما هم مستقیما اونو نمایش بدیم؟ مثلا دکمه * کلیک شد، به جای این که 1و2و … بده، میاد خود کاراکتر * رو به ما میده و ما هم کارمون خیلی ساده میشه و مسقیم، خروجی این تابع رو میدیم به تابع نمایش اطلاعات در پورت سریال.
- useInternalResistor : تعیین این که میخواین از مقاومت داخلی استفاده کنید یا مقاومت خارجی، اگه میخواین از مقاومت داخلی استفاده کنید باید به جای این مورد YES قرار بدیم و در غیر این صورت باید NO قرار بدیم.
keypad_scan : خب این تابع برا بررسی این هستش که دکمه ای فشرده شده یا نه، اگه دکمه ای فشرده نشده باشه عدد 0 رو برمیگردونه، لذا برا استفاده از این تابع، و تشخسص این که دکمه ای فشرده شده یا نه، بهتره از کدی، شبیه کد زیر استفاده کنیم ( البته میتونیم همین کد زیر رو هم ارتقا بدیم و حرفه ای تر کنیم که فعلا حسش نیست ^_^ ) :
1 2 3 |
do { key = keypad_scan(); } while( key == 0 ); |
آموزش کار با کتابخانه GPIO میکروکنترلر LPC1768
توجه : از این کتابخونه نیاز نیست تو پروژه استفاده کنید، تو کتابخونه کیپد نیاز بود که من کاراش رو کردم و شما نیاز نیست کاری کنید، ولی برا پروژه های دیگتون خواستید میتونید از این کتابخونه استفاده کنید.
این کتابخونه 3 تا تابع داره همش ( دیفاین های مورد نیاز رو هم در زیر قرار میدم چون میخوام توضیحشون بدم ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#define OUTPUT 1 #define INPUT 0 //------------------ // حالات مقاومت داخلی پایه ها #define PullUp 0 #define Repeater 1 #define Neither 2 #define PullDown 3 //------------------ void pinMode( unsigned char pin, char inputResistor, unsigned char status ); #define HIGH 1 #define LOW 0 //------------------ void digitalWrite( unsigned char pin, unsigned char status ); char digitalRead( unsigned char pin ); |
توجه مهم : در توابع زیر نیازه که پایه مدنظرمون رو به تابع بفهمونیم، برا این کار یه سری دیفاین تو کتابخونه گزاشتم، مثلا بخواین از پورت 0 پایه 2 استفاده کنید باید از کد P0_2 استفاده کنید؛ یا از پورت 2 پایه 13 استفاده کنید باید کد P2_13 رو استفاده کنید.
digitalRead : برا خوندن مقدار پایه ای که ورودی هستش، این تابع یه ورودی همش داره و اونم برا تعیین پایه ای هستش که قراره مقدارش رو بخونیم ( مثلا بخوایم مقدار پورت0 پایه 14 رو بخونیم باید دستور P0_14 رو به این تابع بدیم، البته شرط استفاده از این تابع اینه که، پایه فوق ورودی تنظیم شده باشه، که در حالت پیشفرض، تمام پایه های میکروکنترلر، ورودی هستن، مگه این که تغییرشون بدید )
digitalWrite : اگه پایه ای خروجی تنظیم شده باشه، به کمک این تابع میتونیم مقدار پایه رو تعیین کنید که سطح منطقی 0 باشه یا 1 ( یا همون LOW باشه یا HIGH )؛ ورودی های این تابع به صورت زیر هستش :
pin : تعیین پایه ای که میخواین مقدارش رو تغییر بدید ( مثلا برا پایه پورت 3 پین 2 باید کد P3_2 رو به این پارامتر بدید )
status : تعیین سطح منطقی پایه انتخاب شده، 0 یا LOW قرار بدیم مقدار پایه 0ولت میشه و 1 یا HIGH قرار بدیم، مقدار پایه 3.3 ولت میشه.
pinMode : برا تعیین ورودی و یا خروجی بودن پایه ها استفاده میشه؛ پارامترهای این تابع به صورت زیر هستش :
pin : پایه ای که میخوایم ورودی/خروجی بودنش رو تعیین کنید.
inputResistor : تعیین نوع مقاومت ورودی، اگه میخواین پایه رو خروجی تعریف کنید بهتره مقدار Neither قرار بدین و اگه پایه رو میخواین ورودی تعریف کنید، هر کدوم از مقادیر PullUp یا Repeater یا Neither یا PullDown رو میتونید استفاده کنید بسته به نیازتون.
status : تعیین این که پایه ورودی باشه یا خروجی، اگه میخواین ورودی باشه باید مقدار 0 یا INPUT به این پارامتر بدید و اگه میخواین خروجی باشه باید مقدار 1 یا OUTPUT رو به این پارامتر بدید.
خب امیدوارم این مطلب براتون مفید بوده باشه، ما رو از دعاتون بی نصیب نزارید، برا سلامتی رهبر انقلاب امام خامنه ای و مسئولینی که خدمت گزار این ملت هستن، 3 تا صلوات بفرستید.
یه خرید ساده و عادی از نوع آمریکاییش :
فیلم زیر رو هم خواستید ببیند، اون کسایی که هی به ملت ایران توهیج میکنن و شبا خواب USA !!! میبینن، این فیلم رو هم ببینن ظرر نداره : http://www.aparat.com/v/BtjgR
تا مطلب بعد، اگه زنده بودیم، یا علی.
===================================
بروزرسانی در 5 دی 95 : اضافه شدن تابع زیر :
1 |
unsigned int getNumberFromKeypad( unsigned int MaxTime, unsigned char MaxNumber ) |
به کمک این تابع، میتونیم عدد چند رقمی دریافت کنیم، پارامتر های این تابع به صورت زیر هستش :
MaxTime : حداکثر زمانی که بین دریافت دو رقم میتونیم صبر کنیم، یعنی اگه کاربر مثلا عدد 3 رو وارد کرد و بعد 2ثانیه عددی وارد نکرد، این تابع به ما عدد دو رو میده ولی اگه قبل 2 ثانیه عددی وارد کرد، مثلا 5 وارد کرد، تابع به ما عدد 35 رو میده.
MaxNumber : حداکثر تعداد ارقامی که باید دریافت شود، در حداقل تعداد ارقام دریافتی محدودیت نزاشتم ولی در حداکثر تعداد ارقام محدودیت وجود داره، مثلا حداکثر تعداد ارقام رو 6 تا تعیین میکنیم، اگه کاربر با رعایت محدودیت زمانی تعیین شده، 6 تا رقم به کمک کیپد وارد کنه، تابع دیگه بهش اجازه نمیده که عدد جدیدی رو وارد کنه.
توجه : منظور از محدودیت زمانی این نیستش که مثلا هر 6 تا رقم رو در 2ثانیه باید وارد کنه، بلکه این هستش که رقم اول رو که وارد کرد، 2 ثانیه وقت داره رقم دوم رو وارد کنه و بعد که رقم دوم رو وارد کرد، 2 ثانیه وقت داره که رقم سوم رو وارد کنه و…
پروژه این تابع : برا دیدن پروژه این تابع به مطلب زیر میتونید مراجعه کنید ( در ضمن این تابع به کمک واحد جانبی RIT، نوشته شده است ) : آموزش پروژه محور آرم lpc1768 مبحث rit
مهمان
سلام
ته کیپد من (جایی که به بردبورد متصل میشه)مثل کیپد شما نیست یعنی سوکتی برای فرورفتن تو بردبورد نداره
چطور این مشکلو حل کنم؟
نویسنده این مطلب
سلام.عکس بده.یعنی چی که سوکتی نداره.اگه پدهاشو داره که یه پین هدر روش لحیم میکنی.
مهمان
چطور باید عکس بفرستم؟
منظورت از پدهاش چیه؟
خودش یه پین هدر مادگیه.یعنی پین هدر نری روش لحیم کنم؟
نویسنده این مطلب
تو فیلم من از کیپد فلت استفاده کردم.احتمالا از یه هدر نری به نری براش استفاده کردم
مهمان
سلام برادر خسته نباشی
این نرم افزاری که رو لب تاپت داری و به جای ال سی دی کاراکتری ازش استفاده میکنی اسمش چیه ؟؟
نویسنده این مطلب
سلام-متوجه نشدم.
مهمان
سلام عزیز خسته نباشی
این پروژه رو اجرا کردم ولی وقتی دکمه های کی پد رو میزنم بجای ارسال اعداد علامت های گنگ و بی معنی مثه ؟؟ یا ! رو میفرسته مشکل از کجاست؟؟؟
مهمان
باد ریت نرم افزار و با بادریت برنامه یکی کن درست میشه
مهمان
واحد زمان تو کتابخونه آپدیت شده کی پد چیه داداشم،میکرو ثانیست؟
نویسنده این مطلب
تو تابع getNumberFromKeypad واحد زمان میکرو ثانیه هستش.
مهمان
داداش اینو برا کی پد ۴*۴ و بیشتر هم میشه استفاده کرد دیگه ،درسته؟
نویسنده این مطلب
بله میشه فقط باید تغییراتی اعمال کنی.
مهمان
سلام می خواستم بدونم چجوری باید فایل کتابخونه رو درست کرد
نویسنده این مطلب
سلام
کتابخونه هایی که نوشتم و تو مطالب گزاشتم رو بررسی کن