- Posts:
- 67
- Group:
- Head Administrator of Lichentia
- Member
- #1
- Joined:
- December 5, 2006
|
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 = &m;
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;
}
|