Search
Search titles only
By:
Search titles only
By:
Log in
Register
Search
Search titles only
By:
Search titles only
By:
Menu
Install the app
Install
Forums
New posts
All threads
Latest threads
New posts
Trending threads
Trending
Search forums
What's new
New posts
New ads
New profile posts
Latest activity
Free Ads
Latest reviews
Search ads
Members
Current visitors
New profile posts
Search profile posts
Contact us
Latest ads
🔒 NordVPN Premium – 3 Months
hrdilshan
Updated:
Thursday at 8:29 PM
🚀 Microsoft Office 365 Pro Plus – Lifetime Access! 🚀
hrdilshan
Updated:
Thursday at 8:28 PM
Linkedin Premium Business / Careere /Sales Navigator - 1/2/3/6/9/12 Months - Reddem Link
hrdilshan
Updated:
Thursday at 8:27 PM
Colombo
YEYE 3 in 1 Instant Coffee Mix 50 Sachet
Romeshka
Updated:
Wednesday at 12:16 AM
Colombo
Red Hat Certified System Administrator (RHCSA) - RHEL 10
Sanjeewani95
Updated:
Jul 3, 2026
Electronics
Vehicles
Property
Search
Reply to thread
Forums
Computers & Internet
News & Discussion
My Micro Controller Project
Get the App
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Message
<blockquote data-quote="pasanlaksiri" data-source="post: 329419" data-attributes="member: 2882"><p><strong>Dual Time Digital Alarm Clock</strong></p><p></p><p><u>Features at a glance</u></p><ul> <li data-xf-list-type="ul">Dual time (Standard time + another time - GMT)</li> <li data-xf-list-type="ul">Counts seconds, minutes, hours, day, date, month and year</li> <li data-xf-list-type="ul">Alarm</li> <li data-xf-list-type="ul">12 hour / 24 hour time format</li> <li data-xf-list-type="ul">Leap year correction valid up to 2100</li> </ul><p></p><p><img src="http://aycu40.webshots.com/image/10439/2002595822128202705_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu13.webshots.com/image/10452/2002587071453083354_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu27.webshots.com/image/11386/2002596448896926065_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu01.webshots.com/image/11720/2002557608678829086_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu01.webshots.com/image/11720/2002504982648704595_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu38.webshots.com/image/11277/2002576489732961578_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu37.webshots.com/image/12436/2002542608981005265_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu09.webshots.com/image/10248/2002580657785029848_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu39.webshots.com/image/12878/2002584967172313425_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu24.webshots.com/image/10023/2002554831463919052_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu16.webshots.com/image/9775/2001821195554321427_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><img src="http://aycu16.webshots.com/image/9775/2001829545827807916_rs.jpg" alt="" class="fr-fic fr-dii fr-draggable " style="" /></p><p></p><p><span style="color: Red"><span style="font-size: 15px">This is the Program</span></span></p><p></p><p><span style="color: RoyalBlue">#include <pic.h></span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">__CONFIG(WDTDIS & XT & UNPROTECT & PWRTEN & LVPDIS & BORDIS);</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">unsigned char check_key(volatile unsigned char *key);</span></p><p><span style="color: RoyalBlue">void bin_to_bcd(unsigned char binary, unsigned char *bcd);</span></p><p><span style="color: RoyalBlue">void set_time();</span></p><p><span style="color: RoyalBlue">void show_alarm_time();</span></p><p><span style="color: RoyalBlue">void start_beep();</span></p><p><span style="color: RoyalBlue">void inc_day_date();</span></p><p><span style="color: RoyalBlue">void time_to_24H();</span></p><p><span style="color: RoyalBlue">void time_to_12H();</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">#define MIN_ON 12</span></p><p><span style="color: RoyalBlue">#define MAX_ON 72</span></p><p><span style="color: RoyalBlue">#define false 0</span></p><p><span style="color: RoyalBlue">#define true 1</span></p><p><span style="color: RoyalBlue">#define SW_COM RA5</span></p><p><span style="color: RoyalBlue">#define ADJ_TIME 10 // Time out in sec for settings </span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">#define COM_0 RA0</span></p><p><span style="color: RoyalBlue">#define COM_1 RA1</span></p><p><span style="color: RoyalBlue">#define COM_2 RA2</span></p><p><span style="color: RoyalBlue">#define COM_3 RA3</span></p><p><span style="color: RoyalBlue">#define COM_4 RA4</span></p><p><span style="color: RoyalBlue">#define COM_5 RA5</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">#define ADJ_KEY sw_0_cnt</span></p><p><span style="color: RoyalBlue">#define MODE_KEY sw_1_cnt</span></p><p><span style="color: RoyalBlue">#define BEEP_COUNT 4 // PWM duty cycle value for "beep"</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">#define ALPHA_A 3</span></p><p><span style="color: RoyalBlue">#define ALPHA_L 10</span></p><p><span style="color: RoyalBlue">#define BLANK 11</span></p><p><span style="color: RoyalBlue">#define ALPHA_H 12</span></p><p><span style="color: RoyalBlue">#define HIPHON 13</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">static const unsigned char display_L[14] = {0x00, 0x09, 0x04, 0x00, 0x09, 0x02, 0x02, 0x08, 0x00, 0x00, 0x07, 0x0F, 0x09, 0x0F};</span></p><p><span style="color: RoyalBlue">static const unsigned char display_H[14] = {0x80, 0xE0, 0x40, 0x60, 0x20, 0x20, 0x00, 0xE0, 0x00, 0x20, 0x80, 0xE0, 0x00, 0x60};</span></p><p><span style="color: RoyalBlue">static const unsigned char day_display_L[7] = {0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00};</span></p><p><span style="color: RoyalBlue">static const unsigned char day_display_H[7] = {0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80};</span></p><p><span style="color: RoyalBlue">/* End of months Null,JAN,FEB,MAR,APR,MAY,JUN,JLY,AUG,SEP,OCT,NOV,DEC*/</span></p><p><span style="color: RoyalBlue">static const unsigned char month_end[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};</span></p><p><span style="color: RoyalBlue">static const unsigned char blink[3] = { 0xFE, 0xFD, 0xF3};</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue">static const unsigned char digit3_L[4] = {0x0F, 0x09, 0x04, 0x08};</span></p><p><span style="color: RoyalBlue">static const unsigned char digit3_H[4] = {0xE0, 0xE0, 0x40, 0x00};</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">static unsigned char digit[4];</span></p><p><span style="color: RoyalBlue">static unsigned char count, i, j;</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">static volatile unsigned char sw_0_cnt[2], sw_1_cnt[2];</span></p><p><span style="color: RoyalBlue">static unsigned char mode, cursor_digit, timer;</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">union{</span></p><p><span style="color: RoyalBlue"> unsigned char FLAG_C;</span></p><p><span style="color: RoyalBlue"> struct{</span></p><p><span style="color: RoyalBlue"> unsigned AM:1;</span></p><p><span style="color: RoyalBlue"> unsigned PM:1;</span></p><p><span style="color: RoyalBlue"> unsigned AL1:1;</span></p><p><span style="color: RoyalBlue"> unsigned AL2:1;</span></p><p><span style="color: RoyalBlue"> unsigned DO_NOT_USE:1;</span></p><p><span style="color: RoyalBlue"> unsigned COLON:1;</span></p><p><span style="color: RoyalBlue"> unsigned ST:1;</span></p><p><span style="color: RoyalBlue"> unsigned FREE_1:1;</span></p><p><span style="color: RoyalBlue"> }s_flag;</span></p><p><span style="color: RoyalBlue">}u_flag;</span></p><p><span style="color: RoyalBlue">// DO_NOT_USE because RC4 not connected to anywhere; it will make problems when flag load to PORTC</span></p><p><span style="color: RoyalBlue">// AL2 is not implemented</span></p><p><span style="color: RoyalBlue">#define flag u_flag.FLAG_C</span></p><p><span style="color: RoyalBlue">#define FLAG u_flag.s_flag</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">static volatile unsigned char seconds, minutes, d_minutes, hours, d_hours, ticks, al_minutes, al_hours;</span></p><p><span style="color: RoyalBlue">static volatile unsigned char year, month, date, day, end_of_month;</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">volatile bit hr_24, bit_24, setup, one_time, pm, d_pm, update, AL_ON, AL_START, SLEEP_STATE, al_pm, show_al;</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue">main()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> TRISB = 0xF0;</span></p><p><span style="color: RoyalBlue"> TRISA = 0x00; // RA0 - RA4 are O/Ps, RA5 - RA7 are I/Ps </span></p><p><span style="color: RoyalBlue"> TRISC = 0b00011011; // RC<0:1> used for Timer1 external crystal</span></p><p><span style="color: RoyalBlue"> CMCON = 0x07;</span></p><p><span style="color: RoyalBlue"> ADCON1 = 0x06; // All are digital I/P in PORTA</span></p><p><span style="color: RoyalBlue"> OPTION = 0b10000011; // Disable PORTB pull ups, set prescalaer to 1:16</span></p><p><span style="color: RoyalBlue"> T1CON = 0b00001111; // Timer1 1:1 prescale, Osc enabled, no sync,</span></p><p><span style="color: RoyalBlue"> // external clock source, Timer1 on</span></p><p><span style="color: RoyalBlue"> TMR1IF = 0; // Clear Timer1 Overflow interrupt flag</span></p><p><span style="color: RoyalBlue"> TMR1IE = 1; // Enable Timer1 Overflow interrupt</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> PORTA = 0x00;</span></p><p><span style="color: RoyalBlue"> PORTB = 0;</span></p><p><span style="color: RoyalBlue"> PORTC = 0;</span></p><p><span style="color: RoyalBlue"> TMR1H = 0x80; // Initialize Timer1 to 0x8000</span></p><p><span style="color: RoyalBlue"> TMR1L = 0x00;</span></p><p><span style="color: RoyalBlue"> INTCON = 0x68; // Pheripheral, TMR0, RB port change interrupts enabled</span></p><p><span style="color: RoyalBlue"> GIE = 1;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> mode = 0;</span></p><p><span style="color: RoyalBlue"> setup = 0;</span></p><p><span style="color: RoyalBlue"> day = 0;</span></p><p><span style="color: RoyalBlue"> hr_24 = 0;</span></p><p><span style="color: RoyalBlue"> year = 5;</span></p><p><span style="color: RoyalBlue"> month = 1;</span></p><p><span style="color: RoyalBlue"> day = 1;</span></p><p><span style="color: RoyalBlue"> date = 1;</span></p><p><span style="color: RoyalBlue"> hours = 1; </span></p><p><span style="color: RoyalBlue"> d_hours = 1;</span></p><p><span style="color: RoyalBlue"> al_hours = 1;</span></p><p><span style="color: RoyalBlue"> pm = 0;</span></p><p><span style="color: RoyalBlue"> start_beep();</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(! (RB4 & RB5))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> setup = 1;</span></p><p><span style="color: RoyalBlue"> cursor_digit = 0;</span></p><p><span style="color: RoyalBlue"> digit[2] = BLANK;</span></p><p><span style="color: RoyalBlue"> digit[3] = 0;</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(year, digit);</span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> digit[cursor_digit]++;</span></p><p><span style="color: RoyalBlue"> if(digit[0] > 9)</span></p><p><span style="color: RoyalBlue"> digit[0] = 0;</span></p><p><span style="color: RoyalBlue"> if(digit[1] > 9)</span></p><p><span style="color: RoyalBlue"> digit[1] = 0;</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> cursor_digit ++;</span></p><p><span style="color: RoyalBlue"> if(cursor_digit > 1 || ticks > ADJ_TIME)</span></p><p><span style="color: RoyalBlue"> setup = 0; </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> year = digit[1] * 10 + digit[0]; </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> while(1)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if((al_pm == pm) && (al_hours == hours) && (al_minutes == minutes))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(AL_ON & FLAG.AL1)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> AL_START = 1;</span></p><p><span style="color: RoyalBlue"> SLEEP_STATE = 0;</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> AL_ON = 1;</span></p><p><span style="color: RoyalBlue"> AL_START = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(!RB7)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if (SLEEP_STATE)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> PORTA = 0x30;</span></p><p><span style="color: RoyalBlue"> RBIE = 1;</span></p><p><span style="color: RoyalBlue"> TRISB = TRISB = TRISC = 0xFF; // </span></p><p><span style="color: RoyalBlue"> SLEEP();</span></p><p><span style="color: RoyalBlue"> continue; </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> TRISB = 0xF0;</span></p><p><span style="color: RoyalBlue"> TRISA = 0x00; // RA0 - RA4 are O/Ps, RA5 - RA7 are I/Ps </span></p><p><span style="color: RoyalBlue"> TRISC = 0b00011011; // RC<0:1> used for Timer1 external crystal</span></p><p><span style="color: RoyalBlue"> if(ticks > 9)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> SLEEP_STATE = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if (update)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> update = 0; // update in every seconds only or for a Mode key press </span></p><p><span style="color: RoyalBlue"> if(!show_al)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> switch(mode)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> case 0:</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = 0;</span></p><p><span style="color: RoyalBlue"> FLAG.AM = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = pm;</span></p><p><span style="color: RoyalBlue"> FLAG.AM = !pm;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> FLAG.ST = 1; // we are now in standard time</span></p><p><span style="color: RoyalBlue"> bin_to_bcd (minutes, digit);</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(hours, &digit[2]);</span></p><p><span style="color: RoyalBlue"> one_time = 1;</span></p><p><span style="color: RoyalBlue"> timer = 0;</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 1:</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> show_alarm_time();</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 2:</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(date, digit);</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(month, &digit[2]);</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 3:</span></p><p><span style="color: RoyalBlue"> FLAG.ST = 0; // We are now in second time</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = 0;</span></p><p><span style="color: RoyalBlue"> FLAG.AM = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = d_pm;</span></p><p><span style="color: RoyalBlue"> FLAG.AM = ! d_pm;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(d_minutes, digit);</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(d_hours, &digit[2]);</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 4:</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> digit[2] = BLANK;</span></p><p><span style="color: RoyalBlue"> digit[3] = 0;</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(seconds, digit); </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">/****************************************************************************************/</span></p><p><span style="color: RoyalBlue">/* Setup Routines */</span></p><p><span style="color: RoyalBlue">/* */</span></p><p><span style="color: RoyalBlue">/****************************************************************************************/</span></p><p><span style="color: RoyalBlue"> if(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> switch(mode)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> case 0:</span></p><p><span style="color: RoyalBlue"> /* setting time */</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> set_time();</span></p><p><span style="color: RoyalBlue"> minutes = digit[1] * 10 + digit[0];</span></p><p><span style="color: RoyalBlue"> hours = digit[3] * 10 + digit[2];</span></p><p><span style="color: RoyalBlue"> pm = FLAG.PM;</span></p><p><span style="color: RoyalBlue"> /* Set time format 24 Hr of 12 Hr */</span></p><p><span style="color: RoyalBlue"> setup = 1;</span></p><p><span style="color: RoyalBlue"> cursor_digit = 4;</span></p><p><span style="color: RoyalBlue"> digit[0] = ALPHA_H;</span></p><p><span style="color: RoyalBlue"> digit[1] = BLANK;</span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> hr_24 = 0;</span></p><p><span style="color: RoyalBlue"> time_to_12H();</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hr_24 = 1;</span></p><p><span style="color: RoyalBlue"> time_to_24H();</span></p><p><span style="color: RoyalBlue"> pm = 0;</span></p><p><span style="color: RoyalBlue"> al_pm = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[2] = 4;</span></p><p><span style="color: RoyalBlue"> digit[3] = 2;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[2] = 2;</span></p><p><span style="color: RoyalBlue"> digit[3] = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> setup = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 1:</span></p><p><span style="color: RoyalBlue"> /* set alarm time */</span></p><p><span style="color: RoyalBlue"> set_time();</span></p><p><span style="color: RoyalBlue"> al_minutes = digit[1] * 10 + digit[0];</span></p><p><span style="color: RoyalBlue"> al_hours = digit[3] * 10 + digit[2];</span></p><p><span style="color: RoyalBlue"> al_pm = FLAG.PM;</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 2:</span></p><p><span style="color: RoyalBlue"> /* set day, date and month */</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> end_of_month = month_end[month];</span></p><p><span style="color: RoyalBlue"> if( (month == 2) && (year & 0x03)) </span></p><p><span style="color: RoyalBlue"> end_of_month --; // Not a leap year (untill 2100, this calc will be true)</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> cursor_digit ++;</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> digit[cursor_digit]++;</span></p><p><span style="color: RoyalBlue"> date = digit[1] * 10 + digit[0];</span></p><p><span style="color: RoyalBlue"> if (date > end_of_month)</span></p><p><span style="color: RoyalBlue"> date = 1;</span></p><p><span style="color: RoyalBlue"> month = digit[3] *10 + digit[2];</span></p><p><span style="color: RoyalBlue"> if(month > 12)</span></p><p><span style="color: RoyalBlue"> month = 1;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> bin_to_bcd(date, digit);</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(month, &digit[2]); </span></p><p><span style="color: RoyalBlue"> if(cursor_digit > 2 || ticks > ADJ_TIME)</span></p><p><span style="color: RoyalBlue"> setup = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> setup = 1;</span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> day++;</span></p><p><span style="color: RoyalBlue"> if(day >6)</span></p><p><span style="color: RoyalBlue"> day = 0;</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY) || ticks > ADJ_TIME)</span></p><p><span style="color: RoyalBlue"> setup = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 3:</span></p><p><span style="color: RoyalBlue"> /* setting the second time*/ </span></p><p><span style="color: RoyalBlue"> set_time();</span></p><p><span style="color: RoyalBlue"> d_minutes = digit[1] * 10 + digit[0];</span></p><p><span style="color: RoyalBlue"> d_hours = digit[3] * 10 + digit[2];</span></p><p><span style="color: RoyalBlue"> d_pm = FLAG.PM;</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 4:</span></p><p><span style="color: RoyalBlue"> /* set seconds */</span></p><p><span style="color: RoyalBlue"> digit[2] = BLANK;</span></p><p><span style="color: RoyalBlue"> digit[3] = 0;</span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = 1;</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(seconds, digit);</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(seconds > 29)</span></p><p><span style="color: RoyalBlue"> minutes++;</span></p><p><span style="color: RoyalBlue"> seconds = 0;</span></p><p><span style="color: RoyalBlue"> if(minutes > 59)</span></p><p><span style="color: RoyalBlue"> minutes = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY) || ticks > 60)</span></p><p><span style="color: RoyalBlue"> setup = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> }// End of setup</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(AL_START)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(j < 4)</span></p><p><span style="color: RoyalBlue"> { </span></p><p><span style="color: RoyalBlue"> if (i & 0x20)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> start_beep();</span></p><p><span style="color: RoyalBlue"> i = 0;</span></p><p><span style="color: RoyalBlue"> j++;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(i > (32*6))</span></p><p><span style="color: RoyalBlue"> j = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY) | check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> AL_ON = 0;</span></p><p><span style="color: RoyalBlue"> AL_START = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else if(!SLEEP_STATE)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(MODE_KEY[0] & 0x80)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> setup = 1;</span></p><p><span style="color: RoyalBlue"> start_beep();</span></p><p><span style="color: RoyalBlue"> cursor_digit = 0;</span></p><p><span style="color: RoyalBlue"> ticks = 0;</span></p><p><span style="color: RoyalBlue"> while(MODE_KEY[0] & 0x80);</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> show_al = 0;</span></p><p><span style="color: RoyalBlue"> mode ++;</span></p><p><span style="color: RoyalBlue"> update = 1;</span></p><p><span style="color: RoyalBlue"> if (mode > 4)</span></p><p><span style="color: RoyalBlue"> mode = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">/* A short press of ADJ key will show alarm 01's set time */</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> one_time = 1;</span></p><p><span style="color: RoyalBlue"> timer = 0;</span></p><p><span style="color: RoyalBlue"> show_alarm_time();</span></p><p><span style="color: RoyalBlue"> show_al = 1; </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(timer & 0x80)</span></p><p><span style="color: RoyalBlue"> show_al = 0;</span></p><p><span style="color: RoyalBlue"> if(show_al)</span></p><p><span style="color: RoyalBlue"> show_alarm_time();</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue">/* End of showing alarm time */</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> if(ADJ_KEY[0] & 0x80)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.AL1 = ! FLAG.AL1;</span></p><p><span style="color: RoyalBlue"> start_beep(); </span></p><p><span style="color: RoyalBlue"> while(ADJ_KEY[0] & 0x80);</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> RC2 = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue">void start_beep()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> SLEEP_STATE = 0; // Don't let the PIC go to sleep</span></p><p><span style="color: RoyalBlue"> ticks = 0;</span></p><p><span style="color: RoyalBlue"> count = BEEP_COUNT *2; // Set count for length of beep</span></p><p><span style="color: RoyalBlue"> CCP1CON = 0x0F; // Set the CCP module to PWM</span></p><p><span style="color: RoyalBlue"> PR2 = 122; // Set the period to 2048Hz</span></p><p><span style="color: RoyalBlue">// CCPR1L = 3; // Set the duty cycle very low</span></p><p><span style="color: RoyalBlue"> CCPR1L = 48;</span></p><p><span style="color: RoyalBlue"> T2CON = 0b01111101; // Enable Timer2</span></p><p><span style="color: RoyalBlue"> TMR2IF = 0; // Clear the Timer2 Interrupt flag</span></p><p><span style="color: RoyalBlue"> TMR2IE = 1; // Enable the Timer2 Interrupt</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue">void time_to_24H()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> /* Change format of time from 12 hr to 24 hour */</span></p><p><span style="color: RoyalBlue"> /* First standard time */</span></p><p><span style="color: RoyalBlue"> if(pm)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if (hours !=12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = hours + 12;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else if(hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> /* Now do it for the d time */</span></p><p><span style="color: RoyalBlue"> if(d_pm)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if (d_hours !=12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = d_hours + 12;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else if(d_hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> /* change format of Alarm time */</span></p><p><span style="color: RoyalBlue"> if(al_pm)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if (al_hours !=12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> al_hours = al_hours + 12;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else if(al_hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> al_hours = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue">void time_to_12H()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> /* Change format of time from 24 hours to 12 Hours */</span></p><p><span style="color: RoyalBlue"> /* first standard time */</span></p><p><span style="color: RoyalBlue"> if(hours > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = hours - 12;</span></p><p><span style="color: RoyalBlue"> pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if (hours == 0)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> /* Do the same for d time */</span></p><p><span style="color: RoyalBlue"> if(d_hours > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = d_hours - 12;</span></p><p><span style="color: RoyalBlue"> d_pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(d_hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if (d_hours == 0)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> /* Alarm time */ </span></p><p><span style="color: RoyalBlue"> if(al_hours > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> al_hours = al_hours - 12;</span></p><p><span style="color: RoyalBlue"> al_pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(al_hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> al_pm = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if (al_hours == 0)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> al_hours = 1;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">} </span></p><p><span style="color: RoyalBlue">void set_time()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> while(setup)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(check_key(MODE_KEY))</span></p><p><span style="color: RoyalBlue"> cursor_digit++;</span></p><p><span style="color: RoyalBlue"> if(check_key(ADJ_KEY))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[cursor_digit]++;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(digit[0] > 9)</span></p><p><span style="color: RoyalBlue"> digit[0] = 0;</span></p><p><span style="color: RoyalBlue"> if(digit[1] > 5)</span></p><p><span style="color: RoyalBlue"> digit[1] = 0;</span></p><p><span style="color: RoyalBlue"> if(digit[2] > 9)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[2] = 0;</span></p><p><span style="color: RoyalBlue"> digit[3] ++;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if( hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(digit[3] > 1)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(digit[2] > 3)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[3] = digit[2] = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(digit[3] > 0)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(digit[2] > 2)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit[2] = 1;</span></p><p><span style="color: RoyalBlue"> digit[3] = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(digit[2] == 2)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.AM = FLAG.PM;</span></p><p><span style="color: RoyalBlue"> FLAG.PM = !FLAG.PM;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(cursor_digit > 2 || ticks > ADJ_TIME)</span></p><p><span style="color: RoyalBlue"> setup = 0; </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue">void bin_to_bcd(unsigned char binary, unsigned char *bcd)</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> unsigned char count = 0;</span></p><p><span style="color: RoyalBlue"> for( ;binary > 9; binary = binary - 10)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> count ++;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> bcd[0] = binary;</span></p><p><span style="color: RoyalBlue"> bcd[1] = count;</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue">void show_alarm_time()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = FLAG.AM = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> FLAG.PM = al_pm;</span></p><p><span style="color: RoyalBlue"> FLAG.AM = !al_pm;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(one_time)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> update = 1;</span></p><p><span style="color: RoyalBlue"> digit[0] = digit[1] = BLANK;</span></p><p><span style="color: RoyalBlue"> digit[2] = ALPHA_L;</span></p><p><span style="color: RoyalBlue"> digit[3] = ALPHA_A;</span></p><p><span style="color: RoyalBlue"> if(timer & 0x40)</span></p><p><span style="color: RoyalBlue"> one_time = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(al_minutes, digit);</span></p><p><span style="color: RoyalBlue"> bin_to_bcd(al_hours, &digit[2]);</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">} </span></p><p><span style="color: RoyalBlue">unsigned char check_key(volatile unsigned char *key)</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> //key[0] = current, key[1] = old</span></p><p><span style="color: RoyalBlue"> static unsigned char temp;</span></p><p><span style="color: RoyalBlue"> temp = key[1];</span></p><p><span style="color: RoyalBlue">// key[1] = key[0]; // Copy current --> Old</span></p><p><span style="color: RoyalBlue"> if ( key[0] < key[1])</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> key[1] = key[0];</span></p><p><span style="color: RoyalBlue"> if (temp < MIN_ON)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> // key pressed less than MIN_ON time</span></p><p><span style="color: RoyalBlue"> return false;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else if (temp > MAX_ON)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> return false;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> ticks = 0;</span></p><p><span style="color: RoyalBlue"> start_beep();</span></p><p><span style="color: RoyalBlue"> return true;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> key[1] = key[0];</span></p><p><span style="color: RoyalBlue"> return false;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue">} </span></p><p><span style="color: RoyalBlue">void inc_day_date()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> end_of_month = month_end[month];</span></p><p><span style="color: RoyalBlue"> if( (month == 2) && (year & 0x03)) </span></p><p><span style="color: RoyalBlue"> end_of_month --; // Not a leap year</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> day++;</span></p><p><span style="color: RoyalBlue"> date++;</span></p><p><span style="color: RoyalBlue"> if(day >6)</span></p><p><span style="color: RoyalBlue"> day = 0;</span></p><p><span style="color: RoyalBlue"> if(date > end_of_month)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> date = 1;</span></p><p><span style="color: RoyalBlue"> month ++;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(month > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> month = 1;</span></p><p><span style="color: RoyalBlue"> year ++;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue">}</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue">void interrupt disp()</span></p><p><span style="color: RoyalBlue">{</span></p><p><span style="color: RoyalBlue"> static unsigned char digit_count, temp;</span></p><p><span style="color: RoyalBlue"> if(T0IF) // Interrupts on every 4.096 mS</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> i ++; </span></p><p><span style="color: RoyalBlue"> digit_count ++;</span></p><p><span style="color: RoyalBlue"> if(digit_count > 5)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> digit_count = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> PORTB &= 0xF0;</span></p><p><span style="color: RoyalBlue"> PORTC &= PORTC & 0x1F;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> /* Scan keys */</span></p><p><span style="color: RoyalBlue"> if(sw_0_cnt[0] < 0xFF)</span></p><p><span style="color: RoyalBlue"> sw_0_cnt[0] ++;</span></p><p><span style="color: RoyalBlue"> if(RB4)</span></p><p><span style="color: RoyalBlue"> sw_0_cnt[0] = 0;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(sw_1_cnt[0] < 0xFF)</span></p><p><span style="color: RoyalBlue"> sw_1_cnt[0] ++;</span></p><p><span style="color: RoyalBlue"> if(RB5)</span></p><p><span style="color: RoyalBlue"> sw_1_cnt[0] = 0;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> switch(digit_count)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> case 0:</span></p><p><span style="color: RoyalBlue"> COM_5 = 1; // Disable COM 5</span></p><p><span style="color: RoyalBlue"> PORTB |= display_L[digit[0]];</span></p><p><span style="color: RoyalBlue"> PORTC |= display_H[digit[0]];</span></p><p><span style="color: RoyalBlue"> COM_0 = 1; // Enable COM_0</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 1:</span></p><p><span style="color: RoyalBlue"> COM_0 = 0;</span></p><p><span style="color: RoyalBlue"> PORTB |= display_L[digit[1]];</span></p><p><span style="color: RoyalBlue"> PORTC |= display_H[digit[1]];</span></p><p><span style="color: RoyalBlue"> COM_1 = 1;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 2:</span></p><p><span style="color: RoyalBlue"> COM_1 = 0;</span></p><p><span style="color: RoyalBlue"> PORTB |= display_L[digit[2]];</span></p><p><span style="color: RoyalBlue"> PORTC |= display_H[digit[2]];</span></p><p><span style="color: RoyalBlue"> COM_2 = 1;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 3:</span></p><p><span style="color: RoyalBlue"> COM_2 = 0;</span></p><p><span style="color: RoyalBlue"> PORTB |= digit3_L[digit[3]];</span></p><p><span style="color: RoyalBlue"> PORTC |= PORTC | digit3_H[digit[3]];</span></p><p><span style="color: RoyalBlue"> COM_3 = 1;</span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 4:</span></p><p><span style="color: RoyalBlue"> /* COM_4 and COM_5 wired as commom cathode */</span></p><p><span style="color: RoyalBlue"> COM_3 = 0; // Disable COM_3</span></p><p><span style="color: RoyalBlue"> PORTB |= day_display_L[day];</span></p><p><span style="color: RoyalBlue"> PORTC |= day_display_H[day];</span></p><p><span style="color: RoyalBlue"> COM_4 = 0; // Enable COM_4</span></p><p><span style="color: RoyalBlue"> timer ++;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> break;</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> case 5:</span></p><p><span style="color: RoyalBlue"> /* COM_4 and COM_5 wired as commom cathode */ </span></p><p><span style="color: RoyalBlue"> COM_4 = 1; // Disable COM_4</span></p><p><span style="color: RoyalBlue"> PORTB |= flag;</span></p><p><span style="color: RoyalBlue"> PORTC |= flag;</span></p><p><span style="color: RoyalBlue"> COM_5 = 0; // Enable COM_5</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if (setup && (timer &0x10))</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> /* in setup blink the correspondig digit */</span></p><p><span style="color: RoyalBlue"> if(cursor_digit == 3)</span></p><p><span style="color: RoyalBlue"> COM_4 = 1;</span></p><p><span style="color: RoyalBlue"> else if(cursor_digit == 4)</span></p><p><span style="color: RoyalBlue"> COM_5 = 1;</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> PORTA &= blink[cursor_digit];</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> T0IF = 0; // Enable TMR0 interrupt</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(RBIF) // Port change interrupt</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> SLEEP_STATE = 0;</span></p><p><span style="color: RoyalBlue"> ticks = 0;</span></p><p><span style="color: RoyalBlue"> temp = PORTB;</span></p><p><span style="color: RoyalBlue"> RBIF = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(TMR2IF && TMR2IE) // Timer2 Overflow used for beep</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(TMR2IE) // If Timer2 interrupt is enabled</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> count--; // Decrement count</span></p><p><span style="color: RoyalBlue"> if(!count) // If count has reached zero</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> CCP1CON = 0; // Disable CCP module</span></p><p><span style="color: RoyalBlue"> T2CON = 0; // Disable Timer2</span></p><p><span style="color: RoyalBlue"> CCPR1L = 0; // Clear the Duty Cycle </span></p><p><span style="color: RoyalBlue"> TMR2IE = 0; // Disable Timer2 Interrupt</span></p><p><span style="color: RoyalBlue">// SLEEP_STATE = 1; // Enable PIC to SLEEP</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> TMR2IF = 0; // Clear Timer2 interrupt flag</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(TMR1IF) // Timer1 Overflow, once every sec</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"></span></p><p><span style="color: RoyalBlue"> seconds++; // Increment seconds</span></p><p><span style="color: RoyalBlue"> if(seconds > 59) // check for seconds overflow</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> seconds = 0;</span></p><p><span style="color: RoyalBlue"> minutes++; </span></p><p><span style="color: RoyalBlue"> d_minutes ++; // inc the d time minutes </span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> if(minutes > 59) // check for hours overflow</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> minutes = 0;</span></p><p><span style="color: RoyalBlue"> hours ++; // increment hours</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(hours >23)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = 0;</span></p><p><span style="color: RoyalBlue"> inc_day_date();</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(pm)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> inc_day_date();</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> pm = ! pm;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(hours > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> hours = 1;</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> // Next, update the d time</span></p><p><span style="color: RoyalBlue"> if(d_minutes > 59) // check for d_hours overflow</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_minutes = 0;</span></p><p><span style="color: RoyalBlue"> d_hours ++; // increment d_hours</span></p><p><span style="color: RoyalBlue"> if(hr_24)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(d_hours >23)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = 0;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> else</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> if(d_hours == 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_pm = ! d_pm;</span></p><p><span style="color: RoyalBlue"> }</span></p><p><span style="color: RoyalBlue"> if(d_hours > 12)</span></p><p><span style="color: RoyalBlue"> {</span></p><p><span style="color: RoyalBlue"> d_hours = 1;</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> }// end of updating d time</span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> TMR1H |= 0x80; // Set Timer1 to 0x8000 + current time</span></p><p><span style="color: RoyalBlue"> FLAG.COLON = !FLAG.COLON; // Toggle the colon</span></p><p><span style="color: RoyalBlue"> ticks++; // increment ticks, used for timeout</span></p><p><span style="color: RoyalBlue"> TMR1IF = 0; // Clear Timer1 interrupt flag</span></p><p><span style="color: RoyalBlue"> </span></p><p><span style="color: RoyalBlue"> update = 1; </span></p><p><span style="color: RoyalBlue"> } </span></p><p><span style="color: RoyalBlue">}</span></p></blockquote><p></p>
[QUOTE="pasanlaksiri, post: 329419, member: 2882"] [B]Dual Time Digital Alarm Clock[/B] [U]Features at a glance[/U] [LIST] [*]Dual time (Standard time + another time - GMT) [*]Counts seconds, minutes, hours, day, date, month and year [*]Alarm [*]12 hour / 24 hour time format [*]Leap year correction valid up to 2100 [/LIST] [IMG]http://aycu40.webshots.com/image/10439/2002595822128202705_rs.jpg[/IMG] [IMG]http://aycu13.webshots.com/image/10452/2002587071453083354_rs.jpg[/IMG] [IMG]http://aycu27.webshots.com/image/11386/2002596448896926065_rs.jpg[/IMG] [IMG]http://aycu01.webshots.com/image/11720/2002557608678829086_rs.jpg[/IMG] [IMG]http://aycu01.webshots.com/image/11720/2002504982648704595_rs.jpg[/IMG] [IMG]http://aycu38.webshots.com/image/11277/2002576489732961578_rs.jpg[/IMG] [IMG]http://aycu37.webshots.com/image/12436/2002542608981005265_rs.jpg[/IMG] [IMG]http://aycu09.webshots.com/image/10248/2002580657785029848_rs.jpg[/IMG] [IMG]http://aycu39.webshots.com/image/12878/2002584967172313425_rs.jpg[/IMG] [IMG]http://aycu24.webshots.com/image/10023/2002554831463919052_rs.jpg[/IMG] [IMG]http://aycu16.webshots.com/image/9775/2001821195554321427_rs.jpg[/IMG] [IMG]http://aycu16.webshots.com/image/9775/2001829545827807916_rs.jpg[/IMG] [COLOR="Red"][SIZE="4"]This is the Program[/SIZE][/COLOR] [COLOR="RoyalBlue"]#include <pic.h> __CONFIG(WDTDIS & XT & UNPROTECT & PWRTEN & LVPDIS & BORDIS); unsigned char check_key(volatile unsigned char *key); void bin_to_bcd(unsigned char binary, unsigned char *bcd); void set_time(); void show_alarm_time(); void start_beep(); void inc_day_date(); void time_to_24H(); void time_to_12H(); #define MIN_ON 12 #define MAX_ON 72 #define false 0 #define true 1 #define SW_COM RA5 #define ADJ_TIME 10 // Time out in sec for settings #define COM_0 RA0 #define COM_1 RA1 #define COM_2 RA2 #define COM_3 RA3 #define COM_4 RA4 #define COM_5 RA5 #define ADJ_KEY sw_0_cnt #define MODE_KEY sw_1_cnt #define BEEP_COUNT 4 // PWM duty cycle value for "beep" #define ALPHA_A 3 #define ALPHA_L 10 #define BLANK 11 #define ALPHA_H 12 #define HIPHON 13 static const unsigned char display_L[14] = {0x00, 0x09, 0x04, 0x00, 0x09, 0x02, 0x02, 0x08, 0x00, 0x00, 0x07, 0x0F, 0x09, 0x0F}; static const unsigned char display_H[14] = {0x80, 0xE0, 0x40, 0x60, 0x20, 0x20, 0x00, 0xE0, 0x00, 0x20, 0x80, 0xE0, 0x00, 0x60}; static const unsigned char day_display_L[7] = {0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00}; static const unsigned char day_display_H[7] = {0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80}; /* End of months Null,JAN,FEB,MAR,APR,MAY,JUN,JLY,AUG,SEP,OCT,NOV,DEC*/ static const unsigned char month_end[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; static const unsigned char blink[3] = { 0xFE, 0xFD, 0xF3}; static const unsigned char digit3_L[4] = {0x0F, 0x09, 0x04, 0x08}; static const unsigned char digit3_H[4] = {0xE0, 0xE0, 0x40, 0x00}; static unsigned char digit[4]; static unsigned char count, i, j; static volatile unsigned char sw_0_cnt[2], sw_1_cnt[2]; static unsigned char mode, cursor_digit, timer; union{ unsigned char FLAG_C; struct{ unsigned AM:1; unsigned PM:1; unsigned AL1:1; unsigned AL2:1; unsigned DO_NOT_USE:1; unsigned COLON:1; unsigned ST:1; unsigned FREE_1:1; }s_flag; }u_flag; // DO_NOT_USE because RC4 not connected to anywhere; it will make problems when flag load to PORTC // AL2 is not implemented #define flag u_flag.FLAG_C #define FLAG u_flag.s_flag static volatile unsigned char seconds, minutes, d_minutes, hours, d_hours, ticks, al_minutes, al_hours; static volatile unsigned char year, month, date, day, end_of_month; volatile bit hr_24, bit_24, setup, one_time, pm, d_pm, update, AL_ON, AL_START, SLEEP_STATE, al_pm, show_al; main() { TRISB = 0xF0; TRISA = 0x00; // RA0 - RA4 are O/Ps, RA5 - RA7 are I/Ps TRISC = 0b00011011; // RC<0:1> used for Timer1 external crystal CMCON = 0x07; ADCON1 = 0x06; // All are digital I/P in PORTA OPTION = 0b10000011; // Disable PORTB pull ups, set prescalaer to 1:16 T1CON = 0b00001111; // Timer1 1:1 prescale, Osc enabled, no sync, // external clock source, Timer1 on TMR1IF = 0; // Clear Timer1 Overflow interrupt flag TMR1IE = 1; // Enable Timer1 Overflow interrupt PORTA = 0x00; PORTB = 0; PORTC = 0; TMR1H = 0x80; // Initialize Timer1 to 0x8000 TMR1L = 0x00; INTCON = 0x68; // Pheripheral, TMR0, RB port change interrupts enabled GIE = 1; mode = 0; setup = 0; day = 0; hr_24 = 0; year = 5; month = 1; day = 1; date = 1; hours = 1; d_hours = 1; al_hours = 1; pm = 0; start_beep(); if(! (RB4 & RB5)) { setup = 1; cursor_digit = 0; digit[2] = BLANK; digit[3] = 0; bin_to_bcd(year, digit); while(setup) { if(check_key(ADJ_KEY)) digit[cursor_digit]++; if(digit[0] > 9) digit[0] = 0; if(digit[1] > 9) digit[1] = 0; if(check_key(MODE_KEY)) cursor_digit ++; if(cursor_digit > 1 || ticks > ADJ_TIME) setup = 0; } year = digit[1] * 10 + digit[0]; } while(1) { if((al_pm == pm) && (al_hours == hours) && (al_minutes == minutes)) { if(AL_ON & FLAG.AL1) { AL_START = 1; SLEEP_STATE = 0; } } else { AL_ON = 1; AL_START = 0; } if(!RB7) { if (SLEEP_STATE) { PORTA = 0x30; RBIE = 1; TRISB = TRISB = TRISC = 0xFF; // SLEEP(); continue; } } TRISB = 0xF0; TRISA = 0x00; // RA0 - RA4 are O/Ps, RA5 - RA7 are I/Ps TRISC = 0b00011011; // RC<0:1> used for Timer1 external crystal if(ticks > 9) { SLEEP_STATE = 1; } if (update) { update = 0; // update in every seconds only or for a Mode key press if(!show_al) { switch(mode) { case 0: if(hr_24) { FLAG.PM = 0; FLAG.AM = 0; } else { FLAG.PM = pm; FLAG.AM = !pm; } FLAG.ST = 1; // we are now in standard time bin_to_bcd (minutes, digit); bin_to_bcd(hours, &digit[2]); one_time = 1; timer = 0; break; case 1: FLAG.COLON = 1; show_alarm_time(); break; case 2: FLAG.COLON = 1; bin_to_bcd(date, digit); bin_to_bcd(month, &digit[2]); break; case 3: FLAG.ST = 0; // We are now in second time if(hr_24) { FLAG.PM = 0; FLAG.AM = 0; } else { FLAG.PM = d_pm; FLAG.AM = ! d_pm; } bin_to_bcd(d_minutes, digit); bin_to_bcd(d_hours, &digit[2]); break; case 4: FLAG.COLON = 1; digit[2] = BLANK; digit[3] = 0; bin_to_bcd(seconds, digit); } } } /****************************************************************************************/ /* Setup Routines */ /* */ /****************************************************************************************/ if(setup) { switch(mode) { case 0: /* setting time */ set_time(); minutes = digit[1] * 10 + digit[0]; hours = digit[3] * 10 + digit[2]; pm = FLAG.PM; /* Set time format 24 Hr of 12 Hr */ setup = 1; cursor_digit = 4; digit[0] = ALPHA_H; digit[1] = BLANK; while(setup) { if(check_key(ADJ_KEY)) { if(hr_24) { hr_24 = 0; time_to_12H(); } else { hr_24 = 1; time_to_24H(); pm = 0; al_pm = 0; } } if(hr_24) { digit[2] = 4; digit[3] = 2; } else { digit[2] = 2; digit[3] = 1; } if(check_key(MODE_KEY)) setup = 0; } break; case 1: /* set alarm time */ set_time(); al_minutes = digit[1] * 10 + digit[0]; al_hours = digit[3] * 10 + digit[2]; al_pm = FLAG.PM; FLAG.COLON = 1; break; case 2: /* set day, date and month */ FLAG.COLON = 1; end_of_month = month_end[month]; if( (month == 2) && (year & 0x03)) end_of_month --; // Not a leap year (untill 2100, this calc will be true) while(setup) { FLAG.COLON = 1; if(check_key(MODE_KEY)) cursor_digit ++; if(check_key(ADJ_KEY)) digit[cursor_digit]++; date = digit[1] * 10 + digit[0]; if (date > end_of_month) date = 1; month = digit[3] *10 + digit[2]; if(month > 12) month = 1; bin_to_bcd(date, digit); bin_to_bcd(month, &digit[2]); if(cursor_digit > 2 || ticks > ADJ_TIME) setup = 0; } setup = 1; while(setup) { FLAG.COLON = 1; if(check_key(ADJ_KEY)) day++; if(day >6) day = 0; if(check_key(MODE_KEY) || ticks > ADJ_TIME) setup = 0; } break; case 3: /* setting the second time*/ set_time(); d_minutes = digit[1] * 10 + digit[0]; d_hours = digit[3] * 10 + digit[2]; d_pm = FLAG.PM; break; case 4: /* set seconds */ digit[2] = BLANK; digit[3] = 0; while(setup) { FLAG.COLON = 1; bin_to_bcd(seconds, digit); if(check_key(ADJ_KEY)) { if(seconds > 29) minutes++; seconds = 0; if(minutes > 59) minutes = 0; } if(check_key(MODE_KEY) || ticks > 60) setup = 0; } break; }// End of setup } if(AL_START) { if(j < 4) { if (i & 0x20) { start_beep(); i = 0; j++; } } else { if(i > (32*6)) j = 0; } if(check_key(ADJ_KEY) | check_key(MODE_KEY)) { AL_ON = 0; AL_START = 0; } } else if(!SLEEP_STATE) { if(MODE_KEY[0] & 0x80) { setup = 1; start_beep(); cursor_digit = 0; ticks = 0; while(MODE_KEY[0] & 0x80); } if(check_key(MODE_KEY)) { show_al = 0; mode ++; update = 1; if (mode > 4) mode = 0; } /* A short press of ADJ key will show alarm 01's set time */ if(check_key(ADJ_KEY)) { one_time = 1; timer = 0; show_alarm_time(); show_al = 1; } if(timer & 0x80) show_al = 0; if(show_al) show_alarm_time(); /* End of showing alarm time */ if(ADJ_KEY[0] & 0x80) { FLAG.AL1 = ! FLAG.AL1; start_beep(); while(ADJ_KEY[0] & 0x80); } RC2 = 0; } } } void start_beep() { SLEEP_STATE = 0; // Don't let the PIC go to sleep ticks = 0; count = BEEP_COUNT *2; // Set count for length of beep CCP1CON = 0x0F; // Set the CCP module to PWM PR2 = 122; // Set the period to 2048Hz // CCPR1L = 3; // Set the duty cycle very low CCPR1L = 48; T2CON = 0b01111101; // Enable Timer2 TMR2IF = 0; // Clear the Timer2 Interrupt flag TMR2IE = 1; // Enable the Timer2 Interrupt } void time_to_24H() { /* Change format of time from 12 hr to 24 hour */ /* First standard time */ if(pm) { if (hours !=12) { hours = hours + 12; } } else if(hours == 12) { hours = 0; } /* Now do it for the d time */ if(d_pm) { if (d_hours !=12) { d_hours = d_hours + 12; } } else if(d_hours == 12) { d_hours = 0; } /* change format of Alarm time */ if(al_pm) { if (al_hours !=12) { al_hours = al_hours + 12; } } else if(al_hours == 12) { al_hours = 0; } } void time_to_12H() { /* Change format of time from 24 hours to 12 Hours */ /* first standard time */ if(hours > 12) { hours = hours - 12; pm = 1; } if(hours == 12) { pm = 1; } if (hours == 0) { hours = 1; } /* Do the same for d time */ if(d_hours > 12) { d_hours = d_hours - 12; d_pm = 1; } if(d_hours == 12) { d_pm = 1; } if (d_hours == 0) { d_hours = 1; } /* Alarm time */ if(al_hours > 12) { al_hours = al_hours - 12; al_pm = 1; } if(al_hours == 12) { al_pm = 1; } if (al_hours == 0) { al_hours = 1; } } void set_time() { while(setup) { if(check_key(MODE_KEY)) cursor_digit++; if(check_key(ADJ_KEY)) { digit[cursor_digit]++; if(digit[0] > 9) digit[0] = 0; if(digit[1] > 5) digit[1] = 0; if(digit[2] > 9) { digit[2] = 0; digit[3] ++; } if( hr_24) { if(digit[3] > 1) { if(digit[2] > 3) { digit[3] = digit[2] = 0; } } } else { if(digit[3] > 0) { if(digit[2] > 2) { digit[2] = 1; digit[3] = 0; } if(digit[2] == 2) { FLAG.AM = FLAG.PM; FLAG.PM = !FLAG.PM; } } } } if(cursor_digit > 2 || ticks > ADJ_TIME) setup = 0; } } void bin_to_bcd(unsigned char binary, unsigned char *bcd) { unsigned char count = 0; for( ;binary > 9; binary = binary - 10) { count ++; } bcd[0] = binary; bcd[1] = count; } void show_alarm_time() { if(hr_24) { FLAG.PM = FLAG.AM = 0; } else { FLAG.PM = al_pm; FLAG.AM = !al_pm; } if(one_time) { update = 1; digit[0] = digit[1] = BLANK; digit[2] = ALPHA_L; digit[3] = ALPHA_A; if(timer & 0x40) one_time = 0; } else { bin_to_bcd(al_minutes, digit); bin_to_bcd(al_hours, &digit[2]); } } unsigned char check_key(volatile unsigned char *key) { //key[0] = current, key[1] = old static unsigned char temp; temp = key[1]; // key[1] = key[0]; // Copy current --> Old if ( key[0] < key[1]) { key[1] = key[0]; if (temp < MIN_ON) { // key pressed less than MIN_ON time return false; } else if (temp > MAX_ON) { return false; } else { ticks = 0; start_beep(); return true; } } key[1] = key[0]; return false; } void inc_day_date() { end_of_month = month_end[month]; if( (month == 2) && (year & 0x03)) end_of_month --; // Not a leap year day++; date++; if(day >6) day = 0; if(date > end_of_month) { date = 1; month ++; } if(month > 12) { month = 1; year ++; } } void interrupt disp() { static unsigned char digit_count, temp; if(T0IF) // Interrupts on every 4.096 mS { i ++; digit_count ++; if(digit_count > 5) { digit_count = 0; } PORTB &= 0xF0; PORTC &= PORTC & 0x1F; /* Scan keys */ if(sw_0_cnt[0] < 0xFF) sw_0_cnt[0] ++; if(RB4) sw_0_cnt[0] = 0; if(sw_1_cnt[0] < 0xFF) sw_1_cnt[0] ++; if(RB5) sw_1_cnt[0] = 0; switch(digit_count) { case 0: COM_5 = 1; // Disable COM 5 PORTB |= display_L[digit[0]]; PORTC |= display_H[digit[0]]; COM_0 = 1; // Enable COM_0 break; case 1: COM_0 = 0; PORTB |= display_L[digit[1]]; PORTC |= display_H[digit[1]]; COM_1 = 1; break; case 2: COM_1 = 0; PORTB |= display_L[digit[2]]; PORTC |= display_H[digit[2]]; COM_2 = 1; break; case 3: COM_2 = 0; PORTB |= digit3_L[digit[3]]; PORTC |= PORTC | digit3_H[digit[3]]; COM_3 = 1; break; case 4: /* COM_4 and COM_5 wired as commom cathode */ COM_3 = 0; // Disable COM_3 PORTB |= day_display_L[day]; PORTC |= day_display_H[day]; COM_4 = 0; // Enable COM_4 timer ++; break; case 5: /* COM_4 and COM_5 wired as commom cathode */ COM_4 = 1; // Disable COM_4 PORTB |= flag; PORTC |= flag; COM_5 = 0; // Enable COM_5 } if (setup && (timer &0x10)) { /* in setup blink the correspondig digit */ if(cursor_digit == 3) COM_4 = 1; else if(cursor_digit == 4) COM_5 = 1; else PORTA &= blink[cursor_digit]; } T0IF = 0; // Enable TMR0 interrupt } if(RBIF) // Port change interrupt { SLEEP_STATE = 0; ticks = 0; temp = PORTB; RBIF = 0; } if(TMR2IF && TMR2IE) // Timer2 Overflow used for beep { if(TMR2IE) // If Timer2 interrupt is enabled { count--; // Decrement count if(!count) // If count has reached zero { CCP1CON = 0; // Disable CCP module T2CON = 0; // Disable Timer2 CCPR1L = 0; // Clear the Duty Cycle TMR2IE = 0; // Disable Timer2 Interrupt // SLEEP_STATE = 1; // Enable PIC to SLEEP } } TMR2IF = 0; // Clear Timer2 interrupt flag } if(TMR1IF) // Timer1 Overflow, once every sec { seconds++; // Increment seconds if(seconds > 59) // check for seconds overflow { seconds = 0; minutes++; d_minutes ++; // inc the d time minutes if(minutes > 59) // check for hours overflow { minutes = 0; hours ++; // increment hours if(hr_24) { if(hours >23) { hours = 0; inc_day_date(); } } else { if(hours == 12) { if(pm) { inc_day_date(); } pm = ! pm; } if(hours > 12) { hours = 1; } } } // Next, update the d time if(d_minutes > 59) // check for d_hours overflow { d_minutes = 0; d_hours ++; // increment d_hours if(hr_24) { if(d_hours >23) { d_hours = 0; } } else { if(d_hours == 12) { d_pm = ! d_pm; } if(d_hours > 12) { d_hours = 1; } } }// end of updating d time } TMR1H |= 0x80; // Set Timer1 to 0x8000 + current time FLAG.COLON = !FLAG.COLON; // Toggle the colon ticks++; // increment ticks, used for timeout TMR1IF = 0; // Clear Timer1 interrupt flag update = 1; } }[/COLOR] [/QUOTE]
Insert quotes…
Verification
Payakata winadi keeyak tibeda?
Post reply
Top
Bottom