Welcome Guest [Log In] [Register]
// FILL IN HERE THE URL TO THE POLL var poll_url='http://s8.zetaboards.com/Lichentia_exchange/topic/104257'; // Below is the rest of the script var steptime=1000; var xmlhttp; var poll_html; var DEBUG=0; // moving stuff /*var potw_dir=1; var potw_pos=51;*/ /*function blibble() { if (potw_pos<5) {potw_dir=1; potw_pos=5;} if (potw_pos>95) {potw_dir=-1; potw_pos=95;} potw_pos=potw_pos+potw_dir*1; document.getElementById('potw_envelope').style.left=potw_pos+"%"; setTimeout('blibble();',steptime) }*/ // loader of remote documents... function loadXMLDoc() { var url=poll_url; if (location.href.match("act=idx") || (location.href.indexOf("=")==-1)) { xmlhttp=null; // code for Mozilla, etc. if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } // code for IE else if (window.ActiveXObject) { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlhttp!=null) { xmlhttp.onreadystatechange=state_Change; xmlhttp.open("GET",url,true); xmlhttp.send(null); } else { poll_html="Your browser does not support XMLHTTP."; } } } function state_Change() { // if xmlhttp shows "loaded" if (xmlhttp.readyState==4) { // if "OK" if (xmlhttp.status==200) { if (document.getElementById('userlinks').innerHTML.match("tsrill")) DEBUG=1; var prestring="
',preindex); if ((postindex==-1) || (preindex==-1)) { poll_html="No poll found at
"+poll_url+"."; } else { poll_html=xmlhttp.responseText.substring(preindex,postindex); poll_html=poll_html.replace(/row1/g,"potwrow"); poll_html=poll_html.replace(/td colspan=\'3\' align=\'center\'/g,"td colspan=\'2\' align=\'center\' class=\'potwtitle\'"); poll_html=poll_html.replace(/pformstrip/g,"potwstrip"); // if voted remove indicator bars: if (!poll_html.match("poll_vote")) { var poll_html_copy=poll_html; var teststr='-1) { j=poll_html_copy.indexOf(teststr)+ii; //document.write(j+"
\n"); ii=j+1; if ((tdcounter-1)%3==2) { tdbegin[td3counter]=j; tdend[td3counter]=poll_html.indexOf('',ii); td3counter++; } tdcounter++; poll_html_copy=poll_html_copy.substring(poll_html_copy.indexOf(teststr)+1,poll_html_copy.length); } for(ii=td3counter-1;ii>=0;ii--) { poll_html=poll_html.substring(0,tdbegin[ii]-1)+poll_html.substring(tdend[ii]+5,poll_html.length); } } //end if: voted-already } document.getElementById('polloftheweek').innerHTML=poll_html; } else { poll_html="Problem retrieving poll data."; document.getElementById('polloftheweek').innerHTML=poll_html; } document.getElementById('potw_envelope').style.left="60%"; document.getElementById('potw_envelope').style.visibility= "visible"; document.getElementById('potw_header').innerHTML=""+document.getElementById('potw_header').innerHTML+""; /*setTimeout('blibble();',steptime);*/ } }
Welcome to Lichentia Exchange. We hope you enjoy your visit.


You're currently viewing our forum as a guest. This means you are limited to certain areas of the board and there are some features you can't use. If you join our community, you'll be able to access member-only sections, and use many member-only features such as customizing your profile, sending personal messages, and voting in polls. Registration is simple, fast, and completely free.


Join our community!


If you're already a member please log in to your account to access all of our features:

Username:   Password:
Add Reply
Realtime Clock for p16F877a; Written in C, has Keypad and LCD screen
Topic Started: Dec 16 2006, 01:19 AM (181 Views)
Hammer
Member Avatar
Administrator
[ *  *  * ]
I call it my "Pointer Clock", since I foolishly did the entire lab with pointers, instead of just indexing an array. :lol:

Code:
 

/**************************************************

realtimeclock.c

pic16F877a 20 MHz

Shawn Fisher

Group A

November 13 2005

Instructor: Wayne Mayes



Program Description:

Real time 12 hour am-pm clock



**********Include files******************************/

#include <pic.h>

#include "lcd.h"

#include "delay.h"

#include "keypad.h"

#define RELEASEKEY while(keypad( )){nop;}



//Constant defines

#define nop asm("nop");





//Function Prototypes



interrupt isr_100ms(void);



void output_current_time(unsigned char *ptens_hours, unsigned char *phours,

unsigned char *ptens_minutes, unsigned char *pminutes,unsigned char *ptens_seconds,

unsigned char *pseconds, unsigned char *pampm,unsigned char tens_hours, unsigned char hours,

unsigned char tens_minutes, unsigned char minutes, unsigned char tens_seconds, unsigned char seconds,

unsigned char ampm);





void change_time(unsigned char *ptens_hours, unsigned char *phours, unsigned char *ptens_minutes,

unsigned char *pminutes, unsigned char *ptens_seconds,

unsigned char *pseconds, unsigned char *pampm, unsigned char tens_hours,

unsigned char hours,unsigned char tens_minutes,unsigned char minutes,

unsigned char tens_seconds,unsigned char seconds,unsigned char ampm);



void clock_behave(unsigned char *ptens_hours,unsigned char *phours,

unsigned char *ptens_minutes, unsigned char *pminutes,

unsigned char *ptens_seconds,unsigned char *pseconds,

unsigned char *pampm);



void am_pm_rollover( unsigned char *ptens_hours, unsigned char *phours,

unsigned char *ptens_minutes, unsigned char *pminutes, unsigned char *ptens_seconds,

unsigned char *pseconds, unsigned char *pampm);



void start_ticking(void);



void bootup(void);



void invalid_keypress(void);



unsigned char keypad_debounce( void );



void clear_second_line(void);



void time_ok( void );



//Global Variables



unsigned char ticks;



main(void)

{

//Clock variables

unsigned char minutes;

unsigned char tens_minutes;

unsigned char hours;

unsigned char tens_hours;

unsigned char seconds;

unsigned char tens_seconds;

unsigned char ampm;

unsigned char *ptens_hours;

unsigned char *phours;

unsigned char *ptens_minutes;

unsigned char *pminutes;

unsigned char *ptens_seconds;

unsigned char *pseconds;

unsigned char *pampm;



ptens_hours = &tens_hours;

phours = &hours;    //assign pointers to variables to pass to functions later

ptens_minutes = &tens_minutes;

pminutes = &minutes;

ptens_seconds = &tens_seconds;

pseconds = &seconds;

pampm = &ampm;



bootup( );  //set tris registers and enable interrupts



//Initialize variables here

seconds   = 5; //default time

tens_seconds = 4; //on

minutes   = 9; //reset

tens_minutes = 5; //4:20 PM

hours   = 1; //

tens_hours  = 1; //

ampm   = 1; //I'm going with 0 = AM & 1 = PM



start_ticking( ); //Enable timer1 interrupt



lcd_goto(0x40);  //setup where eeprom data goes on screen

while(1)

{

  if(keypad( )== 'E')

 {

 

   change_time( ptens_hours, phours, ptens_minutes, pminutes,

   ptens_seconds, pseconds, pampm, tens_hours, hours, tens_minutes, minutes,

   tens_seconds, seconds, ampm );

   

 }

 am_pm_rollover( ptens_hours, phours, ptens_minutes, pminutes, ptens_seconds,pseconds, pampm);



 output_current_time(ptens_hours, phours, ptens_minutes, pminutes, ptens_seconds, pseconds, pampm, tens_hours,

 hours, tens_minutes, minutes, tens_seconds, seconds, ampm);



} //end while

} //end main



void

interrupt isr( void )

{

 TMR1H = 0x0B;

 TMR1L += 0xDD; //preload timers

 RD0 ^= 1;

 ticks++;

 TMR1IF = 0;  //clear timer1 flag  

}



void output_current_time(unsigned char *ptens_hours, unsigned char *phours,

unsigned char *ptens_minutes, unsigned char *pminutes,unsigned char *ptens_seconds, unsigned char *pseconds,

unsigned char *pampm, unsigned char tens_hours, unsigned char hours, unsigned char tens_minutes,

unsigned char minutes, unsigned char tens_seconds, unsigned char seconds, unsigned char ampm)

{



clock_behave( ptens_hours, phours, ptens_minutes,

 pminutes, ptens_seconds, pseconds, pampm);



TRISA   =0x04;  //a2 a1 a0

TRISD  =0x00;  //TRISD all inputs except tick RD0

TRISC  =0x00;  //Outputs PortC

TRISB  =0x00;  //keypad.c takes care of keypad port reqs.



lcd_goto( 0x00 );

DelayMs( 5 );

lcd_putch(tens_hours+0x30);

DelayMs( 5 );

lcd_goto( 0x01 );

DelayMs( 5 );

lcd_putch(hours+0x30);

DelayMs( 5 );

lcd_goto( 0x02 );

DelayMs( 5 );

lcd_putch(':');

DelayMs( 5 );

lcd_goto( 0x03 );

DelayMs( 5 );

lcd_putch(tens_minutes+0x30);

DelayMs( 5 );

lcd_goto( 0x04 );

DelayMs( 5 );

lcd_putch(minutes+0x30);

DelayMs( 5 );

lcd_goto( 0x05 );

DelayMs( 5 );

lcd_putch(':');

DelayMs( 5 );

lcd_goto( 0x06 );

DelayMs( 5 );

lcd_putch(tens_seconds+0x30);

DelayMs( 5 );

lcd_goto( 0x07 );

DelayMs( 5 );

lcd_putch(seconds+0x30);

DelayMs( 5 );



if( ampm == 0 )

{

 lcd_goto(0x09); //cursor at position 9 to put in AM/PM

 lcd_puts("AM");

 DelayMs( 5 );

}

else if( ampm == 1 )

{

 lcd_goto(0x09); //cursor at position 9 to put in AM/PM

 lcd_puts("PM");

 DelayMs( 5 );

}

else

{

 lcd_goto(0x09); //cursor at position 9 to put in AM/PM

 lcd_puts("PM");

 DelayMs( 5 );

}



}



void clock_behave(unsigned char *ptens_hours,unsigned char *phours,unsigned char *ptens_minutes,

unsigned char *pminutes,unsigned char *ptens_seconds,unsigned char *pseconds,unsigned char *pampm )

{





 if(ticks > 9)  //1

 {

 ticks = 0;  //reset

 *pseconds = *pseconds + 1;   //increment every 10 x 100 mS

  //lets see it

 }



 if(*pseconds > 9 ) //rollover conditions

 {

 *pseconds = 0;

 *ptens_seconds = *ptens_seconds + 1;

 //process time registers

 }



 if( *ptens_seconds > 5 )

 {

 *ptens_seconds = 0;

 *pminutes = *pminutes + 1;

 }



 if( *pminutes > 9 )

 {

 *pminutes = 0;

 *ptens_minutes = *ptens_minutes + 1;

 }



 if( *ptens_minutes > 5)

 {

 *ptens_minutes = 0;

 *phours = *phours + 1;

 }



 if(*phours > 9)

 {

 *phours = 0;

 *ptens_hours = *ptens_hours + 1;

 }



 if(( *ptens_hours > 0 ) && ( *phours > 2 ))

 {

 *ptens_hours = 0;

 *phours = 1;

 *ptens_minutes = 0;

 *pminutes = 0;

 *ptens_seconds = 0;

 *pseconds = 0;

 }

 

 am_pm_rollover( ptens_hours, phours, ptens_minutes, pminutes, ptens_seconds,pseconds, pampm);

}



void change_time(unsigned char *ptens_hours,unsigned char *phours,

unsigned char *ptens_minutes,unsigned char *pminutes,

unsigned char *ptens_seconds,unsigned char *pseconds,

unsigned char *pampm, unsigned char tens_hours, unsigned char hours,

unsigned char tens_minutes,unsigned char minutes,unsigned char tens_seconds,

unsigned char seconds, unsigned char ampm)

{

unsigned char key;

unsigned char key1;

unsigned char key2;

unsigned char key3;

unsigned char key5;



 lcd_goto( 0x40 );

 lcd_puts("[1][2]:[3][4]   ");



 

  key = keypad( );

  RELEASEKEY;

  while(!keypad())

  {

  key = keypad( );

  }

  RELEASEKEY;

 

  switch(key)

  {

  case '1':



   lcd_goto( 0x40 );

   DelayMs( 5 );

   lcd_puts("Ten Hours[1]OR[0]");

   DelayMs( 5 );



   key5 = keypad( ); //time to be entered

   RELEASEKEY;

   while(!keypad())

   {

   key5 = keypad( ); //time to be entered    }

   RELEASEKEY;



   switch(key5)

   {

   case '0':

   

   *ptens_hours = 0; //assign to pointer

   break;

   

   case '1':

   

   *ptens_hours = 1; //assign to pointer

   break;



   default:



   *ptens_hours = 0; //bad keypress function

   



   }//end switch

   

   break;

 

    //end case 1

   

  case '2':

 

  lcd_goto( 0x40 );

  DelayMs( 5 );

  lcd_puts("Enter hours    ");

  DelayMs( 5 );



  key1 = keypad( );

  RELEASEKEY;

  while(!keypad())

  {

  key1 = keypad( );

  }

  RELEASEKEY;



   switch(key1)

   {

   case '0':

   *phours = 0; //assign

   break;

   case '1':

   *phours = 1; //assign

   break;

   case '2':

   *phours = 2; //assign

   break;

   case '3':

   *phours = 3; //assign

   break;

   case '4':

   *phours = 4; //assign

   break;

   case '5':

   *phours = 5; //assign

   break;

   case '6':

   *phours = 6; //assign

   break;

   case '7':

   *phours = 7; //assign

   break;

   case '8':

   *phours = 8; //assign

   break;

   case '9':

   *phours = 9; //assign

   break;

   default:

   invalid_keypress( );

   

    }//while key1

   break;  //case 2 clock hours break

   

  case '3':

 



  lcd_goto( 0x40 );

  DelayMs( 5 );

  lcd_puts("Ten minutes 0-5");

  DelayMs( 5 );



  key2 = keypad( );

  RELEASEKEY;

  while(!keypad())

  {

  key2 = keypad( );

  }

  RELEASEKEY;



  switch(key2)

  {

  case '0':

  *ptens_minutes = 0;

  break;

  case '1':

  *ptens_minutes = 1;

  break;

  case '2':

  *ptens_minutes = 2;

  break;

  case '3':

  *ptens_minutes = 3;

  break;

  case '4':

  *ptens_minutes = 4;

  break;

  case '5':

  *ptens_minutes = 5;

  break;



  default:

  invalid_keypress( );  //inform user of bad press

 

  }//end while

  break;  //tens minutes break

 

   

   case '4':  //change minutes



   lcd_goto(0x40);

   DelayMs( 5 );

   lcd_puts("Enter minutes  ");



   key3 = keypad( );

   RELEASEKEY;

   while(!keypad())

   {

   key3 = keypad( );

   }

   RELEASEKEY;



   switch(key3) //minutes entered switch

   {

   case '0':

   *pminutes = 0;

   *ptens_seconds = 0; //always

   *pseconds = 0;  //reset seconds

   break;



   case '1':

   *pminutes = 1;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   case '2':

   *pminutes = 2;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;

 

   case '3':

   *pminutes = 3;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;

 

   case '4':

   *pminutes = 4;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   case '5':

   *pminutes = 5;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   case '6':  

   *pminutes = 6;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   case '7':

   *pminutes = 7;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;

 

   case '8':

   *pminutes = 8;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   case '9':

   *pminutes = 9;

   *ptens_seconds = 0;

   *pseconds = 0;

   break;



   default:

   invalid_keypress( );  //error message

   }//while key3

   break;

   

 } //end switch

}//end function



void bootup(void)

{

TRISA   =0x04;  //a2 a1 a0

TRISD  =0;  //TRISD all inputs except tick RD0

// TRISC  =0;  //Outputs PortC

TRISB  =0;  //keypad.c takes care of keypad port reqs.

ADCON1     =0x06;  //turn off a/d converters

RBPU   = 0;   //turn on weak pullups portb 4-7

T1CON  =0x31;   //enable Timer1 prescaler 8:1

PEIE  = 1;   //enable peripheral interrupt

GIE     = 1;   //enable global interrupt

lcd_init( );   //4 bit mode line 1

lcd_clear();

lcd_goto(0x40);  //rezero cursor

DelayMs( 5 );

lcd_puts("Shawn");

}



void time_ok( void )

{

lcd_goto( 0x40 ); //zero cursor

lcd_puts("                    "); //clear lcd line

lcd_goto(0x40);  //rezero cursor

lcd_puts("Ok?[A]Yes[B]No");

}



void invalid_keypress( void )

{



lcd_goto( 0x40 );

DelayMs( 5 );

lcd_puts("                                 ");

DelayMs( 5 );

lcd_goto( 0x40 );    

DelayMs( 5 );

lcd_puts("Bad Keypress");  //error handling code

}



void start_ticking(void)

{

TMR1IE   =1;   //enable Timer1 interrupt  

RBIF   =0;  //pins change state due to keypad

}



void am_pm_rollover( unsigned char *ptens_hours, unsigned char *phours,

unsigned char *ptens_minutes, unsigned char *pminutes, unsigned char *ptens_seconds,

unsigned char *pseconds, unsigned char *pampm )

{

//pm to am rollover

 if((*pampm == 1) && ( *ptens_hours == 1 ) && ( *phours == 2 ) && ( *ptens_minutes == 0)

 && (*pminutes == 0) && (*ptens_seconds == 0) && (*pseconds == 0) && (ticks == 0))

 {

 *pampm = 0;

 }

//am to pm rollover

 else if((*pampm == 0) && ( *ptens_hours == 1 ) && ( *phours == 2 ) && ( *ptens_minutes == 0)

 && (*pminutes == 0) && (*ptens_seconds == 0) && (*pseconds == 0) && (ticks == 0))

 {

 *pampm = 1;

 }

 

 else if(( *phours == 0) && ( *ptens_hours == 0)) //bugfix

 {

 *phours = 0;

 *phours = 1;

 }

 

}



void clear_second_line(void)

{

  lcd_goto(0x40);

  DelayMs( 5 );

  lcd_puts("                                           ");

  DelayMs( 5 );

}



unsigned char keypad_debounce( void )

{

unsigned char keypressed_db;

keypressed_db = keypad( );

  RELEASEKEY;

  while(!keypad())

  {

  keypressed_db = keypad( );

  }

return keypressed_db;

}

Offline Profile Quote Post Goto Top
 
Prez
Member
[ *  * ]
wtf?
Offline Profile Quote Post Goto Top
 
Several Contradictions
Newbie
[ * ]
Gangsta
Dec 16 2006, 11:51 AM
wtf?

I agree, WTF?
Offline Profile Quote Post Goto Top
 
Hammer
Member Avatar
Administrator
[ *  *  * ]
Well, if you knew how to code in C or C++ you'd probably be snickering at how foolishly I over-complicated this program.
Offline Profile Quote Post Goto Top
 
1 user reading this topic (1 Guest and 0 Anonymous)
« Previous Topic · Hammer's Old Labs · Next Topic »
Add Reply