You could put your verification ID in a comment Or, in its own meta tag Or, as one of your keywords
Your content is here. The verification ID will NOT be detected if you put it here.
دانشگاهی مدیریت ارشد وب |
|||
سه شنبه 22 / 12 / 1389برچسب:اتصال صفحه کلید,صفحه کلید ماتریسی ,ماتریسی 16 تایی,اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر,اتصال صفحه کلید ماتریسی 16 تایی به 8051,اتصال صفحه کلید,صفحه کلید ماتریسی ,ماتریسی 16 تایی,اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر,اتصال صفحه کلید ماتریسی 16 تایی به 8051,برنامه اتصال صفحه کلید ماتریسی 16 تایی به 8051, :: 8:57 :: نويسنده : محمود کهن
آزمایش : اتصال صفحه کلید به میکروکنترلر
اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر می باشد و کاربردهای زیادی در اکثر پروژه های مبتنی بر مییکروکنترلر دارد . نقشه ی شماتیک سخت افزار را می توانید از اینجا دانلود کنید و نرم افزار را هم که در زیر مشاهده می کنید همان نرم افزاری است که در کتاب «میکروکنترلر 8051» نوشته ی محمد علی مزیدی برای اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر پیشنهاد شده است . با این تفاوت که نرم افزار موجود در کتاب از 2 پورت استفاده می کند ولی نرم افزاری که در اینجا مشاهده می کنید برای استفاده از یک پورت بهینه شده است و برای نمایش اعداد مربوط به کلید های فشرده شده نیز از 4 عدد سون سگمنت که به روش مالتی پلکس بسته شده اند بهره می برد . توضیحات لازم در مورد نرم افزار صفحه کلید را در ذیل آن مشاهده می کنید و در مورد نرم افزار مالتی پلکس هم در آزمایش قبل به طور مفصل توضیح داده شده است .
Zero Equ 0C0H One Equ 0F9H Two Equ 0A4H Three Equ 0B0H Four Equ 99H Five Equ 92H six Equ 82H Seven Equ 0F8H Eight Equ 80H Nine Equ 90H _A Equ 88H _B Equ 83H _C Equ 0C6H _D Equ 0A1H _E Equ 86H _F Equ 8EH
Timer0_Preload Equ -5000 seven_segment Data P0 KeypadPort Data P1 Yekan Data 35H Dahgan Data 36H Sadgan Data 37H Yekan_Hezar Data 38H Anode1 Bit P3.0 Anode2 Bit P3.1 Anode3 Bit P3.2 Anode4 Bit P3.3 ;******************************* Org 0H Sjmp Main ;******************************* Org 0BH Ajmp Multiplex ;******************************* Main: Mov Tmod,#01H Mov IE,#82H Mov r2,#0 Mov Yekan,#Zero Mov Dahgan,#Zero Mov Sadgan,#Zero Mov Yekan_Hezar,#Zero Mov Tl0,#low Timer0_Preload Mov Th0,#high Timer0_Preload Setb Tr0
Back1: Mov KeypadPort,#11110000B Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Back1 Back2: Acall Delay Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Over Sjmp Back2 Over: Acall Delay Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Over1 Sjmp Back2 ;* * * * * * * * * * * * * * * * Over1: Mov KeypadPort,#11111110B Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Row_0 ;* * * * * * * * * * * * * * * * Mov KeypadPort,#11111101B Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Row_1 ;* * * * * * * * * * * * * * * * Mov KeypadPort,#11111011B Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Row_2 ;* * * * * * * * * * * * * * * * Mov KeypadPort,#11110111B Mov a,KeypadPort Anl a,#11110000B Cjne a,#11110000B,Row_3 Ajmp Back2 ;* * * * * * * * * * * * * * * * Delay: Mov 40h,#50 Back3: Mov 41h,#100 Djnz 41h,$ Djnz 40h,Back3 Ret ;* * * * * * * * * * * * * * * * Row_0: Mov Dptr,#Kcode0 Sjmp Find Row_1: Mov Dptr,#Kcode1 Sjmp Find Row_2: Mov Dptr,#Kcode2 Sjmp Find Row_3: Mov Dptr,#Kcode3 ;* * * * * * * * * * * * * * * * Find: Rlc a Jnc Match Inc dptr Sjmp Find ;* * * * * * * * * * * * * * * * Match: Clr a Movc a,@a+Dptr
Mov Dptr,#NumberCodes Movc a,@a+Dptr Mov Yekan_Hezar,Sadgan Mov Sadgan,Dahgan Mov Dahgan,Yekan Mov Yekan,a Ajmp Back1 ;******************************* Multiplex: Clr Tr0 Mov Tl0,#low Timer0_Preload Mov Th0,#high Timer0_Preload Setb Tr0 Inc r2
Cjne r2,#1,Show_Dahgan Clr Anode4 Setb Anode1 Mov seven_segment,Yekan Reti
Show_Dahgan: Cjne r2,#2,Show_Sahgan Clr Anode1 Setb Anode2 Mov seven_segment,Dahgan Reti
Show_Sahgan: Cjne r2,#3,Show_Yekanhezar Clr Anode2 Setb Anode3 Mov seven_segment,Sadgan Reti
Show_Yekanhezar: Mov r2,#0 Clr Anode3 Setb Anode4 Mov seven_segment,Yekan_Hezar Reti ;******************************* Cseg at 170H Kcode0: Db 3,2,1,0 Kcode1: Db 7,6,5,4 Kcode2: Db 11,10,9,8 Kcode3: Db 15,14,13,12 ;******************************* Cseg at 180H NumberCodes: Db Zero,One,Two,Three,Four,Five,Six,seven,Eight,Nine,_A,_B,_C,_D,_E,_F End
به طوری که در نقشه ی شماتیک مشاهده می کنید سطرها به 4 بیت کم ارزشتر و ستونها نیز به 4 بیت پرارزشتر پورت P1 متصل شده اند . نرم افزار مربوط به صفحه کلید را می توان به 4 قسمت تقسیم کرد که عملکرد هر قسمت به شرح ذیل است . در ابتدا برای اطمینان از رهایی کلید قبلی به همه ی سطرها صفر اعمال شده و ستونها مرتباً خوانده و وارسی می گردند تا همه ی ستونها در سطح منطقی یک باشند . اگر همه ی ستونها در سطح یک تشخیص داده شوند برنامه قبل از رفتن به مرحله بعدی با فراخوانی زیر روال Delay مکث کرده و سپس در قسمت بعدی منتظر فشرده شدن کلید جدید می ماند . در قسمت دوم نرم افزار ، برای یافتن کلید فشرده شده ستونها بوسیله یک حلقه نامتناهی مکرراً پویش می شوند تا یکی از آنها حاوی صفر شود . ذکر این نکته ضروری است که لچ های خروجی متصل به سطرها هنوز صفرهای خود را که در مرحله ی قبل تهیه شده اند دارند . نرم افزار پس از تشخیص فشردگی کلید ، با فراخوانی زیر روال Delay ، 20 میلی ثانیه برای حذف جهش ناشی از اتصال کلید صبر کرده و دوباره ستونها را پویش می کند . این کار دو مزیت دارد : 1- اطمینان از اینکه اولین تشخص فشردگی به دلیل پارازیت و نویز نبوده و 2- تأخیر 20 میلی ثانیه ای موجب می شود تا تا فشردن کلید مذکور بعنوان چندین فشردگی تعبیر نشود . اگر بعد از تأخیر 20 میلی ثانیه ، باز هم کلید فشرده شده تشخیص داده شد ، برنامه برای یافتن سطری که کلید فشرده شده در آن است به مرحله ی بعدی می رود و در غیر این صورت به حلقه ی تشخیص کلید فشرده شده ی واقعی بر می گردد . در قسمت سوم ، نرم افزار به منظور تشخیص سطری که کلید فشرده شده در آن است ، هر بار فقط به یکی از سطرها صفر اعمال کرده و ستونها را بررسی می کند . اگر همه ی ستون ها در سطح بالا باشند بدین معناست که کلید فشرده شده متعلق به این سطر نیست . بنابراین به سطر بعدی صفر اعمال کرده و این عمل را تا یافتن سطر متعلق به کلید تکرار می کند . پس از مشخص شدن سطر متعلق به کلید فشرده شده ، ابتدا آدرس برچسبی که کدهای مربوط به آن سطر در آن تعریف شده اند به درون ثبات Dptr بار شده (مثلاً به صورت Mov Dptr,#Kcode0) و سپس برنامه برای یافتن کد مربوط به کلید فشرده شده به مرحله بعد می رود . برای شناسایی کلید فشرده شده ، ثبات a که محتوی پورت متصل به صفحه کلید است ، از طریق پرچم نقلی به چپ چرخانده شده (با دستور Rlc a) و صفر بودن پرچم نقلی بررسی می شود . اگر پرچم نقلی صفر باشد ابتدا محتوای ثبات a صفر شده و سپس با دستور Movc a,@a+Dptr کد مربوط به کلید فشرده شده به درون ثبات a منتقل می شود . در صورتی که پرچم نقلی صفر نباشد ثبات Dptr برای اشاره به مکان بعدی در آدرس مورد نظر یک واحد افزایش می یابد . در این مرحله ثبات a حاوی کد مربوط به کلید فشرده شده است که عددی بین 0 تا 15 می باشد . ولی برای نمایش این کد روی سون سگمنت می بایست به کد متناظر آن تبدیل شود که این کار نیز با استفاده از روش آدرس دهی اندیسی صورت می گیرد . البته می توان کدهای مربوط به اعداد و کاراکترها برای نمایش روی سون سگمنت را مستقیماً در محلهایی که با برچسب های Kcode0 تا 3 مشخص شده اند قرار داد تا دیگر به فرآیند تبدیل کد نیازی نباشد ولی در صورتی که بخواهیم با کدهای صفحه کلید عملیات محاسباتی انجام دهیم بایستی به همین روشی که در برنامه به کار رفته عمل کنیم . اگر ترتیب اتصال سطرها و ستونها به پورتP1 مطابق نقشه ی شماتیک باشد ، با فشردن هر کلید عدد و یا کاراکتری که در نقشه ی شماتیک در زیر هر کلید است بر روی سون سگمنت نشان داده می شود . در صورتی که شما ترتیب دیگری را برای کلیدها انتظار دارید می توانید با دستکاری جدولی که در انتهای برنامه و با آدرسهای Kcode0 تا 3 تعریف شده به ترتیب مورد نظر برسید . برنامه بدون نقص بوده و توسط بنده امتحان شده است . شما فقط بایستی در بستن سخت افزار دقت لازم را به خرج دهید و با اطمینان میکروکنترلر پروگرام شده را استفاده کرده و از نتیجه لذت ببرید نظرات شما عزیزان:
پيوندها ما را با نام افزایش بازدید رایگان سایت و وبلاگ لینک کنید و ادرس خود را نیز ثبت کنید نويسندگان |
|||
|