البرنامج :
بعد كتابة التعليقات لتوثيق التدريب نتبع الخطوات التالية :
1- نبدأ بإنشاء دالة الإعدادات اللازمة للتدريب :
كود:
void init_port(void)
{
ANSEL = 0x00; //set port as digital I/O , not analog input
ADCON0 = 0x00; //shut off the A/D converter(default)
CMCON = 0x07; //shut off the comparator
VRCON = 0x00; //shut off the voltage reference(default)
TRISIO = 0x08; // 0b001000 = GP3 bit only as input
GPIO = 0x00; //make all pins low "0"
}
2- ثم إعلان متغير من نوع البت لحفظ حالة المفتاح السابقة لمقارنتها بحالته الراهنة :
كود:
bit oldstate; // Old state flag
3- وتبدا الدالة الرئيسية باستدعاء دالة الإعدادات وتصفير بت متغير الحالة السابقة للمفتاح لتكون بصفر وندخل إلى حلقة التكرار :
كود:
void main() {
init_port();
oldstate = 0;
do {
4- نبدا الحلقة باختبار حالة المفتاح ( التحول إلى الحالة المرتفعة) عن طريق وضع "عائد" دالة المفتاح كشرط لعبارة if . إذا تحقق الشرط (عند الضغط على المفتاح يكون عائد دالة المفتاح بواحد ويكون عائدها بواحد أو true ) يتم تنفيذ عبارة الشرط وهى تحديث بت متغير الحالة السابقة للمفتاح ليكون بواحد كإشارة أو علامة على حالة المفتاح المضغوط (التحول من الحالة المنخفضة إلى الحالة المرتفعة تبعا لصيغة دالة المفتاح ) . لاحظ أن دالة المفتاح تحتوى على زمن تاخير 20 ملى ثانية لعلاج ارتدادات المفتاح .
كود:
if (Button(&GPIO, 3, 20, 1)) { // Detect logical one ie pressed button
oldstate = 1; // Update flag
5- مرة أخرى يتم عمل اختبار المفتاح ( التحول للحالة المنخفض) وتشكيل عبارة شرط if . الشرط هذه المرة هو نتيجة عملية AND ( ورمزها && ) بين حالة المفتاح السابقة والمخزنة ببت الحالة السابقة للمفتاح وبين نتيجة دالة المفتاح (عند التحول للوضع المنخفض) . فإذا كانت الحالة السابقة للمفتاح هى الحالة المضغوطة ( المرتفعة) وتلتها حالة راهنة غير مضغوطة ( منخفضة) كانت نتيجة الشرط صواب true ويتم تنفيذ عبارة الشرط , حيث يتم تحويل حالة أطراف المنفذ وتصفير بت متغير الحالة السابقة للمفتاح . بعبارة أخرى عند الضغط على المفتاح يتم تذكر هذه الحالة , ثم بعد تحرير المفتاح يتم تغيير حالة أطراف المنفذ من حالة الفصل off إلى حالة التوصيل on , وفى الضغطة التالية ثم التحرير يتم التحويل من حالة التوصيل on إلى حالة الفصل off وهلم جرا .
كود:
if (oldstate && Button(&GPIO, 3,20, 0)) {
// Detect one-to-zero transition ie press then release
GPIO = ~GPIO; // Invert GPIO
oldstate = 0; // Update flag
} // beginning of a repeat loop
البرنامج :