|
:: نائب المشرف العام ::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
|
|
نشاط [ ماجد عباس محمد ]
قوة السمعة:
|
|
25-07-2018, 08:29 AM
المشاركة 89
|
|
كود المفاتيح keyPad
سبق أن شرحنا فكرتها وهى الصفوف و الأعمدة و الآن للتطبيق. هنا نقطة لنتحسب لها، أنك ستجعل 4 طرف خرج و 4 دخول، الدخول عادة غير محدد لكونه معاوقة كبيرة و من ثم سيحتاج لمقاومة إما للأرضى أو للموجب إذن يمكننا أن نضع 5 فولت على أحد الصفوف ثم نرى من أى عامود خرج أو العكس بالطبع نضع على أى عامود ونرى من أى صف خرج. أيضا يمكننا أن نضع صفر على أحد الأطراف و نرى من أى طرف خرج.
كما سبق القول فمنافذ أتميل عندما تكون دخل أى وضع آحاد عليها، فهى فى الواقع توصل الطرف من خلال مقاومة جذب لأعلى ضعيفة وهذا سبب عدم قدرتها على الإمداد بتيار و حاجتنا لهذه الدائرة الخاصة لنتمكن من تفعيل الريلاى . بهذا لو وضعنا FF أو 255 على منفذ سيكون كل الأطراف عليها 5 فولت ولا حاجة لتوصيل مقاومات خارجية.
الآن ضع صفر على طرف ما سيكون قادر على أن يبتلع مئات المرات التيار ألذى يصدره أى من الأطراف الباقية ، حسنا ما بقى أن نضغط الزر و نرى أين خرج هذا الصفر.
قبل أن نفكر فى أى شيئ يجب تحديد وظائف الأزرار، فلدينا عادة عشرة أزرار متفق عليها من صفر إلى 9 و لدينا سته متباينة لكن سنرقمهم من أعلى لأسفل بالأرقام 10 ، 11 ، 12 ، 13 ، 14 ثم 15

هذه الأزرار يكتب عليها أى شيء فكما فى المثال السابق تكون A,B,C,D حيث A=10 و هكذا أو أحيانا F1,F2,F3,F4 حيث F1 = 10 وهكذا و يليها # قبل الصفر ثم * بعده و أحيانا F1,F2,F3 ثم Enter ورقمه 13 ثم Cancel برقم 14 ثم الصفر و أخيرا أى كلمة أخرى مثل Mode برقم 15
لنتفق مع أى لوحة أزرار قد نجدها سنجعل وظيفة 13 هى Enter و تكون تشغيل الجهاز ثم 14 Cancel بمعناها و تلغى فقط ما سبق إدخاله قبل التشغيل و أثناء التشغيل تكون إيقاف مؤقت كما فى حال فتح الباب و الأخير إيقاف تام أى إلغاء ما بقى من وقت و العودة للبدء.
يبقى لدينا ثلاث أزرار أكواد 10 و 11 و 12 فيمكننا جعل الأول أثناء العمل يزيد 10 ثوانى و الثانى يزيد دقائق و الثالث يزيد 10 دقائق و نظرا لعدم وجود زر آخر لتنقيص الرقم سنجعل كل منهم دوار بمعنى يتحرك من صفر إلى 9 ثم صفر مرة أخرى ولا يحدث أى من الأرقام الأخرى فمثلا لو لديك 3:45 ثم حركت الدقائق تصبح 3:55 ثم 3:05 وهكذا كما لو أنك أنقصت الرقم. و هكذا.
هنا أيضا نحتاج أن نحدد كيف ندخل الطاقة المخفضة التى تحدثنا عنها. المشكلة أنه لم يعد لدينا أزرار لذا سنجعل زر 10 مزدوج الأداء بمعنى لو ضغط قبل التشغيل يتولى ضبط نسبة الطاقة و إن ضغط أثناء التشغيل يزود الزمن 10 ثوانى كما اتفقنا.
هذا الكود يحتاج بضع احتياطات مثلا لو ضغطت على زر سيقرأه المتحكم عدة مرات لسرعته فى تنفيذ الأوامر ، لذا سنحتاج أن نتأكد من أن الزر قد ترك قبل أن نعيد القراءة و أبسط حل إضاعة نصف ثانية حتى يرفع الشخص يده و لهذا ميزة و عيب أنه يمكنك من تكرار الإدخال دون الحاجة لرفع الأصبع لكن عيبه أنه يختلف من شخص لآخر، و هناك من يضع دورة يقرأ ذات الكود حتى يتغير و لكن لدينا إمكانيه المقارنة و القفز عند التساوى وهى تحتاج 3 بايت .
حل ثالث هو أننا نبدأ بوضع 255 أو FF على الخرج فإن كان هناك كود تحول إلى قيمة من صفر إلى 15 أى 0F و من ثم نستشعر البت رقم 7 و نستخدمها Flag ، طالما هناك كود سيكون = صفر أما لو رفع الإصبع سيكون =1
بهذا و بمجرد إضافة تعريف بلا كود نستطيع أن نختبر هذه البت بدلا من أمر قارن و اقفز CJNE و هكذا نضع عنوان
كود:
ReadAndChk:
ACALL ReadKPD
JNB NoKey,ReadAndChk ; Wait key released
RAC:
ACALL ReadKPD
JB NoKey,RAC ; wait Key pressed
MOV A,#9 ; Put 9 in Accumulator
CLR C ; clear carry
SUBB A,B ; Command Or Number
RET
ثم نقرأ الأزرار ونختبر البت رقم 7 و التى أسميناها NoKey بالأمر JNB و طالما هى بصفر أى يوجد رقم سابق فننتقل للعنوان و بهذا ننتظر رفع الأصبع عن الأزرار و بعدها يدخل فى الاختبار التالى لانتظار رقم بالضغط على زرار و ألذى بدوره يجعلها = صفر ، بهذا نقرأ الرقم. بعد ذلك نضع فى المراكم 9 و نطرح منه كود الزرار فلو كان من صفر إلى 9 لن يكون هناك C أى رقم و إلا سيكون C=1 أى أمر من الستة و هكذا حللنا كل البيانات المطلوبة.
قراءة الأزرار KeyPad
بقى كود قراءة الأزرار وهو ببساطة كما ذكرنا نضع FF كخرج ثم صفر على أى طرف و نقرا أين ظهر و منه نحدد الكود ثم نعود
كود:
ReadKPD:
MOV KeyValue,#255 ; No key code
Mov R4,#5 ; Read 5 times
KPDLOOP:
MOV KeyPad, #254 ; 1111 1110 COL4
JB ROW1,C4R2
MOV KeyValue,#10 ; F1 or A pressed ret 0xA = 10
RET
C4R2: JB ROW2,C4R3
MOV KeyValue,#11 ; F2 or B pressed ret 0xB = 11
RET
C4R3: JB ROW3,C4R4
MOV KeyValue,#12 ; F3 or C pressed ret 0xC = 12
RET
C4R4: JB ROW4,C3R1
MOV KeyValue,#13 ; Enter Pressed ret 0xD = 13
RET
C3R1: MOV KeyPad,#11111101b ; Col3
JB ROW1,C3R2
MOV KeyValue,#3 ; 3 pressed ret 3
RET
C3R2: JB ROW2,C3R3
MOV KeyValue,#6 ; 6 pressed ret 6
Ret
C3R3: JB ROW3,C3R4
MOV KeyValue,#9 ; 9 pressed
Ret
C3R4: JB ROW4,C2R1
MOV KeyValue,#14 ; "cancel" btn pressed
Ret
C2R1: MOV KeyPad,#11111011b ; Col2
JB ROW1,C2R2
MOV KeyValue,#2 ; 2 pressed
Ret
C2R2: JB ROW2,C2R3
MOV KeyValue,#5 ; 5 pressed
Ret
C2R3: JB ROW3,C2R4
MOV KeyValue,#8 ; 8 pressed
Ret
C2R4: JB ROW4,C1R1
MOV KeyValue,#0 ; 0 pressed
Ret
C1R1: MOV KeyPad,#11110111b ; Col1
JB ROW1,C1R2
MOV KeyValue,#1 ; 1 pressed
Ret
C1R2: JB ROW2,C1R3
MOV KeyValue,#4 ; 4 pressed
Ret
C1R3: JB ROW3,C1R4
MOV KeyValue,#7 ; 7 pressed
Ret
C1R4: JB ROW4,CR00
MOV KeyValue,#15 ; Mode pressed
RET
CR00: DJNZ R4,KPDLOOP
RET
طبعا ستسأل من أين أتينا بهذه الأكواد أى عندما نضع كذا و نقرأ كذا يكون الرد هو 5 وليس 7
ببساطة من الرسم حيث تجد الصفوف و الأعمدة ثم تفترض أنك ستضع على صف 1 فأين سيخرج بالضغط على عامود 1 و هكذا.
لو اتبعت الخطوات بدقة مع الرسم الصحيح على البوردة و مطابقتها من لوحة الأزرار لا يجب أن تجد مشاكل لكن ماذا نفعل لو حدثت؟ لن نلقى بالمشروع فى القمامة! أولا جرب قلب المدخل فلوحة الأزرار لها 8 طرف و ستضعها على مشط من 8 طرف و ربما عكسته أثناء الإدخال.
لم يأتى بالكثير إذا ماذا نفعل؟ فرضا اللوحة مختلفة كليا عما توقعناه و رسمناه..
الحل بسيط جدا ،ـ ورقة و قلم و اضغط على زر 1 و اقرأ ما ظهر و ليكن 5 مثلا، اكتب فى الورقة 1 > 5 مثلا ثم كرر مع زر2 ثم 3 وهكذا
الآن فى المترجم ستجد جملة
MOV KeyValue,#1 ; 1 pressed
لكنها الآن أعطت 5 فنغير كل واحد بخمسة فتصبح
MOV KeyValue,#5 ; 5 pressed *
و الآن أضفنا نجمة لنتذكر أن هذا السطر قد تم تعديله أو تصحيحه وهكذا حتى تصحح الستة عشر زرار.
المرة القادمة إن شاء الله نتحدث عن باقى البرنامج
|