Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Automatic school bell with PIC16F877A

Status
Not open for further replies.
I have modified the circuit and working on the code. You have to use the circuit shown in attached image. It has 5 buttons. The functions of these buttons are as below.

button - Manual / Auto - Selects Manual Mode or Auto Mode
button - SET / RUN / BELL - In Auto mode it is used to switch between set and run modes. In set mode one can set the time for different alarm periods and in run mode the current time will be displayed.

In Manual mode this button is used for Bell. If Bell is pressed and released then bell will sound. If the switch is pressed and released again then bell stops.

button - Hr / Min - This works when Auto mode is selected and when set / run button is in set mode. You can switch between Hr or Min and the cursor blinks at Hr or Min data on LCD so that you can set them.

button - INC - This button is available in Auto mode when SET / RUN button is in SET mode. With this button you can increment the value of Hr or Min based on whether Hr or Min is selected.

button - DEC - This button is available in Auto mode when SET / RUN button is in SET mode. With this button you can decrement the value of Hr or Min based on whether Hr or Min is selected.

I have almost completed the code. I will soon post the completed code soon.

Here is the incomplete code. Code for few buttons have to be implemented.


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
// Lcd pinout settings
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
 
// Pin direction
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
 
sbit MODE_SWITCH at RC3_bit;
sbit MODE_LED at RD3_bit;
 
sbit SET_OR_RUN at RC4_bit;
sbit HR_OR_MIN at RC5_bit;
sbit INC at RC0_bit;
sbit DEC at RC1_bit;
 
#define SET_OR_RUN_SWITCH_PRESSED (!SET_OR_RUN)
#define SET_OR_RUN_SWITCH_NOT_YET_RELEASED (!SET_OR_RUN)
 
#define HR_OR_MIN_SWITCH_PRESSED (!HR_OR_MIN)
#define HR_OR_MIN_SWITCH_NOT_YET_RELEASED (!HR_OR_MIN)
 
#define INC_SWITCH_PRESSED (!INC)
#define INC_SWITCH_STILL_PRESSED (!INC)
 
#define DEC_SWITCH_PRESSED (!DEC)
#define DEC_SWITCH_STILL_PRESSED (!DEC)
 
#define BELL_SWITCH_PRESSED (!RC4_bit)
#define BELL_SWITCH_NOT_YET_RELEASED (!RC4_bit)
 
struct SCHOOL_TIME {
    unsigned char second;
    unsigned char minute;
    unsigned char hour;
}alarmTime, currentTime, startTime, periodOneEndTime, periodTwoEndTime, periodThreeEndTime, breakEndTime, periodFourEndTime, periodFiveEndTime, periodSixEndTime, periodSevenEndTime;
 
unsigned char myFlags = 0, halfSecondCounter = 0, alarmDelayCounter = 0, bellCounter = 0;
char msg[22];
 
const char msg1[] = "School Bell";
const char msg2[] = "Time";
const char msg3[] = "Bell at";
 
sbit updateTimeFlag at myFlags.B0;
sbit modeFlag at myFlags.B1;
sbit alarmFlag at myFlags.B2;
sbit setOrRunFlag at myFlags.B3;
sbit hrOrMinFlag at myFlags.B4;
sbit manualModeBellFlag at myFlags.B5;
 
#define ON 1
#define OFF 0
 
#define ENABLE 1
#define DISABLE 0
 
#define TRUE 1
#define FALSE 0
 
#define SET 1
#define CLEAR 0
 
#define UPDATE_TIME_FLAG_IS_SET (updateTimeFlag == 1)
#define CLEAR_UPDATE_TIME_FLAG {updateTimeFlag = 0;}
 
#define ENABLE_WATCHDOG_TIMER {OPTION_REG = 0xCF;}
 
#define MANUAL_MODE (modeFlag == 0)
#define AUTO_MODE (modeFlag == 1)
 
#define MODE_SWITCH_PRESSED (!RC3_bit)
#define MODE_SWITCH_NOT_YET_RELEASED (!RC3_bit)
 
#define START_OF_CLASSES ((alarmTime.hour == startTime.hour) && (alarmTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((alarmTime.hour == periodOneEndTime.hour) && (alarmTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((alarmTime.hour == periodTwoEndTime.hour) && (alarmTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((alarmTime.hour == periodThreeEndTime.hour) && (alarmTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((alarmTime.hour == breakEndTime.hour) && (alarmTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((alarmTime.hour == periodFourEndTime.hour) && (alarmTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((alarmTime.hour == periodFiveEndTime.hour) && (alarmTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((alarmTime.hour == periodSixEndTime.hour) && (alarmTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((alarmTime.hour == periodSevenEndTime.hour) && (alarmTime.minute == periodSevenEndTime.minute))
 
#define SET_ALARM_FLAG {alarmFlag = 1;}
#define CLEAR_ALARM_FLAG {alarmFlag = 0;}
 
#define ALARM_FLAG_IS_SET (alarmFlag == 1)
#define ALARM_FLAG_IS_NOT_SET (alarmFlag == 0)
 
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
}
 
//copy const to ram string
char *CopyConst2Ram(char *dest, const char *src) {
    char *d;
 
    asm clrwdt
    d = dest;
    for(;*dest++ = *src++;);
    asm clrwdt
    return d;
}
 
void DebounceSwitch() {
    Delay_ms(50);
    asm clrwdt
}
 
void DelayXSec(unsigned char sec) {
    while(sec != 0) {
        Delay_ms(1000);
        asm clrwdt
        sec--;
    }
}
 
void StartAlarm() {
    PWM1_Start();
    asm clrwdt
}
 
void StopAlarm() {
    PWM1_Stop();
    asm clrwdt
}
 
void Interrupt() {
    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        //Enter your code here
        if(++halfSecondCounter == 2) {
                halfSecondCounter = 0;
                updateTimeFlag = 1;
        }
        
        if(ALARM_FLAG_IS_SET) {
            ++alarmDelayCounter;
            if(alarmDelayCounter == 20) {
                     StopAlarm();
            }
            else if(alarmDelayCounter == 130) {
                     CLEAR_ALARM_FLAG
                     alarmDelayCounter = 0;
            }
        }
    }
}
 
void SetTime() {
     asm clrwdt
     startTime.second = 0;
     startTime.minute = 0;
     startTime.hour = 8;
     asm clrwdt
     periodOneEndTime.second = 0;
     periodOneEndTime.minute = 40;
     periodOneEndTime.hour = 8;
     asm clrwdt
     periodTwoEndTime.second = 0;
     periodTwoEndTime.minute = 20;
     periodTwoEndTime.hour = 9;
     asm clrwdt
     periodThreeEndTime.second = 0;
     periodThreeEndTime.minute = 0;
     periodThreeEndTime.hour = 10;
     asm clrwdt
     breakEndTime.second = 0;
     breakEndTime.minute = 20;
     breakEndTime.hour = 10;
     asm clrwdt
     periodFourEndTime.second = 0;
     periodFourEndTime.minute = 0;
     periodFourEndTime.hour = 11;
     asm clrwdt
     periodFiveEndTime.second = 0;
     periodFiveEndTime.minute = 40;
     periodFiveEndTime.hour = 11;
     asm clrwdt
     periodSixEndTime.second = 0;
     periodSixEndTime.minute = 20;
     periodSixEndTime.hour = 12;
     asm clrwdt
     periodSevenEndTime.second = 0;
     periodSevenEndTime.minute = 0;
     periodSevenEndTime.hour = 13;
     asm clrwdt
}
 
void DisplayNextAlarmTime(struct SCHOOL_TIME nextAlarmTime) {
     asm clrwdt
     LCD_Chr(2,9,(nextAlarmTime.hour / 10) + 48);
     LCD_Chr(2,10,(nextAlarmTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(nextAlarmTime.minute / 10) + 48);
     LCD_Chr(2,13,(nextAlarmTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(nextAlarmTime.second / 10) + 48);
     LCD_Chr(2,16,(nextAlarmTime.second % 10) + 48);
     asm clrwdt
}
 
void main() {
 
     ENABLE_WATCHDOG_TIMER
     
     asm clrwdt
     
     CMCON = 0x07;
     CVRCON = 0x00;
     
     ADCON1 = 0x87;
     
     TRISA = 0xC0;
     TRISB = 0x00;
     TRISC = 0b00111011;
     TRISD = 0x00;
     TRISE = 0x00;
     
     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     PORTD = 0x00;
     PORTE = 0x00;
     
     asm clrwdt
     
     Delay_ms(200);
     
     asm clrwdt
     
     LCD_Init();
     Delay_ms(100);
     asm clrwdt
     
     LCD_Cmd(_LCD_CURSOR_OFF);
     LCD_Cmd(_LCD_CLEAR);
     
     LCD_Out(1,1,CopyConst2Ram(msg, msg1));
     DelayXSec(3);
 
     asm clrwdt
     
     PWM1_Init(1500);
     PWM1_Set_Duty(127);
     PWM1_Stop();
     
     asm clrwdt
     
     SetTime();
 
     InitTimer1();
     
     asm clrwdt
     
     LCD_Cmd(_LCD_CLEAR);
     LCD_Out(1,1,CopyConst2Ram(msg, msg2));
     LCD_Out(2,1,CopyConst2Ram(msg, msg3));
     
     while(1) {
     
            asm clrwdt
            
            if(UPDATE_TIME_FLAG_IS_SET) {
                 asm clrwdt
                 
                 if(++currentTime.second == 60) {
                         currentTime.second = 0;
                         if(++currentTime.minute == 60) {
                               currentTime.minute = 0;
                               if(++currentTime.hour == 24) {
                                      currentTime.second = 0;
                                      currentTime.minute = 0;
                                      currentTime.hour = 0;
                               }
                         }
                 }
 
                 asm clrwdt
                 LCD_Chr(1,9,(currentTime.hour / 10) + 48);
                 LCD_Chr(1,10,(currentTime.hour % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,11,':');
                 asm clrwdt
                 LCD_Chr(1,12,(currentTime.minute / 10) + 48);
                 LCD_Chr(1,13,(currentTime.minute % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,14,':');
                 asm clrwdt
                 LCD_Chr(1,15,(currentTime.second / 10) + 48);
                 LCD_Chr(1,16,(currentTime.second % 10) + 48);
                 asm clrwdt
                 CLEAR_UPDATE_TIME_FLAG
            }
            
            if(MODE_SWITCH_PRESSED) {
                 DebounceSwitch();
                 while(MODE_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                 
                 modeFlag = ~modeFlag;
                 RD3_bit = modeFlag;
            }
            
            if(MANUAL_MODE) {
                  if(BELL_SWITCH_PRESSED) {
                       DebounceSwitch();
                       while(BELL_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                       
                       manualModeBellFlag = ~manualModeBellFlag;
                  }
                  
                  if(manualModeBellFlag == TRUE) {
                        StartAlarm();
                  }
                  else if(manualModeBellFlag == FALSE) {
                        StopAlarm();
                  }
            }
            else if(AUTO_MODE) {
            
                if(SET_OR_RUN_SWITCH_PRESSED) {
                     DebounceSwitch();
                     while(SET_OR_RUN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                     setOrRunFlag = ~setOrRunFlag;
                }
            
                if(setOrRunFlag == FALSE) {
                
                    if(ALARM_FLAG_IS_NOT_SET) {
                        if((START_OF_CLASSES) || (PERIOD_ONE_OVER) || (PERIOD_TWO_OVER) || (PERIOD_THREE_OVER)
                          || (BREAK_OVER) || (PERIOD_FOUR_OVER) || (PERIOD_FIVE_OVER) || (PERIOD_SIX_OVER)
                          || (PERIOD_SEVEN_OVER)) {
                                      SET_ALARM_FLAG
                                      StartAlarm();
                                      bellCounter++;
                                      if(bellCounter == 9)bellCounter = 0;
                        }
                    }
 
                    switch(bellCounter) {
                          case 0:
                               DisplayNextAlarmTime(startTime);
                               break;
                          case 1:
                               DisplayNextAlarmTime(periodOneEndTime);
                               break;
                          case 2:
                               DisplayNextAlarmTime(periodTwoEndTime);
                               break;
                          case 3:
                               DisplayNextAlarmTime(periodThreeEndTime);
                               break;
                          case 4:
                               DisplayNextAlarmTime(breakEndTime);
                               break;
                          case 5:
                               DisplayNextAlarmTime(periodFourEndTime);
                               break;
                          case 6:
                               DisplayNextAlarmTime(periodFiveEndTime);
                               break;
                          case 7:
                               DisplayNextAlarmTime(periodSixEndTime);
                               break;
                          case 8:
                               DisplayNextAlarmTime(periodSevenEndTime);
                               break;
                    };
                }
                else if(setOrRunFlag == TRUE) {
                    if(HR_OR_MIN_SWITCH_PRESSED) {
                         DebounceSwitch();
                         while(HR_OR_MIN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                         hrOrMinFlag = ~hrOrMinFlag;
                    }
                    
                    if(hrOrMinFlag == FALSE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                              
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
 
                              }
                         }
                    }
                    else if(hrOrMinFlag == TRUE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
 
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
 
                              }
                         }
                    }
                }
            }
     }
}



- - - Updated - - -

Edit

In the below code there is a switch statement commented. With it commented the code compiles in mikroC PRO PIC and shows 65% ROM free but if I uncomment that switch statement and try to compile then it shows not enough ROM space. I have three more similar switch statements and I have checked commenting them and each switch statement doesn't take 65% of ROM. What is the problem ?


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
// Lcd pinout settings
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
 
// Pin direction
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
 
sbit MODE_SWITCH at RC3_bit;
sbit MODE_LED at RD3_bit;
 
sbit SET_OR_RUN at RC4_bit;
sbit HR_OR_MIN at RC5_bit;
sbit INC at RC0_bit;
sbit DEC at RC1_bit;
 
#define SET_OR_RUN_SWITCH_PRESSED (!SET_OR_RUN)
#define SET_OR_RUN_SWITCH_NOT_YET_RELEASED (!SET_OR_RUN)
 
#define HR_OR_MIN_SWITCH_PRESSED (!HR_OR_MIN)
#define HR_OR_MIN_SWITCH_NOT_YET_RELEASED (!HR_OR_MIN)
 
#define INC_SWITCH_PRESSED (!INC)
#define INC_SWITCH_STILL_PRESSED (!INC)
 
#define DEC_SWITCH_PRESSED (!DEC)
#define DEC_SWITCH_STILL_PRESSED (!DEC)
 
#define BELL_SWITCH_PRESSED (!RC4_bit)
#define BELL_SWITCH_NOT_YET_RELEASED (!RC4_bit)
 
struct SCHOOL_TIME {
    signed char second;
    signed char minute;
    signed char hour;
}alarmTime, currentTime, startTime, periodOneEndTime, periodTwoEndTime, periodThreeEndTime, breakEndTime, periodFourEndTime, periodFiveEndTime, periodSixEndTime, periodSevenEndTime;
 
unsigned char myFlags = 0, halfSecondCounter = 0, alarmDelayCounter = 0, bellCounter = 0, setCounter = 0;
char msg[22];
 
const char msg1[] = "School Bell";
const char msg2[] = "Time";
const char msg3[] = "Bell at";
 
sbit updateTimeFlag at myFlags.B0;
sbit modeFlag at myFlags.B1;
sbit alarmFlag at myFlags.B2;
sbit setOrRunFlag at myFlags.B3;
sbit hrOrMinFlag at myFlags.B4;
sbit manualModeBellFlag at myFlags.B5;
 
#define ON 1
#define OFF 0
 
#define ENABLE 1
#define DISABLE 0
 
#define TRUE 1
#define FALSE 0
 
#define SET 1
#define CLEAR 0
 
#define UPDATE_TIME_FLAG_IS_SET (updateTimeFlag == 1)
#define CLEAR_UPDATE_TIME_FLAG {updateTimeFlag = 0;}
 
#define ENABLE_WATCHDOG_TIMER {OPTION_REG = 0xCF;}
 
#define MANUAL_MODE (modeFlag == 0)
#define AUTO_MODE (modeFlag == 1)
 
#define MODE_SWITCH_PRESSED (!RC3_bit)
#define MODE_SWITCH_NOT_YET_RELEASED (!RC3_bit)
 
#define START_OF_CLASSES ((alarmTime.hour == startTime.hour) && (alarmTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((alarmTime.hour == periodOneEndTime.hour) && (alarmTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((alarmTime.hour == periodTwoEndTime.hour) && (alarmTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((alarmTime.hour == periodThreeEndTime.hour) && (alarmTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((alarmTime.hour == breakEndTime.hour) && (alarmTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((alarmTime.hour == periodFourEndTime.hour) && (alarmTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((alarmTime.hour == periodFiveEndTime.hour) && (alarmTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((alarmTime.hour == periodSixEndTime.hour) && (alarmTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((alarmTime.hour == periodSevenEndTime.hour) && (alarmTime.minute == periodSevenEndTime.minute))
 
#define SET_ALARM_FLAG {alarmFlag = 1;}
#define CLEAR_ALARM_FLAG {alarmFlag = 0;}
 
#define ALARM_FLAG_IS_SET (alarmFlag == 1)
#define ALARM_FLAG_IS_NOT_SET (alarmFlag == 0)
 
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
}
 
//copy const to ram string
char *CopyConst2Ram(char *dest, const char *src) {
    char *d;
 
    asm clrwdt
    d = dest;
    for(;*dest++ = *src++;);
    asm clrwdt
    return d;
}
 
void DebounceSwitch() {
    Delay_ms(50);
    asm clrwdt
}
 
void DelayXSec(unsigned char sec) {
    while(sec != 0) {
        Delay_ms(1000);
        asm clrwdt
        sec--;
    }
}
 
void IncDecDelay() {
    Delay_ms(200);
}
 
void StartAlarm() {
    PWM1_Start();
    asm clrwdt
}
 
void StopAlarm() {
    PWM1_Stop();
    asm clrwdt
}
 
void Interrupt() {
    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        //Enter your code here
        if(++halfSecondCounter == 2) {
                halfSecondCounter = 0;
                updateTimeFlag = 1;
        }
        
        if(ALARM_FLAG_IS_SET) {
            ++alarmDelayCounter;
            if(alarmDelayCounter == 20) {
                     StopAlarm();
            }
            else if(alarmDelayCounter == 130) {
                     CLEAR_ALARM_FLAG
                     alarmDelayCounter = 0;
            }
        }
    }
}
 
void SetTime() {
     asm clrwdt
     startTime.second = 0;
     startTime.minute = 0;
     startTime.hour = 8;
     asm clrwdt
     periodOneEndTime.second = 0;
     periodOneEndTime.minute = 40;
     periodOneEndTime.hour = 8;
     asm clrwdt
     periodTwoEndTime.second = 0;
     periodTwoEndTime.minute = 20;
     periodTwoEndTime.hour = 9;
     asm clrwdt
     periodThreeEndTime.second = 0;
     periodThreeEndTime.minute = 0;
     periodThreeEndTime.hour = 10;
     asm clrwdt
     breakEndTime.second = 0;
     breakEndTime.minute = 20;
     breakEndTime.hour = 10;
     asm clrwdt
     periodFourEndTime.second = 0;
     periodFourEndTime.minute = 0;
     periodFourEndTime.hour = 11;
     asm clrwdt
     periodFiveEndTime.second = 0;
     periodFiveEndTime.minute = 40;
     periodFiveEndTime.hour = 11;
     asm clrwdt
     periodSixEndTime.second = 0;
     periodSixEndTime.minute = 20;
     periodSixEndTime.hour = 12;
     asm clrwdt
     periodSevenEndTime.second = 0;
     periodSevenEndTime.minute = 0;
     periodSevenEndTime.hour = 13;
     asm clrwdt
}
 
void DisplayNextAlarmTime(struct SCHOOL_TIME nextAlarmTime) {
     asm clrwdt
     LCD_Chr(2,9,(nextAlarmTime.hour / 10) + 48);
     LCD_Chr(2,10,(nextAlarmTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(nextAlarmTime.minute / 10) + 48);
     LCD_Chr(2,13,(nextAlarmTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(nextAlarmTime.second / 10) + 48);
     LCD_Chr(2,16,(nextAlarmTime.second % 10) + 48);
     asm clrwdt
}
 
void DisplayAlarmTimeBeingSet(struct SCHOOL_TIME timeBeingSet) {
     asm clrwdt
     LCD_Chr(2,9,(timeBeingSet.hour / 10) + 48);
     LCD_Chr(2,10,(timeBeingSet.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(timeBeingSet.minute / 10) + 48);
     LCD_Chr(2,13,(timeBeingSet.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(timeBeingSet.second / 10) + 48);
     LCD_Chr(2,16,(timeBeingSet.second % 10) + 48);
     asm clrwdt
}
 
void main() {
 
     ENABLE_WATCHDOG_TIMER
     
     asm clrwdt
     
     CMCON = 0x07;
     CVRCON = 0x00;
     
     ADCON1 = 0x87;
     
     TRISA = 0xC0;
     TRISB = 0x00;
     TRISC = 0b00111011;
     TRISD = 0x00;
     TRISE = 0x00;
     
     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     PORTD = 0x00;
     PORTE = 0x00;
     
     asm clrwdt
     
     Delay_ms(200);
     
     asm clrwdt
     
     LCD_Init();
     Delay_ms(100);
     asm clrwdt
     
     LCD_Cmd(_LCD_CURSOR_OFF);
     LCD_Cmd(_LCD_CLEAR);
     
     LCD_Out(1,1,CopyConst2Ram(msg, msg1));
     DelayXSec(3);
 
     asm clrwdt
     
     PWM1_Init(1500);
     PWM1_Set_Duty(127);
     PWM1_Stop();
     
     asm clrwdt
     
     SetTime();
 
     InitTimer1();
     
     asm clrwdt
     
     LCD_Cmd(_LCD_CLEAR);
     LCD_Out(1,1,CopyConst2Ram(msg, msg2));
     LCD_Out(2,1,CopyConst2Ram(msg, msg3));
     
     while(1) {
     
            asm clrwdt
            
            if(UPDATE_TIME_FLAG_IS_SET) {
                 asm clrwdt
                 
                 if(++currentTime.second == 60) {
                         currentTime.second = 0;
                         if(++currentTime.minute == 60) {
                               currentTime.minute = 0;
                               if(++currentTime.hour == 24) {
                                      currentTime.second = 0;
                                      currentTime.minute = 0;
                                      currentTime.hour = 0;
                               }
                         }
                 }
 
                 asm clrwdt
                 LCD_Chr(1,9,(currentTime.hour / 10) + 48);
                 LCD_Chr(1,10,(currentTime.hour % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,11,':');
                 asm clrwdt
                 LCD_Chr(1,12,(currentTime.minute / 10) + 48);
                 LCD_Chr(1,13,(currentTime.minute % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,14,':');
                 asm clrwdt
                 LCD_Chr(1,15,(currentTime.second / 10) + 48);
                 LCD_Chr(1,16,(currentTime.second % 10) + 48);
                 asm clrwdt
                 CLEAR_UPDATE_TIME_FLAG
            }
            
            if(MODE_SWITCH_PRESSED) {
                 DebounceSwitch();
                 while(MODE_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                 
                 modeFlag = ~modeFlag;
                 MODE_LED = modeFlag;
            }
            
            if(MANUAL_MODE) {
                  if(BELL_SWITCH_PRESSED) {
                       DebounceSwitch();
                       while(BELL_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                       
                       manualModeBellFlag = ~manualModeBellFlag;
                  }
                  
                  if(manualModeBellFlag == TRUE) {
                        StartAlarm();
                  }
                  else if(manualModeBellFlag == FALSE) {
                        StopAlarm();
                  }
            }
            else if(AUTO_MODE) {
            
                if(SET_OR_RUN_SWITCH_PRESSED) {
                     DebounceSwitch();
                     while(SET_OR_RUN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                     setCounter++;
                     
                     if(setCounter == 10) {
                           setCounter = 0;
                           setOrRunFlag = 0;
                     }
                     else setOrRunFlag = 1;
                }
            
                if(setOrRunFlag == FALSE) {
                
                    if(ALARM_FLAG_IS_NOT_SET) {
                        if((START_OF_CLASSES) || (PERIOD_ONE_OVER) || (PERIOD_TWO_OVER) || (PERIOD_THREE_OVER)
                          || (BREAK_OVER) || (PERIOD_FOUR_OVER) || (PERIOD_FIVE_OVER) || (PERIOD_SIX_OVER)
                          || (PERIOD_SEVEN_OVER)) {
                                      SET_ALARM_FLAG
                                      StartAlarm();
                                      bellCounter++;
                                      if(bellCounter == 9)bellCounter = 0;
                        }
                    }
 
                    switch(bellCounter) {
                          case 0:
                               DisplayNextAlarmTime(startTime);
                               break;
                          case 1:
                               DisplayNextAlarmTime(periodOneEndTime);
                               break;
                          case 2:
                               DisplayNextAlarmTime(periodTwoEndTime);
                               break;
                          case 3:
                               DisplayNextAlarmTime(periodThreeEndTime);
                               break;
                          case 4:
                               DisplayNextAlarmTime(breakEndTime);
                               break;
                          case 5:
                               DisplayNextAlarmTime(periodFourEndTime);
                               break;
                          case 6:
                               DisplayNextAlarmTime(periodFiveEndTime);
                               break;
                          case 7:
                               DisplayNextAlarmTime(periodSixEndTime);
                               break;
                          case 8:
                               DisplayNextAlarmTime(periodSevenEndTime);
                               break;
                    };
                }
                else if(setOrRunFlag == TRUE) {
                    if(HR_OR_MIN_SWITCH_PRESSED) {
                         DebounceSwitch();
                         while(HR_OR_MIN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                         hrOrMinFlag = ~hrOrMinFlag;
                    }
 
                    if(hrOrMinFlag == FALSE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    switch(setCounter) {
                                          case 1:
                                                if(++startTime.minute > 60)startTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(++periodOneEndTime.minute > 60)periodOneEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(++periodTwoEndTime.minute > 60)periodTwoEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(++periodThreeEndTime.minute > 60)periodThreeEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(++breakEndTime.minute > 60)breakEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(++periodFourEndTime.minute > 60)periodFourEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(++periodFiveEndTime.minute > 60)periodFiveEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(++periodSixEndTime.minute > 60)periodSixEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(++periodSevenEndTime.minute > 60)periodSevenEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                    };
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    switch(setCounter) {
                                          case 1:
                                                if(--startTime.minute < 0)startTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(--periodOneEndTime.minute < 0)periodOneEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(--periodTwoEndTime.minute < 0)periodTwoEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(--periodThreeEndTime.minute < 0)periodThreeEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(--breakEndTime.minute < 0)breakEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(--periodFourEndTime.minute < 0)periodFourEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(--periodFiveEndTime.minute < 0)periodFiveEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(--periodSixEndTime.minute < 0)periodSixEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(--periodSevenEndTime.minute < 0)periodSevenEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                    };
                              }
                         }
                    }
                    else if(hrOrMinFlag == TRUE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   switch(setCounter) {
                                          case 1:
                                                if(++startTime.hour > 24)startTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(++periodOneEndTime.hour > 24)periodOneEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(++periodTwoEndTime.hour > 24)periodTwoEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(++periodThreeEndTime.hour > 24)periodThreeEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(++breakEndTime.hour > 24)breakEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(++periodFourEndTime.hour > 24)periodFourEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(++periodFiveEndTime.hour > 24)periodFiveEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(++periodSixEndTime.hour > 24)periodSixEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(++periodSevenEndTime.hour > 24)periodSevenEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                   };
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   /*switch(setCounter) {
                                          case 1:
                                                if(--startTime.hour < 0)startTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(--periodOneEndTime.hour < 0)periodOneEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(--periodTwoEndTime.hour < 0)periodTwoEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(--periodThreeEndTime.hour < 0)periodThreeEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(--breakEndTime.hour < 0)breakEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(--periodFourEndTime.hour < 0)periodFourEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(--periodFiveEndTime.hour < 0)periodFiveEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(--periodSixEndTime.hour < 0)periodSixEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(--periodSevenEndTime.hour < 0)periodSevenEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                   };*/
                              }
                         }
                    }
                }
            }
     }
}

 

Attachments

  • School Bell rev2.png
    School Bell rev2.png
    73.3 KB · Views: 74

In the below code there is a switch statement commented. With it commented the code compiles in mikroC PRO PIC and shows 65% ROM free but if I uncomment that switch statement and try to compile then it shows not enough ROM space. I have three more similar switch statements and I have checked commenting them and each switch statement doesn't take 65% of ROM. What is the problem ?


You have a huge function (main) that the compiled size exceeds it's maximum limits.
Of course a real useful compiler could handle this, but here we are talking about microC :wink:

You should write smaller self explained functions so you (and others) can understand and use the code...

Just a split in your version of main, so it is "compilable":

Code:
// Lcd pinout settings
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;

sbit MODE_SWITCH at RC3_bit;
sbit MODE_LED at RD3_bit;

sbit SET_OR_RUN at RC4_bit;
sbit HR_OR_MIN at RC5_bit;
sbit INC at RC0_bit;
sbit DEC at RC1_bit;

#define SET_OR_RUN_SWITCH_PRESSED (!SET_OR_RUN)
#define SET_OR_RUN_SWITCH_NOT_YET_RELEASED (!SET_OR_RUN)

#define HR_OR_MIN_SWITCH_PRESSED (!HR_OR_MIN)
#define HR_OR_MIN_SWITCH_NOT_YET_RELEASED (!HR_OR_MIN)

#define INC_SWITCH_PRESSED (!INC)
#define INC_SWITCH_STILL_PRESSED (!INC)

#define DEC_SWITCH_PRESSED (!DEC)
#define DEC_SWITCH_STILL_PRESSED (!DEC)

#define BELL_SWITCH_PRESSED (!RC4_bit)
#define BELL_SWITCH_NOT_YET_RELEASED (!RC4_bit)

struct SCHOOL_TIME {
    signed char second;
    signed char minute;
    signed char hour;
}alarmTime, currentTime, startTime, periodOneEndTime, periodTwoEndTime, periodThreeEndTime, breakEndTime, periodFourEndTime, periodFiveEndTime, periodSixEndTime, periodSevenEndTime;

unsigned char myFlags = 0, halfSecondCounter = 0, alarmDelayCounter = 0, bellCounter = 0, setCounter = 0;
char msg[22];

const char msg1[] = "School Bell";
const char msg2[] = "Time";
const char msg3[] = "Bell at";

sbit updateTimeFlag at myFlags.B0;
sbit modeFlag at myFlags.B1;
sbit alarmFlag at myFlags.B2;
sbit setOrRunFlag at myFlags.B3;
sbit hrOrMinFlag at myFlags.B4;
sbit manualModeBellFlag at myFlags.B5;

#define ON 1
#define OFF 0

#define ENABLE 1
#define DISABLE 0

#define TRUE 1
#define FALSE 0

#define SET 1
#define CLEAR 0

#define UPDATE_TIME_FLAG_IS_SET (updateTimeFlag == 1)
#define CLEAR_UPDATE_TIME_FLAG {updateTimeFlag = 0;}

#define ENABLE_WATCHDOG_TIMER {OPTION_REG = 0xCF;}

#define MANUAL_MODE (modeFlag == 0)
#define AUTO_MODE (modeFlag == 1)

#define MODE_SWITCH_PRESSED (!RC3_bit)
#define MODE_SWITCH_NOT_YET_RELEASED (!RC3_bit)

#define START_OF_CLASSES ((alarmTime.hour == startTime.hour) && (alarmTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((alarmTime.hour == periodOneEndTime.hour) && (alarmTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((alarmTime.hour == periodTwoEndTime.hour) && (alarmTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((alarmTime.hour == periodThreeEndTime.hour) && (alarmTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((alarmTime.hour == breakEndTime.hour) && (alarmTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((alarmTime.hour == periodFourEndTime.hour) && (alarmTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((alarmTime.hour == periodFiveEndTime.hour) && (alarmTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((alarmTime.hour == periodSixEndTime.hour) && (alarmTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((alarmTime.hour == periodSevenEndTime.hour) && (alarmTime.minute == periodSevenEndTime.minute))

#define SET_ALARM_FLAG {alarmFlag = 1;}
#define CLEAR_ALARM_FLAG {alarmFlag = 0;}

#define ALARM_FLAG_IS_SET (alarmFlag == 1)
#define ALARM_FLAG_IS_NOT_SET (alarmFlag == 0)

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
}

//copy const to ram string
char *CopyConst2Ram(char *dest, const char *src) {
    char *d;

    asm clrwdt
    d = dest;
    for(;*dest++ = *src++;);
    asm clrwdt
    return d;
}

void DebounceSwitch() {
    Delay_ms(50);
    asm clrwdt
}

void DelayXSec(unsigned char sec) {
    while(sec != 0) {
        Delay_ms(1000);
        asm clrwdt
        sec--;
    }
}

void IncDecDelay() {
    Delay_ms(200);
}

void StartAlarm() {
    PWM1_Start();
    asm clrwdt
}

void StopAlarm() {
    PWM1_Stop();
    asm clrwdt
}

void Interrupt() {
    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        //Enter your code here
        if(++halfSecondCounter == 2) {
                halfSecondCounter = 0;
                updateTimeFlag = 1;
        }

        if(ALARM_FLAG_IS_SET) {
            ++alarmDelayCounter;
            if(alarmDelayCounter == 20) {
                     StopAlarm();
            }
            else if(alarmDelayCounter == 130) {
                     CLEAR_ALARM_FLAG
                     alarmDelayCounter = 0;
            }
        }
    }
}

void SetTime() {
     asm clrwdt
     startTime.second = 0;
     startTime.minute = 0;
     startTime.hour = 8;
     asm clrwdt
     periodOneEndTime.second = 0;
     periodOneEndTime.minute = 40;
     periodOneEndTime.hour = 8;
     asm clrwdt
     periodTwoEndTime.second = 0;
     periodTwoEndTime.minute = 20;
     periodTwoEndTime.hour = 9;
     asm clrwdt
     periodThreeEndTime.second = 0;
     periodThreeEndTime.minute = 0;
     periodThreeEndTime.hour = 10;
     asm clrwdt
     breakEndTime.second = 0;
     breakEndTime.minute = 20;
     breakEndTime.hour = 10;
     asm clrwdt
     periodFourEndTime.second = 0;
     periodFourEndTime.minute = 0;
     periodFourEndTime.hour = 11;
     asm clrwdt
     periodFiveEndTime.second = 0;
     periodFiveEndTime.minute = 40;
     periodFiveEndTime.hour = 11;
     asm clrwdt
     periodSixEndTime.second = 0;
     periodSixEndTime.minute = 20;
     periodSixEndTime.hour = 12;
     asm clrwdt
     periodSevenEndTime.second = 0;
     periodSevenEndTime.minute = 0;
     periodSevenEndTime.hour = 13;
     asm clrwdt
}

void DisplayNextAlarmTime(struct SCHOOL_TIME nextAlarmTime) {
     asm clrwdt
     LCD_Chr(2,9,(nextAlarmTime.hour / 10) + 48);
     LCD_Chr(2,10,(nextAlarmTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(nextAlarmTime.minute / 10) + 48);
     LCD_Chr(2,13,(nextAlarmTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(nextAlarmTime.second / 10) + 48);
     LCD_Chr(2,16,(nextAlarmTime.second % 10) + 48);
     asm clrwdt
}

void DisplayAlarmTimeBeingSet(struct SCHOOL_TIME timeBeingSet) {
     asm clrwdt
     LCD_Chr(2,9,(timeBeingSet.hour / 10) + 48);
     LCD_Chr(2,10,(timeBeingSet.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(timeBeingSet.minute / 10) + 48);
     LCD_Chr(2,13,(timeBeingSet.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(timeBeingSet.second / 10) + 48);
     LCD_Chr(2,16,(timeBeingSet.second % 10) + 48);
     asm clrwdt
}

void dec111(void);

void main() {

     ENABLE_WATCHDOG_TIMER

     asm clrwdt

     CMCON = 0x07;
     CVRCON = 0x00;

     ADCON1 = 0x87;

     TRISA = 0xC0;
     TRISB = 0x00;
     TRISC = 0b00111011;
     TRISD = 0x00;
     TRISE = 0x00;

     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     PORTD = 0x00;
     PORTE = 0x00;

     asm clrwdt

     Delay_ms(200);

     asm clrwdt

     LCD_Init();
     Delay_ms(100);
     asm clrwdt

     LCD_Cmd(_LCD_CURSOR_OFF);
     LCD_Cmd(_LCD_CLEAR);

     LCD_Out(1,1,CopyConst2Ram(msg, msg1));
     DelayXSec(3);

     asm clrwdt

     PWM1_Init(1500);
     PWM1_Set_Duty(127);
     PWM1_Stop();

     asm clrwdt

     SetTime();

     InitTimer1();

     asm clrwdt

     LCD_Cmd(_LCD_CLEAR);
     LCD_Out(1,1,CopyConst2Ram(msg, msg2));
     LCD_Out(2,1,CopyConst2Ram(msg, msg3));

     while(1) {

            asm clrwdt

            if(UPDATE_TIME_FLAG_IS_SET) {
                 asm clrwdt

                 if(++currentTime.second == 60) {
                         currentTime.second = 0;
                         if(++currentTime.minute == 60) {
                               currentTime.minute = 0;
                               if(++currentTime.hour == 24) {
                                      currentTime.second = 0;
                                      currentTime.minute = 0;
                                      currentTime.hour = 0;
                               }
                         }
                 }

                 asm clrwdt
                 LCD_Chr(1,9,(currentTime.hour / 10) + 48);
                 LCD_Chr(1,10,(currentTime.hour % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,11,':');
                 asm clrwdt
                 LCD_Chr(1,12,(currentTime.minute / 10) + 48);
                 LCD_Chr(1,13,(currentTime.minute % 10) + 48);
                 asm clrwdt
                 LCD_Chr(1,14,':');
                 asm clrwdt
                 LCD_Chr(1,15,(currentTime.second / 10) + 48);
                 LCD_Chr(1,16,(currentTime.second % 10) + 48);
                 asm clrwdt
                 CLEAR_UPDATE_TIME_FLAG
            }

            if(MODE_SWITCH_PRESSED) {
                 DebounceSwitch();
                 while(MODE_SWITCH_NOT_YET_RELEASED)asm clrwdt;

                 modeFlag = ~modeFlag;
                 MODE_LED = modeFlag;
            }

            if(MANUAL_MODE) {
                  if(BELL_SWITCH_PRESSED) {
                       DebounceSwitch();
                       while(BELL_SWITCH_NOT_YET_RELEASED)asm clrwdt;

                       manualModeBellFlag = ~manualModeBellFlag;
                  }

                  if(manualModeBellFlag == TRUE) {
                        StartAlarm();
                  }
                  else if(manualModeBellFlag == FALSE) {
                        StopAlarm();
                  }
            }
            else if(AUTO_MODE) {

                if(SET_OR_RUN_SWITCH_PRESSED) {
                     DebounceSwitch();
                     while(SET_OR_RUN_SWITCH_NOT_YET_RELEASED)asm clrwdt;

                     setCounter++;

                     if(setCounter == 10) {
                           setCounter = 0;
                           setOrRunFlag = 0;
                     }
                     else setOrRunFlag = 1;
                }

                if(setOrRunFlag == FALSE) {

                    if(ALARM_FLAG_IS_NOT_SET) {
                        if((START_OF_CLASSES) || (PERIOD_ONE_OVER) || (PERIOD_TWO_OVER) || (PERIOD_THREE_OVER)
                          || (BREAK_OVER) || (PERIOD_FOUR_OVER) || (PERIOD_FIVE_OVER) || (PERIOD_SIX_OVER)
                          || (PERIOD_SEVEN_OVER)) {
                                      SET_ALARM_FLAG
                                      StartAlarm();
                                      bellCounter++;
                                      if(bellCounter == 9)bellCounter = 0;
                        }
                    }

                    switch(bellCounter) {
                          case 0:
                               DisplayNextAlarmTime(startTime);
                               break;
                          case 1:
                               DisplayNextAlarmTime(periodOneEndTime);
                               break;
                          case 2:
                               DisplayNextAlarmTime(periodTwoEndTime);
                               break;
                          case 3:
                               DisplayNextAlarmTime(periodThreeEndTime);
                               break;
                          case 4:
                               DisplayNextAlarmTime(breakEndTime);
                               break;
                          case 5:
                               DisplayNextAlarmTime(periodFourEndTime);
                               break;
                          case 6:
                               DisplayNextAlarmTime(periodFiveEndTime);
                               break;
                          case 7:
                               DisplayNextAlarmTime(periodSixEndTime);
                               break;
                          case 8:
                               DisplayNextAlarmTime(periodSevenEndTime);
                               break;
                    };
                }
                else if(setOrRunFlag == TRUE) {
                    if(HR_OR_MIN_SWITCH_PRESSED) {
                         DebounceSwitch();
                         while(HR_OR_MIN_SWITCH_NOT_YET_RELEASED)asm clrwdt;

                         hrOrMinFlag = ~hrOrMinFlag;
                    }

                    if(hrOrMinFlag == FALSE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    switch(setCounter) {
                                          case 1:
                                                if(++startTime.minute > 60)startTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(++periodOneEndTime.minute > 60)periodOneEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(++periodTwoEndTime.minute > 60)periodTwoEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(++periodThreeEndTime.minute > 60)periodThreeEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(++breakEndTime.minute > 60)breakEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(++periodFourEndTime.minute > 60)periodFourEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(++periodFiveEndTime.minute > 60)periodFiveEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(++periodSixEndTime.minute > 60)periodSixEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(++periodSevenEndTime.minute > 60)periodSevenEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                    };
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    switch(setCounter) {
                                          case 1:
                                                if(--startTime.minute < 0)startTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(--periodOneEndTime.minute < 0)periodOneEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(--periodTwoEndTime.minute < 0)periodTwoEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(--periodThreeEndTime.minute < 0)periodThreeEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(--breakEndTime.minute < 0)breakEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(--periodFourEndTime.minute < 0)periodFourEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(--periodFiveEndTime.minute < 0)periodFiveEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(--periodSixEndTime.minute < 0)periodSixEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(--periodSevenEndTime.minute < 0)periodSevenEndTime.minute = 60;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                    };
                              }
                         }
                    }
                    else if(hrOrMinFlag == TRUE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   switch(setCounter) {
                                          case 1:
                                                if(++startTime.hour > 24)startTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(++periodOneEndTime.hour > 24)periodOneEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(++periodTwoEndTime.hour > 24)periodTwoEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(++periodThreeEndTime.hour > 24)periodThreeEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(++breakEndTime.hour > 24)breakEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(++periodFourEndTime.hour > 24)periodFourEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(++periodFiveEndTime.hour > 24)periodFiveEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(++periodSixEndTime.hour > 24)periodSixEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(++periodSevenEndTime.hour > 24)periodSevenEndTime.minute = 0;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                   };
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              dec111();
                         }
                    }
                }
            }
     }
}

void dec111(void){
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   /* */
                                   switch(setCounter) {
                                          case 1:
                                                if(--startTime.hour < 0)startTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(startTime);
                                                break;
                                          case 2:
                                                if(--periodOneEndTime.hour < 0)periodOneEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                                                break;
                                          case 3:
                                                if(--periodTwoEndTime.hour < 0)periodTwoEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                                                break;
                                          case 4:
                                                if(--periodThreeEndTime.hour < 0)periodThreeEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                                                break;
                                          case 5:
                                                if(--breakEndTime.hour < 0)breakEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(breakEndTime);
                                                break;
                                          case 6:
                                                if(--periodFourEndTime.hour < 0)periodFourEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                                                break;
                                          case 7:
                                                if(--periodFiveEndTime.hour < 0)periodFiveEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                                                break;
                                          case 8:
                                                if(--periodSixEndTime.hour < 0)periodSixEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                                                break;
                                          case 9:
                                                if(--periodSevenEndTime.hour < 0)periodSevenEndTime.minute = 24;
                                                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                                                break;
                                   };
                                   /* */
                              }
}

and the result:

Code:
0 1144 Used ROM (program words): 3193 (39%)  Free ROM (program words): 4999 (61%) Used ROM (program words): 3193 (39%)  Free ROM (program words): 4999 (61%)

- - - Updated - - -

You could use this as a guideline:
https://www.kernel.org/doc/Documentation/CodingStyle
I couldn't agree more with the authors!
 
@xenos

That solved the problem.

@jean12

The coding is almost complete. I have to add a few more messages for LCD so that you know which time you are setting. I will post the completed code tomorrow. Try the attached code in Proteus or hardware. Eeprom is used to store the different times so that if PIC resets due to some reason then the system will remember the alarm times.
 

Attachments

  • School Bell almost complete.rar
    30.9 KB · Views: 65

Here is the completed code.

If you press Auto / Manual button the mode toggle. When it is Auto mode the Auto / Manual LED will be ON. In Auto mode you can press SET / RUN / BELL button to toggle between SET and RUN modes. IN SET mode you can set alarm times and in Run mode the system will run. When in manual mode the SET / RUN / BELL button is used for BELL. In Auto mode when in SET mode the Hr / Min button is used to select hr or min for incrementing or decrementing.

After you enter set mode and come out of it into run mode the alarm times are written to eeprom. So, if PIC resets due to some reason then the alarm times used in auto mode or reloaded from eeprom.

I have not tested it. Test it and reply.

- - - Updated - - -

Edit

There was a serious mistake in

Code:
DecHr()
DecMin()
IncHr()
IncMin()

functions. I have fixed it. Use rev1 file.

- - - Updated - - -

Fixed this piece of code

Code:
#define START_OF_CLASSES ((currentTime.hour == startTime.hour) && (currentTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((currentTime.hour == periodOneEndTime.hour) && (currentTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((currentTime.hour == periodTwoEndTime.hour) && (currentTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((currentTime.hour == periodThreeEndTime.hour) && (currentTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((currentTime.hour == breakEndTime.hour) && (currentTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((currentTime.hour == periodFourEndTime.hour) && (currentTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((currentTime.hour == periodFiveEndTime.hour) && (currentTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((currentTime.hour == periodSixEndTime.hour) && (currentTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((currentTime.hour == periodSevenEndTime.hour) && (currentTime.minute == periodSevenEndTime.minute))

and fixed a small issue. The LCD was displaying time from 1 sec and initially it was taking 1 sec to display current time. Now it displays from 00:00:00 and instantly on startup.

Use rev2 file.

Current Time is not saved in eeprom. It has to be saved because if PIC resets then current time becomes 00:00:00 and this will give wrong reading. I will implement that code after you test rev2 file in hardware.
 

Attachments

  • School Bell.rar
    48.6 KB · Views: 61
  • School Bell rev1.rar
    49.3 KB · Views: 60
  • School Bell rev2.rar
    49.6 KB · Views: 71

Hello,are the code above working perfectly??
Thx
 

Use the circuit posted in post #21. Use rev2 file posted in post #24. Discard all other files. Current time (hour and minute) has to be written to eeprom atleast once every minute so that if PIC resets the current time is read from eeprom. Still it can cause a lag in time. For better working you have to use RTC like shown in attached image. If you are willing to use RTC and I2C LCD then I will make a code for you for the attached circuit.

Edit

Update project attached. Use rev3 file. Option to set current time is added. You can set current time if it lags or leads.
 

Attachments

  • school bell.png
    school bell.png
    88.8 KB · Views: 83
  • School Bell rev3.rar
    50.1 KB · Views: 79
Last edited:
Try this new code. I have fixed a bug. When Bell rang and stopped the display was not displaying the next alarm time. I have fixed it. Now after bell rings, next bell time is shown on the display. You need to test more and see if there are any other bugs.


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
// Lcd pinout settings
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
 
// Pin direction
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
 
sbit MODE_SWITCH at RC3_bit;
sbit MODE_LED at RD3_bit;
 
sbit BELL at RC7_bit;
 
sbit SET_OR_RUN at RC4_bit;
sbit HR_OR_MIN at RC5_bit;
sbit INC at RC0_bit;
sbit DEC at RC1_bit;
 
#define SET_OR_RUN_SWITCH_PRESSED (!SET_OR_RUN)
#define SET_OR_RUN_SWITCH_NOT_YET_RELEASED (!SET_OR_RUN)
 
#define HR_OR_MIN_SWITCH_PRESSED (!HR_OR_MIN)
#define HR_OR_MIN_SWITCH_NOT_YET_RELEASED (!HR_OR_MIN)
 
#define INC_SWITCH_PRESSED (!INC)
#define INC_SWITCH_STILL_PRESSED (!INC)
 
#define DEC_SWITCH_PRESSED (!DEC)
#define DEC_SWITCH_STILL_PRESSED (!DEC)
 
#define BELL_SWITCH_PRESSED (!RC4_bit)
#define BELL_SWITCH_NOT_YET_RELEASED (!RC4_bit)
 
struct SCHOOL_TIME {
    signed char second;
    signed char minute;
    signed char hour;
}alarmTime, currentTime, startTime, periodOneEndTime, periodTwoEndTime, periodThreeEndTime, breakEndTime, periodFourEndTime, periodFiveEndTime, periodSixEndTime, periodSevenEndTime;
 
unsigned char myFlags = 0, halfSecondCounter = 0, alarmDelayCounter = 0, bellCounter = 0, setCounter = 0;
char msg[22];
 
const char msg1[] = "School Bell";
const char msg2[] = "Time";
const char msg3[] = "Bell at";
 
const char msg4[] = "Alarm 1";
const char msg5[] = "Alarm 2";
const char msg6[] = "Alarm 3";
const char msg7[] = "Alarm 4";
const char msg8[] = "Alarm 5";
const char msg9[] = "Alarm 6";
const char msgA[] = "Alarm 7";
const char msgB[] = "Alarm 8";
const char msgC[] = "Alarm 9";
const char msgD[] = "Current Time";
 
const char msgE[] = "                ";
 
sbit updateTimeFlag at myFlags.B0;
sbit modeFlag at myFlags.B1;
sbit alarmFlag at myFlags.B2;
sbit setOrRunFlag at myFlags.B3;
sbit hrOrMinFlag at myFlags.B4;
sbit manualModeBellFlag at myFlags.B5;
sbit write2EepromFlag at myFlags.B6;
 
#define ON 1
#define OFF 0
 
#define ENABLE 1
#define DISABLE 0
 
#define TRUE 1
#define FALSE 0
 
#define SET 1
#define CLEAR 0
 
#define UPDATE_TIME_FLAG_IS_SET (updateTimeFlag == 1)
#define CLEAR_UPDATE_TIME_FLAG {updateTimeFlag = 0;}
 
#define ENABLE_WATCHDOG_TIMER {OPTION_REG = 0xCF;}
 
#define MANUAL_MODE (modeFlag == 0)
#define AUTO_MODE (modeFlag == 1)
 
#define MODE_SWITCH_PRESSED (!RC3_bit)
#define MODE_SWITCH_NOT_YET_RELEASED (!RC3_bit)
 
#define START_OF_CLASSES ((currentTime.hour == startTime.hour) && (currentTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((currentTime.hour == periodOneEndTime.hour) && (currentTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((currentTime.hour == periodTwoEndTime.hour) && (currentTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((currentTime.hour == periodThreeEndTime.hour) && (currentTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((currentTime.hour == breakEndTime.hour) && (currentTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((currentTime.hour == periodFourEndTime.hour) && (currentTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((currentTime.hour == periodFiveEndTime.hour) && (currentTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((currentTime.hour == periodSixEndTime.hour) && (currentTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((currentTime.hour == periodSevenEndTime.hour) && (currentTime.minute == periodSevenEndTime.minute))
 
#define SET_ALARM_FLAG {alarmFlag = 1;}
#define CLEAR_ALARM_FLAG {alarmFlag = 0;}
 
#define ALARM_FLAG_IS_SET (alarmFlag == 1)
#define ALARM_FLAG_IS_NOT_SET (alarmFlag == 0)
 
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
}
 
//copy const to ram string
char *CopyConst2Ram(char *dest, const char *src) {
    char *d;
 
    asm clrwdt
    d = dest;
    for(;*dest++ = *src++;);
    asm clrwdt
    return d;
}
 
void DebounceSwitch() {
    Delay_ms(50);
    asm clrwdt
}
 
void DelayXSec(unsigned char sec) {
    while(sec != 0) {
        Delay_ms(1000);
        asm clrwdt
        sec--;
    }
}
 
void IncDecDelay() {
    Delay_ms(200);
}
 
void EepromReadWriteDelay() {
    Delay_ms(20);
}
 
void StartAlarm() {
    PWM1_Start();
    asm clrwdt
}
 
void StopAlarm() {
    PWM1_Stop();
    asm clrwdt
}
 
void Interrupt() {
    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        //Enter your code here
        if(++halfSecondCounter == 2) {
                halfSecondCounter = 0;
                updateTimeFlag = 1;
        }
        
        if(ALARM_FLAG_IS_SET) {
            ++alarmDelayCounter;
            if(alarmDelayCounter == 20) {
                     BELL = OFF;
            }
            else if(alarmDelayCounter == 130) {
                     CLEAR_ALARM_FLAG
                     alarmDelayCounter = 0;
            }
        }
    }
}
 
void SetTime() {
     asm clrwdt
     startTime.second = 0;
     startTime.minute = 0;
     startTime.hour = 8;
     asm clrwdt
     periodOneEndTime.second = 0;
     periodOneEndTime.minute = 40;
     periodOneEndTime.hour = 8;
     asm clrwdt
     periodTwoEndTime.second = 0;
     periodTwoEndTime.minute = 20;
     periodTwoEndTime.hour = 9;
     asm clrwdt
     periodThreeEndTime.second = 0;
     periodThreeEndTime.minute = 0;
     periodThreeEndTime.hour = 10;
     asm clrwdt
     breakEndTime.second = 0;
     breakEndTime.minute = 20;
     breakEndTime.hour = 10;
     asm clrwdt
     periodFourEndTime.second = 0;
     periodFourEndTime.minute = 0;
     periodFourEndTime.hour = 11;
     asm clrwdt
     periodFiveEndTime.second = 0;
     periodFiveEndTime.minute = 40;
     periodFiveEndTime.hour = 11;
     asm clrwdt
     periodSixEndTime.second = 0;
     periodSixEndTime.minute = 20;
     periodSixEndTime.hour = 12;
     asm clrwdt
     periodSevenEndTime.second = 0;
     periodSevenEndTime.minute = 0;
     periodSevenEndTime.hour = 13;
     asm clrwdt
}
 
void DisplayNextAlarmTime(struct SCHOOL_TIME nextAlarmTime) {
     asm clrwdt
     LCD_Chr(2,9,(nextAlarmTime.hour / 10) + 48);
     LCD_Chr(2,10,(nextAlarmTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(nextAlarmTime.minute / 10) + 48);
     LCD_Chr(2,13,(nextAlarmTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(nextAlarmTime.second / 10) + 48);
     LCD_Chr(2,16,(nextAlarmTime.second % 10) + 48);
     asm clrwdt
}
 
void DisplayAlarmTimeBeingSet(struct SCHOOL_TIME timeBeingSet) {
     asm clrwdt
     LCD_Chr(2,9,(timeBeingSet.hour / 10) + 48);
     LCD_Chr(2,10,(timeBeingSet.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(timeBeingSet.minute / 10) + 48);
     LCD_Chr(2,13,(timeBeingSet.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(timeBeingSet.second / 10) + 48);
     LCD_Chr(2,16,(timeBeingSet.second % 10) + 48);
     asm clrwdt
}
 
void DecHr() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(--startTime.hour < 0)startTime.hour = 24;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(--periodOneEndTime.hour < 0)periodOneEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(--periodTwoEndTime.hour < 0)periodTwoEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(--periodThreeEndTime.hour < 0)periodThreeEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(--breakEndTime.hour < 0)breakEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(--periodFourEndTime.hour < 0)periodFourEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(--periodFiveEndTime.hour < 0)periodFiveEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(--periodSixEndTime.hour < 0)periodSixEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(--periodSevenEndTime.hour < 0)periodSevenEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(--currentTime.hour < 0)currentTime.hour = 24;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void DecMin() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(--startTime.minute < 0)startTime.minute = 60;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(--periodOneEndTime.minute < 0)periodOneEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(--periodTwoEndTime.minute < 0)periodTwoEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(--periodThreeEndTime.minute < 0)periodThreeEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(--breakEndTime.minute < 0)breakEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(--periodFourEndTime.minute < 0)periodFourEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(--periodFiveEndTime.minute < 0)periodFiveEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(--periodSixEndTime.minute < 0)periodSixEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(--periodSevenEndTime.minute < 0)periodSevenEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(--currentTime.minute < 0)currentTime.minute = 60;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void IncMin() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(++startTime.minute > 60)startTime.minute = 0;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(++periodOneEndTime.minute > 60)periodOneEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(++periodTwoEndTime.minute > 60)periodTwoEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(++periodThreeEndTime.minute > 60)periodThreeEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(++breakEndTime.minute > 60)breakEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(++periodFourEndTime.minute > 60)periodFourEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(++periodFiveEndTime.minute > 60)periodFiveEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(++periodSixEndTime.minute > 60)periodSixEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(++periodSevenEndTime.minute > 60)periodSevenEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(++currentTime.minute > 60)currentTime.minute = 0;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void IncHr() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(++startTime.hour > 24)startTime.hour = 0;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(++periodOneEndTime.hour > 24)periodOneEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(++periodTwoEndTime.hour > 24)periodTwoEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(++periodThreeEndTime.hour > 24)periodThreeEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(++breakEndTime.hour > 24)breakEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(++periodFourEndTime.hour > 24)periodFourEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(++periodFiveEndTime.hour > 24)periodFiveEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(++periodSixEndTime.hour > 24)periodSixEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(++periodSevenEndTime.hour > 24)periodSevenEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(++currentTime.hour > 24)currentTime.hour = 0;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void TurnOffCursor() {
     LCD_Cmd(_LCD_CURSOR_OFF);
     asm clrwdt
}
 
void TurnOnCursor() {
     LCD_Cmd(0xCD);
     LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     asm clrwdt
}
 
void SetCursorToRequiredPosition() {
     if(hrOrMinFlag == 0) {
          LCD_Cmd(0xCD);
          LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     }
     else if(hrOrMinFlag == 1) {
          LCD_Cmd(0xCA);
          LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     }
     asm clrwdt
}
 
void ChangeDisplayBasedOnSetCounter() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                LCD_Out(1,5,CopyConst2Ram(msg, msg4));
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                LCD_Out(1,5,CopyConst2Ram(msg, msg5));
                DisplayAlarmTimeBeingSet(periodOneEndTime);
                break;
          case 3:
                LCD_Out(1,5,CopyConst2Ram(msg, msg6));
                DisplayAlarmTimeBeingSet(periodTwoEndTime);
                break;
          case 4:
                LCD_Out(1,5,CopyConst2Ram(msg, msg7));
                DisplayAlarmTimeBeingSet(periodThreeEndTime);
                break;
          case 5:
                LCD_Out(1,5,CopyConst2Ram(msg, msg8));
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                LCD_Out(1,5,CopyConst2Ram(msg, msg9));
                DisplayAlarmTimeBeingSet(periodFourEndTime);
                break;
          case 7:
                LCD_Out(1,5,CopyConst2Ram(msg, msgA));
                DisplayAlarmTimeBeingSet(periodFiveEndTime);
                break;
          case 8:
                LCD_Out(1,5,CopyConst2Ram(msg, msgB));
                DisplayAlarmTimeBeingSet(periodSixEndTime);
                break;
          case 9:
                LCD_Out(1,5,CopyConst2Ram(msg, msgC));
                DisplayAlarmTimeBeingSet(periodSevenEndTime);
                break;
          case 10:
                LCD_Out(1,3,CopyConst2Ram(msg, msgD));
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void ChangeDisplayBasedOnBellCounter() {
     asm clrwdt
     switch(bellCounter) {
          case 0:
               DisplayNextAlarmTime(startTime);
               break;
          case 1:
               DisplayNextAlarmTime(periodOneEndTime);
               break;
          case 2:
               DisplayNextAlarmTime(periodTwoEndTime);
               break;
          case 3:
               DisplayNextAlarmTime(periodThreeEndTime);
               break;
          case 4:
               DisplayNextAlarmTime(breakEndTime);
               break;
          case 5:
               DisplayNextAlarmTime(periodFourEndTime);
               break;
          case 6:
               DisplayNextAlarmTime(periodFiveEndTime);
               break;
          case 7:
               DisplayNextAlarmTime(periodSixEndTime);
               break;
          case 8:
               DisplayNextAlarmTime(periodSevenEndTime);
               break;
     };
     asm clrwdt
}
 
void DisplayCurrentTime() {
     asm clrwdt
     LCD_Chr(1,9,(currentTime.hour / 10) + 48);
     LCD_Chr(1,10,(currentTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(1,11,':');
     asm clrwdt
     LCD_Chr(1,12,(currentTime.minute / 10) + 48);
     LCD_Chr(1,13,(currentTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(1,14,':');
     asm clrwdt
     LCD_Chr(1,15,(currentTime.second / 10) + 48);
     LCD_Chr(1,16,(currentTime.second % 10) + 48);
     asm clrwdt
}
 
void main() {
 
     ENABLE_WATCHDOG_TIMER
     
     asm clrwdt
     
     CMCON = 0x07;
     CVRCON = 0x00;
     
     ADCON1 = 0x87;
     
     TRISA = 0xC0;
     TRISB = 0x00;
     TRISC = 0b00111011;
     TRISD = 0x00;
     TRISE = 0x00;
     
     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     PORTD = 0x00;
     PORTE = 0x00;
     
     asm clrwdt
     
     Delay_ms(200);
     
     asm clrwdt
     
     LCD_Init();
     Delay_ms(100);
     asm clrwdt
     
     LCD_Cmd(_LCD_CURSOR_OFF);
     LCD_Cmd(_LCD_CLEAR);
     
     LCD_Out(1,3,CopyConst2Ram(msg, msg1));
     DelayXSec(3);
 
     asm clrwdt
     
     //SetTime();
 
     startTime.hour = EEPROM_Read(0x01);
     EepromReadWriteDelay();
     startTime.minute = EEPROM_Read(0x02);
     EepromReadWriteDelay();
     periodOneEndTime.hour = EEPROM_Read(0x03);
     EepromReadWriteDelay();
     asm clrwdt
     periodOneEndTime.minute = EEPROM_Read(0x04);
     EepromReadWriteDelay();
     periodTwoEndTime.hour = EEPROM_Read(0x05);
     EepromReadWriteDelay();
     periodTwoEndTime.minute = EEPROM_Read(0x06);
     EepromReadWriteDelay();
     asm clrwdt
     periodThreeEndTime.hour = EEPROM_Read(0x07);
     EepromReadWriteDelay();
     periodThreeEndTime.minute = EEPROM_Read(0x08);
     EepromReadWriteDelay();
     breakEndTime.hour = EEPROM_Read(0x09);
     EepromReadWriteDelay();
     asm clrwdt
     breakEndTime.minute = EEPROM_Read(0x0A);
     EepromReadWriteDelay();
     periodFourEndTime.hour = EEPROM_Read(0x0B);
     EepromReadWriteDelay();
     periodFourEndTime.minute = EEPROM_Read(0x0C);
     EepromReadWriteDelay();
     asm clrwdt
     periodFiveEndTime.hour = EEPROM_Read(0x0D);
     EepromReadWriteDelay();
     periodFiveEndTime.minute = EEPROM_Read(0x0E);
     EepromReadWriteDelay();
     periodSixEndTime.hour = EEPROM_Read(0x0F);
     EepromReadWriteDelay();
     asm clrwdt
     periodSixEndTime.minute = EEPROM_Read(0x10);
     EepromReadWriteDelay();
     periodSevenEndTime.hour = EEPROM_Read(0x11);
     EepromReadWriteDelay();
     periodSevenEndTime.minute = EEPROM_Read(0x12);
     EepromReadWriteDelay();
     asm clrwdt
     
     modeFlag = EEPROM_Read(0x15);
     EepromReadWriteDelay();
     
     MODE_LED = modeFlag;
     
     asm clrwdt
     
     InitTimer1();
     
     asm clrwdt
     
     LCD_Cmd(_LCD_CLEAR);
     LCD_Out(1,1,CopyConst2Ram(msg, msg2));
     DisplayCurrentTime();
     
     while(1) {
     
            asm clrwdt
            
            if(UPDATE_TIME_FLAG_IS_SET) {
                 asm clrwdt
                 
                 if(++currentTime.second == 60) {
                         currentTime.second = 0;
                         if(++currentTime.minute == 60) {
                               currentTime.minute = 0;
                               if(++currentTime.hour == 24) {
                                      currentTime.second = 0;
                                      currentTime.minute = 0;
                                      currentTime.hour = 0;
                               }
                         }
                 }
 
                 if(setCounter == 0) {
                     DisplayCurrentTime();
                 }
                 
                 CLEAR_UPDATE_TIME_FLAG
                 
                  asm clrwdt
            }
            
            if(MODE_SWITCH_PRESSED) {
                 DebounceSwitch();
                 while(MODE_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                 
                 modeFlag = ~modeFlag;
                 MODE_LED = modeFlag;
                 EEPROM_Write(0x15, modeFlag);
                 Delay_ms(20);
                 
                  asm clrwdt
            }
            
            if(MANUAL_MODE) {
                  if(BELL_SWITCH_PRESSED) {
                       DebounceSwitch();
                       while(BELL_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                       
                       manualModeBellFlag = ~manualModeBellFlag;
                  }
                  
                  if(manualModeBellFlag == TRUE) {
                        BELL = ON;
                  }
                  else if(manualModeBellFlag == FALSE) {
                        BELL = OFF;
                  }
                  
                   asm clrwdt
            }
            else if(AUTO_MODE) {
            
                asm clrwdt
                
                LCD_Out(2,1,CopyConst2Ram(msg, msg3));
                
                if(SET_OR_RUN_SWITCH_PRESSED) {
                     DebounceSwitch();
                     while(SET_OR_RUN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                     setCounter++;
                     
                     LCD_Out(1,1,CopyConst2Ram(msg, msgE));
                     
                     if(setCounter == 11) {
                           setCounter = 0;
                           setOrRunFlag = FALSE;
                           write2EepromFlag = TRUE;
                           //TurnOffCursor();
                           LCD_Out(1,1,CopyConst2Ram(msg, msg2));
                     }
                     else { 
                          setOrRunFlag = TRUE;
                          //TurnOnCursor();
                          ChangeDisplayBasedOnSetCounter();
                          hrOrMinFlag = FALSE;
                     }
                     
                     asm clrwdt
                }
            
                if(setOrRunFlag == FALSE) {
                
                    asm clrwdt
                    
                    if(ALARM_FLAG_IS_NOT_SET) {
                        if((START_OF_CLASSES) || (PERIOD_ONE_OVER) || (PERIOD_TWO_OVER) || (PERIOD_THREE_OVER)
                          || (BREAK_OVER) || (PERIOD_FOUR_OVER) || (PERIOD_FIVE_OVER) || (PERIOD_SIX_OVER)
                          || (PERIOD_SEVEN_OVER)) {
                                      SET_ALARM_FLAG
                                      BELL = ON;
 
                                      if(START_OF_CLASSES)bellCounter = 1;
                                      else if(PERIOD_ONE_OVER)bellCounter = 2;
                                      else if(PERIOD_TWO_OVER)bellCounter = 3;
                                      else if(PERIOD_THREE_OVER)bellCounter = 4;
                                      else if(BREAK_OVER)bellCounter = 5;
                                      else if(PERIOD_FOUR_OVER)bellCounter = 6;
                                      else if(PERIOD_FIVE_OVER)bellCounter = 7;
                                      else if(PERIOD_SIX_OVER)bellCounter = 8;
                                      else if(PERIOD_SEVEN_OVER)bellCounter = 0;
                        }
                        
                        asm clrwdt
                    }
 
                    ChangeDisplayBasedOnBellCounter();
                }
                else if(setOrRunFlag == TRUE) {
                
                    asm clrwdt
                    
                    if(HR_OR_MIN_SWITCH_PRESSED) {
                         DebounceSwitch();
                         while(HR_OR_MIN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                         hrOrMinFlag = ~hrOrMinFlag;
                         //SetCursorToRequiredPosition();
                    }
 
                    if(hrOrMinFlag == FALSE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    IncMin();
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    DecMin();
                              }
                         }
                         
                         asm clrwdt
                    }
                    else if(hrOrMinFlag == TRUE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   IncHr();
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   DecHr();
                              }
                         }
                         
                         asm clrwdt
                    }
                }
                
                if(write2EepromFlag == TRUE) {
                    asm clrwdt
                    EEPROM_Write(0x01, startTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x02, startTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x03, periodOneEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x04, periodOneEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x05, periodTwoEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x06, periodTwoEndTime.minute);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x07, periodThreeEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x08, periodThreeEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x09, breakEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x0A, breakEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0B, periodFourEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0C, periodFourEndTime.minute);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x0D, periodFiveEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0E, periodFiveEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0F, periodSixEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x10, periodSixEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x11, periodSevenEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x12, periodSevenEndTime.minute);
                    EepromReadWriteDelay();
                    write2EepromFlag = CLEAR;
                    asm clrwdt
                }
            }
     }
}



- - - Updated - - -

Edit:

Try this version of code. When you are in set mode it will show Blinking Cursor at Hr or Min place based on whether you have selected Hr or Min using Hr / Min switch.


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
// Lcd pinout settings
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
 
// Pin direction
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
 
sbit MODE_SWITCH at RC3_bit;
sbit MODE_LED at RD3_bit;
 
sbit BELL at RC7_bit;
 
sbit SET_OR_RUN at RC4_bit;
sbit HR_OR_MIN at RC5_bit;
sbit INC at RC0_bit;
sbit DEC at RC1_bit;
 
#define SET_OR_RUN_SWITCH_PRESSED (!SET_OR_RUN)
#define SET_OR_RUN_SWITCH_NOT_YET_RELEASED (!SET_OR_RUN)
 
#define HR_OR_MIN_SWITCH_PRESSED (!HR_OR_MIN)
#define HR_OR_MIN_SWITCH_NOT_YET_RELEASED (!HR_OR_MIN)
 
#define INC_SWITCH_PRESSED (!INC)
#define INC_SWITCH_STILL_PRESSED (!INC)
 
#define DEC_SWITCH_PRESSED (!DEC)
#define DEC_SWITCH_STILL_PRESSED (!DEC)
 
#define BELL_SWITCH_PRESSED (!RC4_bit)
#define BELL_SWITCH_NOT_YET_RELEASED (!RC4_bit)
 
struct SCHOOL_TIME {
    signed char second;
    signed char minute;
    signed char hour;
}alarmTime, currentTime, startTime, periodOneEndTime, periodTwoEndTime, periodThreeEndTime, breakEndTime, periodFourEndTime, periodFiveEndTime, periodSixEndTime, periodSevenEndTime;
 
unsigned char myFlags = 0, halfSecondCounter = 0, alarmDelayCounter = 0, bellCounter = 0, setCounter = 0;
char msg[22];
 
const char msg1[] = "School Bell";
const char msg2[] = "Time";
const char msg3[] = "Bell at";
 
const char msg4[] = "Alarm 1";
const char msg5[] = "Alarm 2";
const char msg6[] = "Alarm 3";
const char msg7[] = "Alarm 4";
const char msg8[] = "Alarm 5";
const char msg9[] = "Alarm 6";
const char msgA[] = "Alarm 7";
const char msgB[] = "Alarm 8";
const char msgC[] = "Alarm 9";
const char msgD[] = "Current Time";
 
const char msgE[] = "                ";
 
sbit updateTimeFlag at myFlags.B0;
sbit modeFlag at myFlags.B1;
sbit alarmFlag at myFlags.B2;
sbit setOrRunFlag at myFlags.B3;
sbit hrOrMinFlag at myFlags.B4;
sbit manualModeBellFlag at myFlags.B5;
sbit write2EepromFlag at myFlags.B6;
sbit executeOnceFlag at myFlags.B7;
 
#define ON 1
#define OFF 0
 
#define ENABLE 1
#define DISABLE 0
 
#define TRUE 1
#define FALSE 0
 
#define SET 1
#define CLEAR 0
 
#define UPDATE_TIME_FLAG_IS_SET (updateTimeFlag == 1)
#define CLEAR_UPDATE_TIME_FLAG {updateTimeFlag = 0;}
 
#define ENABLE_WATCHDOG_TIMER {OPTION_REG = 0xCF;}
 
#define MANUAL_MODE (modeFlag == 0)
#define AUTO_MODE (modeFlag == 1)
 
#define MODE_SWITCH_PRESSED (!RC3_bit)
#define MODE_SWITCH_NOT_YET_RELEASED (!RC3_bit)
 
#define START_OF_CLASSES ((currentTime.hour == startTime.hour) && (currentTime.minute == startTime.minute))
#define PERIOD_ONE_OVER ((currentTime.hour == periodOneEndTime.hour) && (currentTime.minute == periodOneEndTime.minute))
#define PERIOD_TWO_OVER ((currentTime.hour == periodTwoEndTime.hour) && (currentTime.minute == periodTwoEndTime.minute))
#define PERIOD_THREE_OVER ((currentTime.hour == periodThreeEndTime.hour) && (currentTime.minute == periodThreeEndTime.minute))
#define BREAK_OVER ((currentTime.hour == breakEndTime.hour) && (currentTime.minute == breakEndTime.minute))
#define PERIOD_FOUR_OVER ((currentTime.hour == periodFourEndTime.hour) && (currentTime.minute == periodFourEndTime.minute))
#define PERIOD_FIVE_OVER ((currentTime.hour == periodFiveEndTime.hour) && (currentTime.minute == periodFiveEndTime.minute))
#define PERIOD_SIX_OVER ((currentTime.hour == periodSixEndTime.hour) && (currentTime.minute == periodSixEndTime.minute))
#define PERIOD_SEVEN_OVER ((currentTime.hour == periodSevenEndTime.hour) && (currentTime.minute == periodSevenEndTime.minute))
 
#define SET_ALARM_FLAG {alarmFlag = 1;}
#define CLEAR_ALARM_FLAG {alarmFlag = 0;}
 
#define ALARM_FLAG_IS_SET (alarmFlag == 1)
#define ALARM_FLAG_IS_NOT_SET (alarmFlag == 0)
 
#define EEPROM_WRITE_ERASE_CYCLE 1000000
 
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
}
 
//copy const to ram string
char *CopyConst2Ram(char *dest, const char *src) {
    char *d;
 
    asm clrwdt
    d = dest;
    for(;*dest++ = *src++;);
    asm clrwdt
    return d;
}
 
void DebounceSwitch() {
    Delay_ms(50);
    asm clrwdt
}
 
void DelayXSec(unsigned char sec) {
    while(sec != 0) {
        Delay_ms(1000);
        asm clrwdt
        sec--;
    }
}
 
void IncDecDelay() {
    Delay_ms(200);
}
 
void EepromReadWriteDelay() {
    Delay_ms(20);
}
 
void StartAlarm() {
    PWM1_Start();
    asm clrwdt
}
 
void StopAlarm() {
    PWM1_Stop();
    asm clrwdt
}
 
void Interrupt() {
    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        //Enter your code here
        if(++halfSecondCounter == 2) {
                halfSecondCounter = 0;
                updateTimeFlag = 1;
        }
        
        if(ALARM_FLAG_IS_SET) {
            ++alarmDelayCounter;
            if(alarmDelayCounter == 20) {
                     BELL = OFF;
            }
            else if(alarmDelayCounter == 130) {
                     CLEAR_ALARM_FLAG
                     alarmDelayCounter = 0;
            }
        }
    }
}
 
void SetTime() {
     asm clrwdt
     startTime.second = 0;
     startTime.minute = 0;
     startTime.hour = 8;
     asm clrwdt
     periodOneEndTime.second = 0;
     periodOneEndTime.minute = 40;
     periodOneEndTime.hour = 8;
     asm clrwdt
     periodTwoEndTime.second = 0;
     periodTwoEndTime.minute = 20;
     periodTwoEndTime.hour = 9;
     asm clrwdt
     periodThreeEndTime.second = 0;
     periodThreeEndTime.minute = 0;
     periodThreeEndTime.hour = 10;
     asm clrwdt
     breakEndTime.second = 0;
     breakEndTime.minute = 20;
     breakEndTime.hour = 10;
     asm clrwdt
     periodFourEndTime.second = 0;
     periodFourEndTime.minute = 0;
     periodFourEndTime.hour = 11;
     asm clrwdt
     periodFiveEndTime.second = 0;
     periodFiveEndTime.minute = 40;
     periodFiveEndTime.hour = 11;
     asm clrwdt
     periodSixEndTime.second = 0;
     periodSixEndTime.minute = 20;
     periodSixEndTime.hour = 12;
     asm clrwdt
     periodSevenEndTime.second = 0;
     periodSevenEndTime.minute = 0;
     periodSevenEndTime.hour = 13;
     asm clrwdt
}
 
void DisplayNextAlarmTime(struct SCHOOL_TIME nextAlarmTime) {
     asm clrwdt
     LCD_Chr(2,9,(nextAlarmTime.hour / 10) + 48);
     LCD_Chr(2,10,(nextAlarmTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(nextAlarmTime.minute / 10) + 48);
     LCD_Chr(2,13,(nextAlarmTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(nextAlarmTime.second / 10) + 48);
     LCD_Chr(2,16,(nextAlarmTime.second % 10) + 48);
     asm clrwdt
}
 
void DisplayAlarmTimeBeingSet(struct SCHOOL_TIME timeBeingSet) {
     asm clrwdt
     LCD_Chr(2,9,(timeBeingSet.hour / 10) + 48);
     LCD_Chr(2,10,(timeBeingSet.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(2,11,':');
     asm clrwdt
     LCD_Chr(2,12,(timeBeingSet.minute / 10) + 48);
     LCD_Chr(2,13,(timeBeingSet.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(2,14,':');
     asm clrwdt
     LCD_Chr(2,15,(timeBeingSet.second / 10) + 48);
     LCD_Chr(2,16,(timeBeingSet.second % 10) + 48);
     asm clrwdt
}
 
void DecHr() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(--startTime.hour < 0)startTime.hour = 24;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(--periodOneEndTime.hour < 0)periodOneEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(--periodTwoEndTime.hour < 0)periodTwoEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(--periodThreeEndTime.hour < 0)periodThreeEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(--breakEndTime.hour < 0)breakEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(--periodFourEndTime.hour < 0)periodFourEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(--periodFiveEndTime.hour < 0)periodFiveEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(--periodSixEndTime.hour < 0)periodSixEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(--periodSevenEndTime.hour < 0)periodSevenEndTime.hour = 24;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(--currentTime.hour < 0)currentTime.hour = 24;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void DecMin() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(--startTime.minute < 0)startTime.minute = 60;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(--periodOneEndTime.minute < 0)periodOneEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(--periodTwoEndTime.minute < 0)periodTwoEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(--periodThreeEndTime.minute < 0)periodThreeEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(--breakEndTime.minute < 0)breakEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(--periodFourEndTime.minute < 0)periodFourEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(--periodFiveEndTime.minute < 0)periodFiveEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(--periodSixEndTime.minute < 0)periodSixEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(--periodSevenEndTime.minute < 0)periodSevenEndTime.minute = 60;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(--currentTime.minute < 0)currentTime.minute = 60;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void IncMin() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(++startTime.minute > 60)startTime.minute = 0;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(++periodOneEndTime.minute > 60)periodOneEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(++periodTwoEndTime.minute > 60)periodTwoEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(++periodThreeEndTime.minute > 60)periodThreeEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(++breakEndTime.minute > 60)breakEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(++periodFourEndTime.minute > 60)periodFourEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(++periodFiveEndTime.minute > 60)periodFiveEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(++periodSixEndTime.minute > 60)periodSixEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(++periodSevenEndTime.minute > 60)periodSevenEndTime.minute = 0;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(++currentTime.minute > 60)currentTime.minute = 0;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void IncHr() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                if(++startTime.hour > 24)startTime.hour = 0;
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                if(++periodOneEndTime.hour > 24)periodOneEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodOneEndTime);
                break;
          case 3:
                if(++periodTwoEndTime.hour > 24)periodTwoEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodTwoEndTime);
                break;
          case 4:
                if(++periodThreeEndTime.hour > 24)periodThreeEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodThreeEndTime);
                break;
          case 5:
                if(++breakEndTime.hour > 24)breakEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                if(++periodFourEndTime.hour > 24)periodFourEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodFourEndTime);
                break;
          case 7:
                if(++periodFiveEndTime.hour > 24)periodFiveEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodFiveEndTime);
                break;
          case 8:
                if(++periodSixEndTime.hour > 24)periodSixEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodSixEndTime);
                break;
          case 9:
                if(++periodSevenEndTime.hour > 24)periodSevenEndTime.hour = 0;
                DisplayAlarmTimeBeingSet(PeriodSevenEndTime);
                break;
          case 10:
                if(++currentTime.hour > 24)currentTime.hour = 0;
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void TurnOffCursor() {
     LCD_Cmd(_LCD_CURSOR_OFF);
     asm clrwdt
}
 
void TurnOnCursor() {
     LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     LCD_Cmd(0xCC);
     asm clrwdt
}
 
void SetCursorToRequiredPosition() {
     if(hrOrMinFlag == 0) {
          LCD_Cmd(0xCC);
          LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     }
     else if(hrOrMinFlag == 1) {
          LCD_Cmd(0xC9);
          LCD_Cmd(_LCD_BLINK_CURSOR_ON);
     }
     asm clrwdt
}
 
void ChangeDisplayBasedOnSetCounter() {
     asm clrwdt
     switch(setCounter) {
          case 1:
                LCD_Out(1,5,CopyConst2Ram(msg, msg4));
                DisplayAlarmTimeBeingSet(startTime);
                break;
          case 2:
                LCD_Out(1,5,CopyConst2Ram(msg, msg5));
                DisplayAlarmTimeBeingSet(periodOneEndTime);
                break;
          case 3:
                LCD_Out(1,5,CopyConst2Ram(msg, msg6));
                DisplayAlarmTimeBeingSet(periodTwoEndTime);
                break;
          case 4:
                LCD_Out(1,5,CopyConst2Ram(msg, msg7));
                DisplayAlarmTimeBeingSet(periodThreeEndTime);
                break;
          case 5:
                LCD_Out(1,5,CopyConst2Ram(msg, msg8));
                DisplayAlarmTimeBeingSet(breakEndTime);
                break;
          case 6:
                LCD_Out(1,5,CopyConst2Ram(msg, msg9));
                DisplayAlarmTimeBeingSet(periodFourEndTime);
                break;
          case 7:
                LCD_Out(1,5,CopyConst2Ram(msg, msgA));
                DisplayAlarmTimeBeingSet(periodFiveEndTime);
                break;
          case 8:
                LCD_Out(1,5,CopyConst2Ram(msg, msgB));
                DisplayAlarmTimeBeingSet(periodSixEndTime);
                break;
          case 9:
                LCD_Out(1,5,CopyConst2Ram(msg, msgC));
                DisplayAlarmTimeBeingSet(periodSevenEndTime);
                break;
          case 10:
                LCD_Out(1,3,CopyConst2Ram(msg, msgD));
                DisplayAlarmTimeBeingSet(currentTime);
                break;
     };
     asm clrwdt
}
 
void ChangeDisplayBasedOnBellCounter() {
     asm clrwdt
     switch(bellCounter) {
          case 0:
               DisplayNextAlarmTime(startTime);
               break;
          case 1:
               DisplayNextAlarmTime(periodOneEndTime);
               break;
          case 2:
               DisplayNextAlarmTime(periodTwoEndTime);
               break;
          case 3:
               DisplayNextAlarmTime(periodThreeEndTime);
               break;
          case 4:
               DisplayNextAlarmTime(breakEndTime);
               break;
          case 5:
               DisplayNextAlarmTime(periodFourEndTime);
               break;
          case 6:
               DisplayNextAlarmTime(periodFiveEndTime);
               break;
          case 7:
               DisplayNextAlarmTime(periodSixEndTime);
               break;
          case 8:
               DisplayNextAlarmTime(periodSevenEndTime);
               break;
     };
     asm clrwdt
}
 
void DisplayCurrentTime() {
     asm clrwdt
     LCD_Chr(1,9,(currentTime.hour / 10) + 48);
     LCD_Chr(1,10,(currentTime.hour % 10) + 48);
     asm clrwdt
     LCD_Chr(1,11,':');
     asm clrwdt
     LCD_Chr(1,12,(currentTime.minute / 10) + 48);
     LCD_Chr(1,13,(currentTime.minute % 10) + 48);
     asm clrwdt
     LCD_Chr(1,14,':');
     asm clrwdt
     LCD_Chr(1,15,(currentTime.second / 10) + 48);
     LCD_Chr(1,16,(currentTime.second % 10) + 48);
     asm clrwdt
}
 
void main() {
 
     ENABLE_WATCHDOG_TIMER
     
     asm clrwdt
     
     CMCON = 0x07;
     CVRCON = 0x00;
     
     ADCON1 = 0x87;
     
     TRISA = 0xC0;
     TRISB = 0x00;
     TRISC = 0b00111011;
     TRISD = 0x00;
     TRISE = 0x00;
     
     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     PORTD = 0x00;
     PORTE = 0x00;
     
     asm clrwdt
     
     Delay_ms(200);
     
     asm clrwdt
     
     LCD_Init();
     Delay_ms(100);
     asm clrwdt
     
     LCD_Cmd(_LCD_CURSOR_OFF);
     LCD_Cmd(_LCD_CLEAR);
     
     LCD_Out(1,3,CopyConst2Ram(msg, msg1));
     DelayXSec(3);
 
     asm clrwdt
     
     //SetTime();
 
     startTime.hour = EEPROM_Read(0x01);
     EepromReadWriteDelay();
     startTime.minute = EEPROM_Read(0x02);
     EepromReadWriteDelay();
     periodOneEndTime.hour = EEPROM_Read(0x03);
     EepromReadWriteDelay();
     asm clrwdt
     periodOneEndTime.minute = EEPROM_Read(0x04);
     EepromReadWriteDelay();
     periodTwoEndTime.hour = EEPROM_Read(0x05);
     EepromReadWriteDelay();
     periodTwoEndTime.minute = EEPROM_Read(0x06);
     EepromReadWriteDelay();
     asm clrwdt
     periodThreeEndTime.hour = EEPROM_Read(0x07);
     EepromReadWriteDelay();
     periodThreeEndTime.minute = EEPROM_Read(0x08);
     EepromReadWriteDelay();
     breakEndTime.hour = EEPROM_Read(0x09);
     EepromReadWriteDelay();
     asm clrwdt
     breakEndTime.minute = EEPROM_Read(0x0A);
     EepromReadWriteDelay();
     periodFourEndTime.hour = EEPROM_Read(0x0B);
     EepromReadWriteDelay();
     periodFourEndTime.minute = EEPROM_Read(0x0C);
     EepromReadWriteDelay();
     asm clrwdt
     periodFiveEndTime.hour = EEPROM_Read(0x0D);
     EepromReadWriteDelay();
     periodFiveEndTime.minute = EEPROM_Read(0x0E);
     EepromReadWriteDelay();
     periodSixEndTime.hour = EEPROM_Read(0x0F);
     EepromReadWriteDelay();
     asm clrwdt
     periodSixEndTime.minute = EEPROM_Read(0x10);
     EepromReadWriteDelay();
     periodSevenEndTime.hour = EEPROM_Read(0x11);
     EepromReadWriteDelay();
     periodSevenEndTime.minute = EEPROM_Read(0x12);
     EepromReadWriteDelay();
     asm clrwdt
     
     modeFlag = EEPROM_Read(0x15);
     EepromReadWriteDelay();
     
     MODE_LED = modeFlag;
     
     asm clrwdt
     
     InitTimer1();
     
     asm clrwdt
     
     LCD_Cmd(_LCD_CLEAR);
     LCD_Out(1,1,CopyConst2Ram(msg, msg2));
     DisplayCurrentTime();
     
     while(1) {
     
            asm clrwdt
            
            if(UPDATE_TIME_FLAG_IS_SET) {
                 asm clrwdt
                 
                 if(++currentTime.second == 60) {
                         currentTime.second = 0;
                         if(++currentTime.minute == 60) {
                               currentTime.minute = 0;
                               if(++currentTime.hour == 24) {
                                      currentTime.second = 0;
                                      currentTime.minute = 0;
                                      currentTime.hour = 0;
                               }
                         }
                 }
 
                 if(setCounter == 0) {
                     DisplayCurrentTime();
                 }
                 
                 CLEAR_UPDATE_TIME_FLAG
                 
                  asm clrwdt
            }
            
            if(MODE_SWITCH_PRESSED) {
                 DebounceSwitch();
                 while(MODE_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                 
                 modeFlag = ~modeFlag;
                 MODE_LED = modeFlag;
                 EEPROM_Write(0x15, modeFlag);
                 Delay_ms(20);
                 
                  asm clrwdt
            }
            
            if(MANUAL_MODE) {
                  if(BELL_SWITCH_PRESSED) {
                       DebounceSwitch();
                       while(BELL_SWITCH_NOT_YET_RELEASED)asm clrwdt;
                       
                       manualModeBellFlag = ~manualModeBellFlag;
                  }
                  
                  if(manualModeBellFlag == TRUE) {
                        BELL = ON;
                  }
                  else if(manualModeBellFlag == FALSE) {
                        BELL = OFF;
                  }
                  
                   asm clrwdt
            }
            else if(AUTO_MODE) {
            
                asm clrwdt
                
                if(executeOnceFlag == 0) {
                   LCD_Out(2,1,CopyConst2Ram(msg, msg3));
                   executeOnceFlag = 1;
                }
                
                if(SET_OR_RUN_SWITCH_PRESSED) {
                     DebounceSwitch();
                     while(SET_OR_RUN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                     setCounter++;
                     
                     LCD_Out(1,1,CopyConst2Ram(msg, msgE));
                     executeOnceFlag = 1;
                     
                     if(setCounter == 11) {
                           TurnOffCursor();
                           setCounter = 0;
                           executeOnceFlag = 0;
                           setOrRunFlag = FALSE;
                           write2EepromFlag = TRUE;
                           LCD_Out(1,1,CopyConst2Ram(msg, msg2));
 
                     }
                     else { 
                          setOrRunFlag = TRUE;
                          ChangeDisplayBasedOnSetCounter();
                          TurnOnCursor();
                          hrOrMinFlag = FALSE;
                     }
                     
                     asm clrwdt
                }
            
                if(setOrRunFlag == FALSE) {
                
                    asm clrwdt
                    
                    if(ALARM_FLAG_IS_NOT_SET) {
                        if((START_OF_CLASSES) || (PERIOD_ONE_OVER) || (PERIOD_TWO_OVER) || (PERIOD_THREE_OVER)
                          || (BREAK_OVER) || (PERIOD_FOUR_OVER) || (PERIOD_FIVE_OVER) || (PERIOD_SIX_OVER)
                          || (PERIOD_SEVEN_OVER)) {
                                      SET_ALARM_FLAG
                                      BELL = ON;
 
                                      if(START_OF_CLASSES)bellCounter = 1;
                                      else if(PERIOD_ONE_OVER)bellCounter = 2;
                                      else if(PERIOD_TWO_OVER)bellCounter = 3;
                                      else if(PERIOD_THREE_OVER)bellCounter = 4;
                                      else if(BREAK_OVER)bellCounter = 5;
                                      else if(PERIOD_FOUR_OVER)bellCounter = 6;
                                      else if(PERIOD_FIVE_OVER)bellCounter = 7;
                                      else if(PERIOD_SIX_OVER)bellCounter = 8;
                                      else if(PERIOD_SEVEN_OVER)bellCounter = 0;
                        }
                        
                        asm clrwdt
                    }
 
                    ChangeDisplayBasedOnBellCounter();
                }
                else if(setOrRunFlag == TRUE) {
                
                    asm clrwdt
                    
                    SetCursorToRequiredPosition();
                    
                    if(HR_OR_MIN_SWITCH_PRESSED) {
                         DebounceSwitch();
                         while(HR_OR_MIN_SWITCH_NOT_YET_RELEASED)asm clrwdt;
 
                         hrOrMinFlag = ~hrOrMinFlag;
                    }
 
                    if(hrOrMinFlag == FALSE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    IncMin();
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                    IncDecDelay();
                                    DecMin();
                              }
                         }
                         
                         asm clrwdt
                    }
                    else if(hrOrMinFlag == TRUE) {
                         if(INC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(INC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   IncHr();
                              }
                         }
                         else if(DEC_SWITCH_PRESSED) {
                              DebounceSwitch();
                              if(DEC_SWITCH_STILL_PRESSED) {
                                   IncDecDelay();
                                   DecHr();
                              }
                         }
                         
                         asm clrwdt
                    }
                }
                
                if(write2EepromFlag == TRUE) {
                    asm clrwdt
                    EEPROM_Write(0x01, startTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x02, startTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x03, periodOneEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x04, periodOneEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x05, periodTwoEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x06, periodTwoEndTime.minute);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x07, periodThreeEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x08, periodThreeEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x09, breakEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x0A, breakEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0B, periodFourEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0C, periodFourEndTime.minute);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x0D, periodFiveEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0E, periodFiveEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x0F, periodSixEndTime.hour);
                    EepromReadWriteDelay();
                    asm clrwdt
                    EEPROM_Write(0x10, periodSixEndTime.minute);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x11, periodSevenEndTime.hour);
                    EepromReadWriteDelay();
                    EEPROM_Write(0x12, periodSevenEndTime.minute);
                    EepromReadWriteDelay();
                    write2EepromFlag = CLEAR;
                    asm clrwdt
                }
            }
     }
}

 
Last edited:

Hi guys, I am new and I found this project amazing. So I downloaded the .rar file Version 3 from post 26, but the proteus file couldn't open, a message "PDS.EXE has stopped working" popped up.
Then I decide to redesign the project myself and add the HEX file to the PIC.
Unfortunately when I try to run, my LCD doesn't display anything. I am thinking it's something wrong with the PCF8574 devices, but I can't find the error. I need help. The image file is attached and the coding I did not change yet as I am just using the HEX file from version 3.
And I would like to remove the manual part and stay with the whole system automatic, how can I do it from the already existing schematic and codes.
**broken link removed**

This is the attachment, the proteus image.
View attachment 122940
 
Last edited by a moderator:

I have used Proteus 8.2 SP2 to design the file. If you have older versions of Proteus then my file will not open.
 
Alright, thanks. I got it now!
Now what if I want to remove the manual part and stay with the whole system fully automatic, how can I do it from the already existing schematic and codes?
 

I will modify the code for you and post it here soon.
 

Alright am waiting, and Thanks in advance!
 

Try this and tell if this works.
 

Attachments

  • School Bell rev3 only auto mode.rar
    110.5 KB · Views: 59

The system is still almost the same and I am facing the same difficulties.
It still has the auto and manual parts in them.
Using the manual, I set the alarms but it doesn't show when it's time and there is
no bell to ring.
Using the automatic, I have checked the code and the timing there is correct but there is
no Real Timer for the system to read the current time and ring when it's time.

When it is time it doesn't show that it's time, but after the time has passed it shows
the next alarm time without showing that bell is ringing.

The other pressing matter on my mind is the absence of the buzzer which is one of the essential
device here.

1. Can you edit the system to have a buzzer and the real timer and allows me to set the
alarm time considering the RTC time?

2. Or keeping it simple by letting the system be as it is without the timer but add the buzzer, and I will set the
alarm time considering that the system starts from time 00;00;00, the I may set the first alarm to be for example 00;01;00
and last at 00;09;00 for presentation purpose which can be changed to any time you want according
to the school schedule.

3. Or let the system be as it is without the timer but add the buzzer, and let the alarm
time be configured in the code starting from time 00;01;00 for alarm 1, 00;02;00 for alarm 2..... 00;09;00 for alarm 9
considering that time starts at 00;00;00 just for presentation purpose. And this alarm can be changed, but only in the coding, to any time you want according
to the school schedule to fit what the school need the system for.

I wish to upload an image but am struggling, so I will put it in words:
Take out the unnecessary part which you will get rid when doing the fully auto system and add a buzzer especially please
Pic.Programmer. Am not good in coding and that's why I need your help.
I know i wrote too much... but, one last important thing... Thank you so much for your generous help in advance and for your patience.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top