السلام عليكم
البرنامج التالي يقوم بحساب الوقت بالثواني والدقائق والساعات وعرضها على شاشة lcd ...
بنفس الوقت يقوم بقلب حالة موتور كل دقيقتين بمعنى كل دقيقتين يقوم بتغيير حالة الموتور من الايقاف الى التشغيل ومن التشغيل الى الايقاف على حسب حالة الموتور
بامكانك توظيف البرنامج بالشكل المناسب ...
المتحكم المستخدم PIC16F877A والكريستال 4MHz ويجب ان تكون قيمة الكريستال 4MHz لانه حسابات التايمر في هذا البرنامج معتمدة على قيمة الكريستال

...
كود:
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD1_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
unsigned int CNT=0,SECONDS=0,MINUTES=0,HOURS=0,COUNTER=0,MS=0;
char *MOTORSTATE[]={"MOTOR OFF","MOTOR ON"};
char X[9];
void TOGGLE_MOTORON(){PORTC.F0=PORTC.F0^1;MS=MS^1;}
void interrupt(void){
if(PIR1.TMR1IF==1){
CNT++;
if(CNT==20){SECONDS++;CNT=0;} //THIS STATEMENT EXCUTES EVERY SECOND
if(SECONDS==60){MINUTES++;SECONDS=0;COUNTER++;} //THIS STATEMENT EXCUTES EVERY MINUTE
if(MINUTES==60){HOURS++;MINUTES=0;} //THIS STATEMENT EXCUTES EVERY HOUR
if(HOURS==24){HOURS=0;} //THIS STATMENT EXCUTES EVERY DAY
TMR1L=176;TMR1H=60;
PIR1.TMR1IF=0;
}
}
void main() {
ADCON1=0X0F;
T1CON=0x00;TRISC.F0=0;PORTC.F0=0;
INTCON.GIE=1;INTCON.PEIE=1;PIE1.TMR1IE=1;PIR1.TMR1IF=0;
TMR1L=176;TMR1H=60;
T1CON.TMR1ON=1;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){
Lcd_Cmd(_LCD_CLEAR);
if(COUNTER==2) {TOGGLE_MOTORON();COUNTER=0;} //this statement excutes every two minutes
sprinti(X,"%02u:%02u:%02u",HOURS,MINUTES,SECONDS);
Lcd_Out(1,5,X);
sprinti(X,"%s",MOTORSTATE[MS]);
Lcd_Out(2,5,X);
DELAY_MS(1000);
}
}