#include<P18F458.h>
#include<string.h>
#pragma config WDT = OFF
#define ldata PORTD // Data port for LCD
#define SCKHIGH SCK=1;
#define SCKLOW SCK=0;
#define SDAHIGH SDA=1;
#define SDALOW SDA=0;
#define SCK PORTEbits.RE1 //serial clock pin
#define SDA PORTEbits.RE0 //serial data pin
#define rs PORTBbits.RB3
#define rw PORTBbits.RB4
#define en PORTBbits.RB5
#define start1 PORTCbits.RC4
#define hr PORTCbits.RC0
#define min PORTCbits.RC1
#define date PORTCbits.RC2
#define month PORTCbits.RC3
void set_time();
void delay_ms(unsigned int i);
unsigned char num(int);
void lcd_data_int(int );
void write_i2c(unsigned char device_id,unsigned char location,unsigned char c);
unsigned int num1;
unsigned char slave_ack,add=0,c,d,e,f,g,h;
unsigned int hr1,min1,date1,month1,hr2,min2,date2,month2;
unsigned char clock[10];
const char set[]="Set Time & Date";
const char name[]="Home Security";
const char name1[]="Systems";
const char thn[]="Start";
const char thn1[]="Stop";
void delay(unsigned int msec)
{
unsigned int i,j ;
for(i=0;i<msec;i++)
for(j=0;j<135;j++);
}
void delay_us(int time)
{
unsigned int i;
T0CON=0x08;
for(i=0;i<=time;i++)
{
TMR0L=0xff;
TMR0H=0xff;
T0CONbits.TMR0ON=1;
while(INTCONbits.TMR0IF==0);
T0CONbits.TMR0ON=0;
INTCONbits.TMR0IF=0;
}
}
void lcd_cmd(unsigned char item)
{
ldata = item;
rs= 0;
rw=0;
en=1;
delay(1);
en=0;
}
// LCD DATA SENDING FUNCTION
void lcd_data(unsigned char item)
{
ldata = item;
rs= 1;
rw=0;
en=1;
delay(1);
en=0;
}
// LCD STRING SENDING FUNCTION
void lcd_string(const char str[])
{
unsigned int i,l;
l=strlen(str);
for(i=0;i<l;i++)
{
lcd_data(str[i]);
delay(15);
}
}
void lcdinit()
{
lcd_cmd(0x38);
delay(10);
lcd_cmd(0x0E);
delay(10);
lcd_cmd(0x01);
delay(10);
lcd_cmd(0x06);
delay(10);
lcd_cmd(0x80);
delay(10);
}
void main()
{
TRISB=0;
TRISD=0;
TRISCbits.TRISC0=0;
TRISCbits.TRISC1=0;
TRISCbits.TRISC2=0;
TRISCbits.TRISC3=0;
TRISCbits.TRISC4=0;
TRISEbits.TRISE0=1;
TRISEbits.TRISE1=1;
TRISA=0x0f;
start1=1;
lcdinit();
set_time();
clock[6]=0x13;
while(add<=6) //update real time clock
{
write_i2c(0xd0,add,clock[add]);
add++;
}
while(1)
{
lcd_cmd(0x01);
lcd_cmd(0x80);
lcd_string(name);
delay_us(1);
lcd_cmd(0xc0);
lcd_string(name1);
delay_us(100000);
}
}
void set_time()
{
lcd_cmd(0x01);
lcd_cmd(0x80);
lcd_string(set);
while(start1==0)
{
if(hr==0)
hr2=set_hr();
clock[2]=num(hr2);
if(min==0)
min2=set_min();
clock[1]=num(min2);
if(date==0)
date2=set_date();
clock[4]=num(date2);
if(month==0)
month2=set_month();
clock[5]=num(month2);
}
}
int set_min() // Function to set minutes digit of clock
{
delay_ms(50);
min1++;
if(min1>59)
min1=0;
lcd_cmd(0xc3);
lcd_data_int(min1);
return min1;
}
int set_hr()
{
delay_ms(50);
hr1++;
if(hr1>23)
hr1=0;
lcd_cmd(0xc0);
lcd_data_int(hr1);
lcd_data(':');
return hr1;
}
int set_date()
{
delay_ms(50);
date1++;
if(date1>31)
date1=1;
lcd_cmd(0xc6);
lcd_data_int(date1);
lcd_data('/');
return date1;
}
int set_month()
{
delay_ms(50);
month1++;
if(month1>12)
month1=1;
lcd_cmd(0xc9);
lcd_data_int(month1);
return month1;
}
unsigned char num(int d)
{
switch(d)
{
case 0:{
return 0x00;
break;
}
case 1:{
return 0x01;
break;
}
case 2:{
return 0x02;
break;
}
case 3:{
return 0x03;
break;
}
case 4:{
return 0x04;
break;
}
case 5:{
return 0x05;
break;
}
case 6:{
return 0x06;
break;
}
case 7:{
return 0x07;
break;
}
case 8:{
return 0x08;
break;
}
case 9:{
return 0x09;
break;
}
case 10:{
return 0x10;
break;
}
case 11:{
return 0x11;
break;
}
case 12:{
return 0x12;
break;
}
case 13:{
return 0x13;
break;
}
case 14:{
return 0x14;
break;
}
case 15:{
return 0x15;
break;
}
case 16:{
return 0x16;
break;
}
case 17:{
return 0x17;
break;
}
case 18:{
return 0x18;
break;
}
case 19:{
return 0x19;
break;
}
case 20:{
return 0x20;
break;
}
case 21:{
return 0x21;
break;
}
case 22:{
return 0x22;
break;
}
case 23:{
return 0x23;
break;
}
case 24:{
return 0x24;
break;
}
case 25:{
return 0x25;
break;
}
case 26:{
return 0x26;
break;
}
case 27:{
return 0x27;
break;
}
case 28:{
return 0x28;
break;
}
case 29:{
return 0x29;
break;
}
case 30:{
return 0x30;
break;
}
case 31:{
return 0x31;
break;
}
case 32:{
return 0x32;
break;
}
case 33:{
return 0x33;
break;
}
case 34:{
return 0x34;
break;
}
case 35:{
return 0x35;
break;
}
case 36:{
return 0x36;
break;
}
case 37:{
return 0x37;
break;
}
case 38:{
return 0x38;
break;
}
case 39:{
return 0x39;
break;
}
case 40:{
return 0x40;
break;
}
case 41:{
return 0x41;
break;
}
case 42:{
return 0x42;
break;
}
case 43:{
return 0x43;
break;
}
case 44:{
return 0x44;
break;
}
case 45:{
return 0x45;
break;
}
case 46:{
return 0x46;
break;
}
case 47:{
return 0x47;
break;
}
case 48:{
return 0x48;
break;
}
case 49:{
return 0x49;
break;
}
case 50:{
return 0x50;
break;
}
case 51:{
return 0x51;
break;
}
case 52:{
return 0x52;
break;
}
case 53:{
return 0x53;
break;
}
case 54:{
return 0x54;
break;
}
case 55:{
return 0x55;
break;
}
case 56:{
return 0x56;
break;
}
case 57:{
return 0x57;
break;
}
case 58:{
return 0x58;
break;
}
case 59:{
return 0x59;
break;
}
}
}
void lcd_data_int(int time_val) // Function to send number to LCD
{
int int_amt;
int_amt=time_val/10;
lcd_data(int_amt+48);
int_amt=time_val%10;
lcd_data(int_amt+48);
}
void delay_ms(unsigned int i)
{
unsigned int j;
while(i-->0)
{
for(j=0;j<500;j++)
{
;
}
}
}
//starts i2c, if both SCK & SDA are idle
void start(void)
{
if(SCK==0) //check SCK. if SCK busy, return else SCK idle
return;
if(SDA==0) //check SDA. if SDA busy, return else SDA idle
return;
SDALOW //data low
delay_us(1);
SCKLOW //clock low
delay_us(1);
}
//stops i2c, releasing the bus
void stop(void)
{
SDALOW //data low
SCKHIGH //clock high
delay_us(1);
SDAHIGH //data high
delay_us(1);
}
//transmits one byte of data to i2c bus
void send_byte(unsigned char c)
{
unsigned mask=0x80;
do //transmits 8 bits
{
if(c&mask) //set data line accordingly(0 or 1)
SDAHIGH //data high
else
SDALOW //data low
SCKHIGH //clock high
delay_us(1);
SCKLOW //clock low
delay_us(1);
mask/=2; //shift mask
}
while(mask>0);
SDAHIGH //release data line for acknowledge
SCKHIGH //send clock for acknowledge
delay_us(1);
slave_ack=SDA; //read data pin for acknowledge
SCKLOW //clock low
delay_us(1);
}
//receives one byte of data from i2c bus
unsigned char receive_byte(unsigned char master_ack)
{
unsigned char c=0,mask=0x80;
do //receive 8 bits
{
SCKHIGH //clock high
delay_us(1);
if(SDA==1) //read data
c|=mask; //store data
SCKLOW //clock low
delay_us(1);
mask/=2; //shift mask
}
while(mask>0);
if(master_ack==1)
SDAHIGH //don't acknowledge
else
SDALOW //acknowledge
SCKHIGH //clock high
delay_us(1);
SCKLOW //clo
RTC.rar_The Program
版权申诉
89 浏览量
2022-09-19
20:53:03
上传
评论
收藏 2KB RAR 举报
Kinonoyomeo
- 粉丝: 77
- 资源: 1万+