#include<iom16v.h>
#include<macros.h>
/***********************
MOT-GND //选择Intel模式
SQW //空
AD0~AD7 //PD0~PD7数据总线
IRQ-PB0 //中断请求
REET-VCC//复位脚
DS-PB1
R/W-PB2
AS-PB3
CS-GND
***********************/
#define DS_1 PORTB|=(1<<1)
#define DS_0 PORTB&=~(1<<1)
#define DS_Out DDRB|=(1<<1)
#define RW_H PORTB|=(1<<2)
#define RW_L PORTB&=~(1<<2)
#define RW_Out DDRB|=(1<<2)
#define AS_1 PORTB|=(1<<3)
#define AS_0 PORTB&=~(1<<3)
#define AS_Out DDRD|=(1<<3)
/*#define CS_1 PORTB|=(1<<4)
#define CS_0 PORTB&=~(1<<4)
#define CS_Out DDRB|=(1<<4)*/
#define RS_0 PORTA &= ~BIT(5);
#define RS_1 PORTA |= BIT(5);
#define RS_OUT DDRA |= BIT(5);
#define RW_0 PORTA &= ~BIT(6);
#define RW_1 PORTA |= BIT(6);
#define RW_OUT DDRA |= BIT(6);
#define E_0 PORTA &= ~BIT(7);
#define E_1 PORTA |= BIT(7);
#define E_OUT DDRA |= BIT(7);
#define DS12887_Second 0x00 //秒
#define DS12887_Minute 0x02 //分
#define DS12887_Hour 0x04 //时
#define DS12887_Week 0x06 //星期
#define DS12887_Day 0x07 //日
#define DS12887_Month 0x08 //月
#define DS12887_Year 0x09 //年
unsigned char DateString[9];
unsigned char TimeString[9];
//定义时间类型,结构体数据类型
typedef struct _SYSTEMTIME_
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
}SYSTEMTIME;
void delay_ms(unsigned int xms)
{
unsigned int i,j;
for(i=0;i<xms;i++)
for(j=0;j<1140;j++);
}
void write_com(unsigned char com)
{
RS_1;
RW_1;
E_0;
RS_0;
RW_0;
PORTC = com;
delay_ms(1);
E_1;
delay_ms(1);
E_0;
}
void write_data(unsigned char data)
{
RS_0;
RW_1;
E_0;
RS_1;
RW_0;
PORTC = data;
delay_ms(1);
E_1;
delay_ms(1);
E_0;
}
int lcd_init(void)
{
DDRC = 0XFF;
PORTC = 0;
RS_OUT;
E_OUT;
RW_OUT;
delay_ms(20);
write_com(0x38);
delay_ms(5);
write_com(0x38);
delay_ms(5);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0C);
}
void port_init(void)
{
DDRB = 0xFF;
PORTB = 0xFF;
DDRD = 0x00;
PORTD = 0x00;
}
/**DS12C887写数据**/
void DS12C887_Write(unsigned char add,unsigned char dat)
{
AS_0;
_NOP();
_NOP();
DS_1;
_NOP();
_NOP();
RW_H;
_NOP();
_NOP();
AS_1;
_NOP();
_NOP();
DDRD=0xff;
_NOP();
_NOP();
_NOP();
_NOP();
PORTD=add;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
AS_0;
_NOP();
_NOP();
RW_L;
_NOP();
_NOP();
_NOP();
PORTD=dat;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
RW_H;
_NOP();
_NOP();
_NOP();
AS_1;
_NOP();
_NOP();
}
/**在DS12C887指定地址中读数据**/
unsigned char DS12C887_Read(unsigned char add)
{
unsigned char temp=0;
AS_0;
_NOP();
_NOP();
DS_1;
_NOP();
_NOP();
RW_H;
_NOP();
_NOP();
AS_1;
_NOP();
_NOP();
DDRD=0xff;
_NOP();
_NOP();
_NOP();
_NOP();
PORTD=add;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
AS_0;
_NOP();
_NOP();
DS_0;
_NOP();
_NOP();
DDRD=0x00;
_NOP();
_NOP();
_NOP();
_NOP();
temp=PIND;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
DS_1;
_NOP();
_NOP();
AS_1;
_NOP();
_NOP();
return temp;
}
/**DS12C887初始化函数**/
void DS12C887_Init(void)
{
DS12C887_Write(0x0a,0x20);
DS12C887_Write(0x0b,0x86);
DS12C887_Write(0x0b,0x06);
}
/**DS12C887设置时间函数**/
void DS12C887_SetTime(unsigned char add,unsigned char dat)
{
DS12C887_Write(0x0b, 0x86); //禁止更新,接下来初始化数据,即写入时间,日期等
DS12C887_Write(add,dat);
DS12C887_Write(0x0b, 0x06); //正常更新,二进制格式,24进制小时
}
/**DS12C887读出时间函数**/
void DS12C887_GetTime(SYSTEMTIME *Time)
{
unsigned char temp;
Time->Second = DS12C887_Read(DS12887_Second);
Time->Minute = DS12C887_Read(DS12887_Minute);
Time->Hour = DS12C887_Read(DS12887_Hour );
Time->Day = DS12C887_Read(DS12887_Day );
//Time->Week = DS12887_Read(DS12887_Week );
Time->Month = DS12C887_Read(DS12887_Month );
Time->Year = DS12C887_Read(DS12887_Year );
}
/*********************日期转化成字符 09-02-19************/
void DateToStr(SYSTEMTIME *Time)
{
DateString[0] = Time->Year/10 + '0';
DateString[1] = Time->Year%10 + '0';
DateString[2] = '-';
DateString[3] = Time->Month/10 + '0';
DateString[4] = Time->Month%10 + '0';
DateString[5] = '-';
DateString[6] = Time->Day/10 + '0';
DateString[7] = Time->Day%10 + '0';
//DateString[8] = '\0';
}
/*********************时间转化成字符***********************************/
void TimeToStr(SYSTEMTIME *Time)
{
TimeString[0] = Time->Hour/10 +'0';
TimeString[1] = Time->Hour%10 +'0';
TimeString[2] = ':';
TimeString[3] = Time->Minute/10 + '0';
TimeString[4] = Time->Minute%10 + '0';
TimeString[5] = ':';
TimeString[6] = Time->Second/10 + '0';
TimeString[7] = Time->Second%10 + '0';
//TimeString[8] = '\0';
}
void main(void)
{
SYSTEMTIME CurrentTime;
//unsigned char DateString[9];
//unsigned char TimeString[9];
unsigned char temp;
unsigned char i;
port_init();
lcd_init();
DS12C887_Init(); //只读时间的时候可以屏蔽该句
DS12C887_GetTime(&CurrentTime);
/*************时间初始化设置 ,2009-3-4 16:57:00************/
//时钟调准后屏蔽该段程序
//*
DS12C887_SetTime(DS12887_Second, 0); //设置秒
DS12C887_SetTime(DS12887_Minute, 57); //设置分
DS12C887_SetTime(DS12887_Hour,16); //设置时
DS12C887_SetTime(DS12887_Day, 4); //设置天
DS12C887_SetTime(DS12887_Month, 3); //设置月
DS12C887_SetTime(DS12887_Year, 9); //设置年
while(1)
{
DS12C887_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(DateString[i]);
delay_ms(2);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_data(TimeString[i]);
delay_ms(2);
}
}
}