Visits: 2300
به نام خدا
در این قسمت ما می خواهیم اتصال صفحه کلید به میکرو کنترلرهای AVR را آموزش دهیم.
همان گونه که می دانیم یک پورت میکرو 8 پین دارد و ما اگر بخواهیم به پایه ها کلید وصل کنیم قاعدتا 8 تا کلید می توانیم به آن وصل کنیم برای این که به همین پورت بتوانیم تعداد کلید های بیشتری وصل کنیم اگر کلید ها را به صورت ماتریسی ببندیم می توانیم 16 تا کلید داشته باشیم
برای اینکار کلید ها را به صورت 4 سطر و 4 ستون می بندیم که 4 تا سطر را به 4 تا از میکرو وصل میکنیم و آنها را به صورت خروجی تعریف می کنیم و 4 تا ستون را به 4 تا از پین های میکرو وصل میکنیم و آنها را به صورت ورودی تعریف می کنیم. که در ادامه به توضیح کامل آن می پردازیم:
شرح مدار و برنامه:
در اینجا ما از یک میکرو کنترلر ATMEGA32 استفاده کردیم و به پورت C کیبورد و به پورت A یک LCD وصل کردیم. هدف ما در این مثال این که از کیبورد یک عدد ورودی را دریافت کنیم و روی LCD آن عدد را نمایش دهیم. به پورت C.0 تا C.3 به ترتیب سطر های R1 تا R4 را وصل کردیم و به پورت C.4 تا C.7 به ترتیب ستونهای C1 تا C4 را وصل کردیم و در برنامه سطر ها را به عنوان خروجی تعریف کردیم (یعنی نیبل بالا) و ستون ها را به عنوان ورودی (یعنی نیبل پایین) و برنامه را به شکل زیر نوشتیم:
#include <mega32.h> // معرفي ميکرو #include <delay.h> // فراخواني تابع تاخيري #include <lcd.h> // فراخواني توابع ال سي دي #include <stdio.h> // فراخواني دستورات استاندار ورودي و خروجي #define c1 PINC.4 // تعريف سي1 به عنوان يک اسم براي اين پين #define c2 PINC.5 #define c3 PINC.6 #define c4 PINC.7 #asm .equ __lcd_port=0x1B ;PORTA #endasm /*********www.picpars.com**********/ unsigned char scan[4]={0XFE,0XFD,0XFB,0XF7}; // اسکن صفحه کليد unsigned char arrkey[16]={ //کد هاي صفحه کليد 7,8,9,20, 4,5,6,30, 1,2,3,40, 70,0,60,50}; char key; /*********www.picpars.com**********/ unsigned char keypad(){ // تعريف يک تابع با مقدار برگشتي unsigned char r,b; while(1){ for (r=0; r<4; r++){ b=4; PORTC=scan[r]; if(c1==0) b=0; if(c2==0) b=1; if(c3==0) b=2; if(c4==0) b=3; if (!(b==4)){ key=arrkey[(r*4)+b]; while(c1==0); while(c2==0); while(c3==0); while(c4==0); delay_ms(50); return key; } } } } /*********www.picpars.com**********/ void main(void){ char buffer[16]; lcd_init(16); DDRC=0X0F; //سطرها خروجي و ستون ها ورودي PORTC=0XFF; //مقدار اوليه پورت 1 باشد lcd_clear(); lcd_putsf("WWW.PICPARS.COM BY SMGH"); delay_ms(6000); while(1){ key=keypad(); // فراخواني تابع براي اسکن صفحه کليد lcd_clear(); sprintf(buffer,"Key %d",key); lcd_puts(buffer); delay_ms(300); } }
شرح برنامه:
#define c1 PINC.4
این کد پین PINC.4 را به اسم جدید C1 تغییر نام می دهید به این دلیل از این دستور استفاده می کنیم که در هر جایی از برنامه بخوام از پین PINC.4 به عنوان ورودی استفاده کنیم و مقدار آن را بخوانیم دیگر لازم نیست بنویسیم PINC.4 بلکه کافی است فقط بجای آن بنویسیم C4 که ما در این برنامه 4 تا از پین ها را به این شکل تغییر نام دادیم.
این کد ها به ترتیب از سمت چپ به راست R1 و R2 و R3 و R4 را خاموش (0) می کند. به این صورت که وقتی میکرو زیر برنامه keypad را اجرا می کند CPU با سرعت بسیار بالایی این 4 تا پین را صفر می کند یعنی اینکه برای بار اول R1=0 و بقیه روشن و R2=0 و بقیه روشن و به همین ترتیب تا آخر…
حالا فرض کنیم وقتی که R1=0 بوده ما کلید شماره 8 را فشار داده ایم که در این صورت فقط ستون C1 صفر می شود یعنی ستون کلید های شماره 8و5و2و0 و از آن جایی که R1=0 بوده میکرو متوجه می شود که R1=0 بوده و حالا C1=0 شده و تنها کلیدی که در سطر اول و ستون دوم است کلید شماره 8 بود و در نتیجه عدد 8 را به ما بر میگرداند.
از متغییر arrkey برای برگرداندن عدد متناظر با کلید فشار داده شده استفاده می شود.
و حالا تابع keypad: در این تابع دو متغییر به نام های r,b تعریف شده که از r برای کنترل سطر ها و از b برای کنترل ستون ها استفاده شده. و بعد یک حلقه بی نهایت تعریف شده و تا زمانی که یک کلید فشار داده نشود میکرو در این حلقه می ماند.
درون حلقه بی نهایت یک حلقه for نوشته شده که دستورات داخل این حلقه کلا 4 مرتبه تکرار می شود و چون این حلقه for در یک حلقه بی نهایت قرار دارد پس حلقه for نیز بی نهایت اجرا می شود اما هر 4 بار یک بار اجرا می شود و در هر بار از 0 تا 3 می شمارد که در حلقه دستور PORTC=scan[r] هم اجرا می شود که شمارنده حلقه که متغیر r می باشد در آرایه scan قرار می گیرد و از آرایه یک کدی را بر میگرداند و روی پورت قرار می دهید.
این کار همان جاروب کردن نیبل بالایی پورت می باشد که R1 تا R1 را یکی یکی صفر می کند و در بالا توضیح دادیم. و در مرحله بعدی گفتیم مقدار اولیه b=4 باشد و بعد از آن 4 شرط قرار دادیم و گفتیم برای فشار داده شدن هر ستون یک مقدار به متغییر b بده تا بعدا بتوانیم توسط آن از میان یک سطر و یک ستون کلید مربوطه را پیدا کنیم.
در مرحله بعدی یک شرط نوشتیم و گفتیم اگر متغییر b مخالف با 4 می باشد (یعنی مطمئنا کلیدی فشار داده شده) حالا کلید مربوطه را پیدا کن که ابتدا متغییر r را در 4 ضرب می کند و سپس با عدد درون b جمع می کنیم و حاصل این عملیات اعدادی بین 0 تا 15 می باشد که توسط این اعداد عدد واقعی کلید را از آرایه arrkey برمیگرداند و درون متغییر key قرار می دهید و بعد از آن 4 حلقه بی نهایت برای 4 ستون نوشتیم و به این منظور می باشد که تا وقتی کاربر دستش را روی کلید برنداشته در این حلقه بماند و بعد هم یک تاخیر نوشتیم که این تاخیر هم به عنوان یک لرزه گیر استفاده شده و هم فاصله بین خواندن دو کلید می باشد. و در آخر هم مقدار کلید خوانده شده به تابع توسط دستور return برگشت داده می شود.
و در تابع main عدد کلید مربوطه که در متغییر key قرار دارد به صورت یک رشته آماده می شود و بعد هم برای LCD ارسال می شود.
امیدوارم که این توضیحات کامل بوده و این برنامه مورد رضایت شما واقع شده باشد. در صورتی که سوال یا نظری در مورد این برنامه دارید می توایند در قسمت نظرات همین صفحه برای ما مطرح کنید.
از لینک زیر هم می توانید فایل های مربوط به این برنامه را دانلود نمائید. [ این برنامه با کدویژن نسخه 2.03 و پروتیوس نسخه 7.6SP0 نوشته شده است و مطمئنا با نسخه های قدیمی تر کار نخواهند کرد] با تشکر