اخي الحبيب هذا كود كنت كتبته وجربته على البروتس وبدون مشاكل وهو عبارة عن مفتاحين متصلين على البوررت C الاول PORTC.F0 والثاني PORTC.F1
بحث كل ضغطة على المفتاح الاول تزيد الرقم الظاهر بمقدار واحد حتى تصل الى الرقم تسعة فتعود الى صفر ... والمفتاح الثاني بنفس الطرقة ينقص الرقم حتى الصفر وبعدها نجعله يساوي تسعة المميز في هذا الكود انه يقوم عند كل عملية زيادة او نقصان بتخزين القيمة الجديد في موقع في ذاكرة ال EEPROM وفائدة ذلك انه عند فصل القدرة عن الدائرة لأي سبب من الاسباب ثم التشغيل من جديد فإنك سوف تجد البك بدأ من حيث انتهيت قبل فصل القدرة
كود:
char i;
bit a,b;
void main() {
ADCON1=0x07;
UART1_Init(9600);
TRISB=0;
TRISC=3;
PORTB=EEPROM_Read(5); /* هذا السطر يجعل بورت بي يأخذ قيمته عند بداية التشغيل من مكان تخزين المتغير آي وبذك يبدا العد من حيث انتهى اخر مرة */
i=EEPROM_Read(5);
a=0;
b=0;
while(1){
a=!PORTC.F0||a; /*هذا السطر للتعامل مع المفتاح فبذلك لن يتم زيادة الرقم على الشاشة او انقاصه الا عند الظغط على المفتاح ثم ازالة الضغط */
if(PORTC.F0&&a){if(i==9)i=0; else i=i+1;a=0; EEPROM_Write(5,i); Delay_ms(50);} //هنا يتم اختبار هل تم الضغط على المفتاح
//ظظلمفتاح التصل ببورت سي البت رقم صفر فإذا تتحقق
//ق الشرط فإنه يقوم مرة اخرى بإختبار اذا كان وصل للرقم تسعة فأن وصل فإنه يجعله
//يعود الى الصفر ثم يقوم بزيادة المتغر آي ثم تصفير المتغير ايه ثم يخزن هذا المت
//غير في الموقع رقم 5 من الذاكرة ثم ينتظر زمن قليل وهذا الانتظار مهم حتى ينتهي البك من الكتابة في الذاكرة
b=!PORTC.F1||b;
if(PORTC.F1&&b){if(i==0)i=9; else i=i-1;b=0; EEPROM_Write(5,i);
Delay_ms(50);}
PORTB=EEPROM_Read(5);// ثم نجعل بورت بي يقرا من الموقع الذي خزنا فيه المتغير ولو جعلناه يقرا المتغير مباشرة لا مشكلة هنا
}
}
اما بالنسبة للسطر
كود:
a=!PORTC.F0||a;
if(PORTC.F0&&a)
فالسطر الاول عبارة عن دائرة منطقية حيث الاشارة ( ! ) تمثل بوابة ( NOT ) والاشارة ( || ) تمثل بوابة ( OR ) اما الاشارة ( && ) فهي بوابة ( AND )