#include <p18f1220.h>
#include <delays.h>
#include <string.h>
#define CS PORTAbits.RA1
#define STD PORTAbits.RA2
#define SCLK PORTAbits.RA3
#define RST PORTAbits.RA4
#define LEDA PORTBbits.RB5
#define DATA 1
#define COMM 0
//CS连接RA1,STD连接RA2,SCLK连接RA3,RST连接RA4,LEDA连接RB5固定连接
struct date_time
{
unsigned char year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
};
struct date_time nowtime = {7,7,30,23,59,57};
static char s3[16];
char s2[16];
void init_lcd(void);
void wr_LCD(unsigned char rs, unsigned char data);
void addsecond(void);
void inti_time(void);
void write_time(void);
unsigned int leep(unsigned int);
unsigned int daysofmonth(unsigned int, unsigned int);
void addsecond(void);
void write_time(void);
void init_lcd()//初始化
{
ADCON1 |= 0x0E;//数字
TRISA &= 0xE1;//输出
TRISBbits.TRISB5 = 0;//设置RB5位为输出位
CS = 0;
STD = 0;
SCLK = 0;
RST = 0;
LEDA = 0;
Delay10KTCYx(6);
RST = 1;
Delay10KTCYx(10);
LEDA = 1;
wr_LCD(COMM, 0X30);
wr_LCD(COMM, 0X01);
Delay10KTCYx(25);
wr_LCD(COMM, 0X06);
wr_LCD(COMM, 0X0C);
}
void wr_LCD(unsigned char rs, unsigned char data)
{
int i;
CS = 1;
STD = 1;
for(i = 0; i < 5; i++)//前五位固定
{
SCLK = 1;
SCLK = 0;
}
STD = 0;//6位 置0写数据 置1读数据
SCLK = 1;
SCLK = 0;
STD = rs;//7位 置1数据模式 0命令模式
SCLK = 1;
SCLK = 0;
STD = 0;//8位置0 固定
SCLK = 1;
SCLK = 0;
for(i = 7; i >= 4; i--)//9、10、11、12、位数据
{
STD = data >> i;
SCLK = 1;
SCLK = 0;
}
STD = 0;
for(i = 0; i < 4; i++)//固定
{
SCLK = 1;
SCLK = 0;
}
for(i = 3; i >= 0; i--)//17、18、19、20位数据
{
STD = data >> i;
SCLK = 1;
SCLK = 0;
}
STD = 0;
for(i = 0; i < 4; i++)//固定
{
SCLK = 1;
SCLK = 0;
}
CS = 0;
}
void inti_time()
{
INTCON = 0; //关闭所有中断
RCONbits.IPEN = 1; //使能中断优先级
INTCON = 0xB0;
INTCON2 = 0x04;
T0CON = 0X82;
INTCONbits.GIEH = 1;
}
#pragma interrupt InterruptHandlerHigh
#pragma code InterruptVectorHigh = 0X08
void InterruptVectorHigh(void){
_asm
goto InterruptHandlerHigh
_endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh(){
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
addsecond();
write_time();
TMR0H = 0X8B;
TMR0L = 0XDC;
}
}
unsigned int leap(unsigned int year)
{
return !(year%400)||(!(year%4)&&(year%100));
}
unsigned int daysofmonth(unsigned int year,unsigned int month)
{
switch(month)
{
case 2:
return 28 + leap(year);
case 4:
case 6:
case 9:
case 11:
return 30;
}
return 31;
}
void addsecond(void)
{
nowtime.second ++;
if(nowtime.second < 60) return;
nowtime.second = 0;
nowtime.minute ++;
if(nowtime.minute < 60) return;
nowtime.minute = 0;
nowtime.hour ++;
if(nowtime.hour < 24) return;
nowtime.hour = 0;
nowtime.day ++;
if(nowtime.day < daysofmonth(nowtime.year,nowtime.month)) return;
nowtime.day = 1;
nowtime.month ++;
if(nowtime.month <= 12) return;
nowtime.month = 1;
nowtime.year ++;
}
void write_time()
{
int i, j;
s3[0] = 50;
s3[1] = nowtime.year / 100 + '0';
s3[2] = nowtime.year / 10 % 10 + '0';
s3[3] = nowtime.year % 10 + '0';
s3[4] = '/';
s3[5] = nowtime.month / 10 + '0';
s3[6] = nowtime.month % 10 + '0';
s3[7] = '/';
s3[8] = nowtime.day / 10 + '0';
s3[9] = nowtime.day % 10 + '0';
s2[0] = nowtime.hour / 10 + '0';
s2[1] = nowtime.hour % 10 + '0';
s2[2] = ':';
s2[3] = nowtime.minute / 10 + '0';
s2[4] = nowtime.minute % 10 + '0';
s2[5] = ':';
s2[6] = nowtime.second / 10 + '0';
s2[7] = nowtime.second % 10 + '0';
wr_LCD(COMM, 0x90);
for(i = 0; i < 10; i++)
{
wr_LCD(DATA, s3[i]);
}
wr_LCD(COMM, 0x88);
for(i = 0; i < 8; i++)
{
wr_LCD(DATA, s2[i]);
}
}
void main()
{
inti_time();
init_lcd();
while(1);
}
评论0