📄 clock.c
字号:
#include<pic.h>
#define uchar unsigned char
#define RS RA0
#define RW RA1
#define E RA2
uchar buffer;
uchar i;
const uchar table[12]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,0x3a,0x2f};
uchar timer[7]; // 定义一数组用来存放读取的时间
//日期信息timer[0],timer[1]等分别存放秒,分等
bit flag; //flag为1时表示LCD忙,为0时才可以对其进行读或写操作
void initialIO();
uchar bank2 date[13];
void initialI2C();
void start(); //产生起始位
void stop(); //产生停止位
void restart(); //产生重复起始位
void initialCLOCK(); //时钟DS1307初始设置
void initialLCD(); //液晶驱动器HD44780初始化
void writebyte(uchar);
void readtimer();
void delay5ms();
void readBUSY();
void display();
void count();
void resetADDRESS(); //复位DS1307的指针,使其指向秒单元即指针的内容为0
void initialIO()
{
TRISB=0X00;
TRISA=0x00;
TRISD=0x07;
PORTB=0x00;
ADCON1=0x06;
}
void initialI2C()
{
SSPSTAT=0;
SSPCON=0x28;
SSPADD=90;
SSPIF=0;
}
void delay5ms()
{
TMR0IF=0;
OPTION=0x06;
TMR0=217;
while(TMR0IF==0);
}
void readBUSY()
{E=0;
flag=1;
TRISB=0xff;
asm("nop");
asm("nop");
RS=0;
RW=1;
asm("nop");
E=1;
asm("nop");
buffer=PORTB;
buffer&=0x80;
if (buffer==0)
{flag=0;}
TRISB=0;
asm("nop");
asm("nop");
RW=0;
asm("nop");
asm("nop");
}
void start()
{
SSPIF=0;
SEN=1;
while(SSPIF==0);
SSPIF=0;}
void stop()
{
SSPIF=0;
PEN=1;
while(SSPIF==0);
SSPIF=0;}
void restart()
{
SSPIF=0;
RSEN=1;
while(SSPIF==0);
SSPIF=0;}
void resetADDRESS()
{
restart();
buffer=0xd0;
writebyte(buffer);
buffer=0;
writebyte(buffer);
stop();
}
void writebyte(uchar k)
{
SSPIF=0;
SSPBUF=k;
while(SSPIF==0);
SSPIF=0;}
void readtimer()
{
restart();
buffer=0xd1;
ACKSTAT=1;
writebyte(buffer);
if(ACKSTAT==1)
{RA3=1;
while(1);}
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[0]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[1]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[2]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[3]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[4]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[5]=SSPBUF;
ACKDT=0;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
SSPIF=0;
timer[6]=SSPBUF;
ACKDT=1;
ACKEN=1;
while(SSPIF==0);
SSPIF=0;
stop();
}
void initialCLOCK()
{ restart();
buffer=0xd0;
ACKSTAT=1;
writebyte(buffer);
if (ACKSTAT==1)
{RA3=1;
while(1);}
buffer=0x00;
writebyte(buffer);
buffer=0x00; //初始化时间second=0,CH=0
writebyte(buffer);
buffer=0;
writebyte(buffer); //minute=0
buffer=0x12; //hour=12,时间为24小时制时间初始化为12:00:00
writebyte(buffer);
buffer=0x06; //week=6
writebyte(buffer);
buffer=0x16; //date=16
writebyte(buffer);
buffer=0x02; //month=2
writebyte(buffer);
buffer=0x07; //year=2007
ACKSTAT=1;
writebyte(buffer);
if (ACKSTAT==1)
{RA3=1;
while(1);}
buffer=0x10;
writebyte(buffer);
stop();
}
void initialLCD()
{
delay5ms();
delay5ms();
delay5ms();
E=1;
RS=0;
RW=0;
PORTB=0x38;
asm("nop");
E=0;
delay5ms();
E=1;
PORTB=0x38;
asm("nop");
E=0;
delay5ms();
E=1;
asm("nop");
PORTB=0x38;
asm("nop");
E=0;
asm("nop");
flag=1;
while(flag==1)
{readBUSY();
}
PORTB=0x38; //功能设置:8位数据接口,2行显示,5X7点阵字符
asm("nop");
E=0;
flag=1;
while(flag==1)
{
readBUSY();
}
PORTB=0x01; //清屏
asm("nop");
E=0;
flag=1;
while(flag==1)
{
readBUSY();
}
PORTB=0x02; //光标归位
asm("nop");
E=0;
flag=1;
while(flag==1)
{
readBUSY();
}
PORTB=0x06; //输入设置:地址指针自动增1,数据读写后画面不动
asm("nop");
flag=1;
while(flag==1)
{
readBUSY();
}
PORTB=0x0c; // 显示开关打开,光标和闪烁开关皆关断
asm("nop");
E=0;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
E=1;
PORTB=0xc0;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;
PORTB=0x4d; //M
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc1;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x69; //i
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc2;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x63; //c
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc3;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x72; //r
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc4;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x6f; //o
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc5;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x63; //c
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc6;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x68; //h
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc7;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x69; //i
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc8;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x70; //p
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xc9;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x10; //""
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xca;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x50; //P
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xcb;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x49; //I
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xcc;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x43; //C
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=0;RW=0;
PORTB=0xcd;
E=0;E=1;
flag=1;
while(flag==1)
{
readBUSY();
}
RS=1;RW=0;
PORTB=0x10; //""
E=0;E=1;
}
void count()
{
if (timer[0]>9) //second>9s
{buffer=timer[0];
buffer&=0xf0;
buffer>>=4;
date[0]=buffer;
timer[0]&=0x0f;
date[1]=timer[0];
}
else
{date[0]=0;
date[1]=timer[0];}
if (timer[1]>9) //minute>9min
{buffer=timer[1];
buffer&=0xf0;
buffer>>=4;
date[2]=buffer;
timer[1]&=0x0f;
date[3]=timer[1];
}
else
{date[2]=0;
date[3]=timer[1];}
if (timer[2]>9) //hour>9hour
{buffer=timer[2];
buffer&=0xf0;
buffer>>=4;
date[4]=buffer;
timer[2]&=0x0f;
date[5]=timer[2];
}
else
{date[4]=0;
date[5]=timer[2];
}
date[6]=timer[3];
if (timer[4]>9)
{buffer=timer[4];
buffer&=0xf0;
buffer>>=4;
date[7]=buffer;
timer[4]&=0x0f;
date[8]=timer[4];
}
else
{date[7]=0;
date[8]=timer[4];}
if (timer[5]>9)
{buffer=timer[5];
buffer&=0xf0;
buffer>>=4;
date[9]=buffer;
timer[5]&=0x0f;
date[10]=timer[5];
}
else
{date[9]=0;
date[10]=timer[5];
}
date[11]=0;
date[12]=timer[6];
}
void display()
{
flag=1;
while(flag==1)
{readBUSY();
}
PORTB=0x85; //设置显示的字符的首地址在第1行第5列
asm("nop");
E=0;
flag=1;
asm("nop");
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[4]];
asm("nop");
E=0;
flag=1;
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[5]];
asm("nop");
E=0;
flag=1;
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[10];
asm("nop");
E=0;
flag=1;
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[2]];
asm("nop");
E=0;
flag=1;
asm("nop");
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[3]];
asm("nop");
E=0;
flag=1;
asm("nop");
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[10];
asm("nop");
E=0;
flag=1;
asm("nop");
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[0]];
asm("nop");
E=0;
flag=1;
asm("nop");
while(flag==1)
{readBUSY();}
RS=1;
RW=0;
asm("nop");
PORTB=table[date[1]];
asm("nop");
E=0;
}
/*******************/
void main()
{ flag=1;
initialIO();
initialI2C();
resetADDRESS();
initialCLOCK();
initialLCD();
//while(1);
while(1)
{
resetADDRESS();
readtimer();
count();
display();}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -