هدا الكود يتم برمجت المنبه من الوقت الى الوقت الدي تريد
في مشاكل تعديل هدا الكود حتى تصبح اعدادات المنبه في الابروم
وان عند تشغيل المنبه لا تعمل الساعة جيدا
كود:
// LCD module connections
sbit LCD_RS at RB6_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_RS_Direction at TRISB6_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
sbit MODE at Rc2_bit;
sbit SELECT at Rc3_bit;
sbit ENTER at Rc4_bit;
sbit RelaySW at RB7_bit;
sbit START at Rc5_bit;
char s0,s1,m0,m1,h0,h1,j,x,y;
bit u;
char MSG2[] = "off";
char MSG3[] = "on ";
char MSG5[] = "led/off";
char MSG6[] = "led/on ";
char MSG0[] = "TIME:";
unsigned short HHMM_Pos[] = {6, 7, 8, 9, 10};
unsigned short ON_Time[] = {0, 0, 10, 0, 0}; // 10 + 48 is :
unsigned short OFF_Time[] = {0, 0, 10, 0, 0};
bit a;
unsigned short Mode_Select = 0 ; // 0:ON, 1:OFF
unsigned short i,t=0, n, k, Timer_On, Get_Input, Cur_Pos, Cur_On;
unsigned short temp, refresh, Num, HalfSec, Blink, ChangeMin=0;
unsigned short OFF_HH, OFF_MM, ON_HH, ON_MM;
void Disp_First_Row(){
if (RelaySW == 0) Lcd_Out(2,11, MSG5);
if (RelaySW == 1) Lcd_Out(2,11, MSG6);
}
void Disp_Char(unsigned short col, unsigned short chr){
Lcd_Chr(2, col, chr+48);
}
void Disp_Time(){
for(i=0; i<5; i++){
if(!Mode_Select){
Lcd_Out(2,1, MSG2);
Disp_Char(HHMM_Pos[i],OFF_Time[i]);
}
if(Mode_Select){
Lcd_Out(2,1, MSG3);
Disp_Char(HHMM_Pos[i],ON_Time[i]);
}
}
}
void debounce(){
Delay_ms(250);
}
void cursor_left(){
for(n=0; n<5; n++){
Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
}
}
void disable_timer(){
INTCON = 0x00;
RelaySW = 0;
INTCON.T0IF = 0;
Timer_On = 0;
Blink = 0xff;
Mode_Select = 0;
Disp_First_Row();
Disp_Time();
}
void aficher(){
lcd_chr(1,15,s0+48); lcd_chr(1,14,s1+48);lcd_out(1,10,":");lcd_out(1,13,":");lcd_chr(1,12,m0+48); lcd_chr(1,11,m1+48);
lcd_chr(1,9,h0+48); lcd_chr(1,8,h1+48);
}
void jour(){
if(j==0) Lcd_Out(2,11,"LUN");
if(j==1) Lcd_Out(2,11,"MAR");
if(j==2) Lcd_Out(2,11,"MER");
if(j==3) Lcd_Out(2,11,"JEU");
if(j==4) Lcd_Out(2,11,"VEN");
if(j==5) Lcd_Out(2,11,"SAM");
if(j==6) Lcd_Out(2,11,"DIM");
}
void interrupt() {
Num ++; // Interrupt causes Num to be incremented by 1
if(Num == 9) {
HalfSec ++; // Increase sec
Num = 0;
Blink = ~Blink;
if (HalfSec == 120){
HalfSec = 0;
ChangeMin = 1;
}
}
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
//Enter your code here
t++;
if(t==20){t=0;s0++;}
if(s0==10){s0=0;s1++;}
if(s1==6){s1=0;m0++;}
if(m0==10){m0=0;m1++;}
if(m1==6){m1=0;h0++;}
if(h0==10){h0=0;h1++;}
if(h1==2 && h0==4){h1=h0=s1=s0=m1=m0=0;j++;}
if(j==7)j=0;
}
TMR0 = 39; // TMR0 returns to its initial value
INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
}
//Timer1
//Prescaler 1:1; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x01;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void main() {
TRISc = 0xff;
TRISB = 0b00000001;
InitTimer1();
OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0
TMR0 = 39; // Timer T0 counts from 39 to 255
INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts
INTCON.T0IF = 0;
RelaySW = 0;
Timer_On = 0;
Get_Input = 0;
Cur_Pos = 0;
Cur_On = 0;
refresh = 0;
Num = 0;
HalfSec = 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
i=t=a=0;
Lcd_Cmd(_LCD_CLEAR);
while(1){
aficher();
jour();
Lcd_Out(1,1, MSG0);
if(portb.f0==0) a=~a;
while(a==1) {
Lcd_Cmd(_LCD_CLEAR);
Disp_First_Row();
Lcd_Out(2,4,"-");
Disp_Time();
do {
if(!MODE && !Timer_On){
debounce();
if(!Get_Input){
Mode_Select = ~Mode_Select;
Disp_Time();
}
if(Get_Input){
if(!Mode_Select){
OFF_time[Cur_Pos] = OFF_time[Cur_Pos]+1;
temp = OFF_time[Cur_Pos];
switch (Cur_Pos){
case 0: if(temp > 9) OFF_time[Cur_Pos]=0;
break;
case 1: if(temp > 9) OFF_time[Cur_Pos]=0;
break;
case 3: if(temp > 5) OFF_time[Cur_Pos]=0;
break;
case 4: if(temp > 9) OFF_time[Cur_Pos]=0;
break;
}
Disp_Char(6+Cur_Pos, OFF_time[Cur_Pos]);
}
if(Mode_Select){
ON_time[Cur_Pos] ++;
temp = ON_time[Cur_Pos];
switch(Cur_Pos){
case 0: if(temp > 9) ON_time[Cur_Pos]=0;
break;
case 1: if(temp > 9) ON_time[Cur_Pos]=0;
break;
case 3: if(temp > 5) ON_time[Cur_Pos]=0;
break;
case 4: if(temp > 9) ON_time[Cur_Pos]=0;
break;
}
Disp_Char(6+Cur_Pos, ON_time[Cur_Pos]);
}
Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
}
} // END if(!MODE)
if(!SELECT && !Timer_On){
debounce();
Get_Input = 1;
if(Cur_On) {
Cur_Pos ++;
if (Cur_Pos == 2) {
Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
Cur_Pos ++;
}
if(Cur_Pos > 4) {
Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
Cur_Pos = 0;
cursor_left();
}
else Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
}
if(!Cur_On) {
Cur_On = 1;
cursor_left();
Lcd_Cmd(_LCD_UNDERLINE_ON);
}
}
if(!ENTER && Get_Input){
debounce();
Get_Input = 0;
Cur_On = 0;
Cur_Pos = 0;
Disp_Time();
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
}
if (!START && !Get_Input){
debounce();
switch(Timer_On){
case 0: aficher();
Lcd_Out(1,1, MSG0);
Timer_On = 1;
Mode_Select = 0;
Blink = 0;
Disp_Time();
break;
case 1: disable_timer();
break;
}
}
if(Timer_On){ aficher();
Lcd_Out(1,1, MSG0);
OFF_HH = OFF_Time[0]*10 + OFF_Time[1];
OFF_MM = OFF_Time[3]*10 + OFF_Time[4];
ON_HH = ON_Time[0]*10 + ON_Time[1];
ON_MM = ON_Time[3]*10 + ON_Time[4];
switch(Blink){
case 0: Lcd_Chr(2,8,' ');aficher();
break;
case 255: Lcd_Chr(2,8,':');aficher();
break;
}
if(!OFF_HH && !OFF_MM &&!RelaySW){
if(ON_HH || ON_MM){
RelaySW = 1;
Mode_Select = 0xff;
Disp_First_Row();
Disp_Time();
aficher();
Lcd_Out(1,1, MSG0);a=0;
}
else {
disable_timer();
}
}
if(!ON_HH && !ON_MM && RelaySW){
disable_timer();
}
if(ChangeMin) {
switch(Mode_Select){
case 0: if(OFF_MM == 0 && OFF_HH>0){
OFF_MM = 59;
OFF_HH -- ;
aficher();
}
else if (OFF_MM >>0) OFF_MM --;
OFF_Time[0] = OFF_HH/10;
OFF_Time[1] = OFF_HH%10;
OFF_Time[3] = OFF_MM/10;
OFF_Time[4] = OFF_MM%10;
aficher();
break;
case 255: if(ON_MM == 0 && ON_HH>0){
ON_MM = 59;
ON_HH -- ;
}
else if(ON_MM >> 0) ON_MM --;
ON_Time[0] = ON_HH/10;
ON_Time[1] = ON_HH%10;
ON_Time[3] = ON_MM/10;
ON_Time[4] = ON_MM%10;
break;
}
ChangeMin = 0;
Disp_Time();
}
}
}while(1);
}}}