#include<reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,s1num,flag,t0_num;
uchar shi,fen,miao;
sbit lcdrs=P3^7; //选择指令,数据控制端
sbit lcdrd=P3^6; //选择读写控制端
sbit lcden=P3^5; //液晶使能端
sbit dsas=P2^7;
sbit dsrw=P2^6;
sbit dsds=P2^5;
sbit dscs=P2^4;
sbit dsirq=P3^3;
uchar flag1,flag_ri; //
uchar code table[]=" 20 - - ";
uchar code table1[]=" : : ";
void write_ds(uchar,uchar);
uchar read_ds(uchar);
void delay(uint z);
void lcd_init();
void init();
void write_com(uchar com);
void write_date(uchar date);
void delay(uint z)//延时子程序
{
static uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //写指令函数
{
lcdrs=0; //选择写指令
lcdrd=0; //选择写
lcden=0;
P0=com; //送数据
lcden=1; //使能
delay(3);
lcden=0;
}
void write_date(uchar date) //写数据函数
{
lcdrs=1; //选择写数据
lcdrd=0; //选择写
lcden=0;
P0=date; //送数据
lcden=1; //使能
delay(3);
lcden=0;
}
void lcd_init()
{
lcden=0;
write_com(0x38); //选择8位数据传输,双行显示,5*7点阵
write_com(0x0c); //显示器打开,光标不显示
write_com(0x06); //读写完一个数据后,地址自加
write_com(0x01); //清屏
delay(1);
}
void init()
{
uchar num;
write_ds(0x0a,0x20);//打开振荡器
write_ds(0x0b,0x26);//设置24小时模式,数据二进制格式,开启闹钟中断
lcd_init();
write_com(0xc0);
for(num=0;num<10;num++)
{
write_date(table1[num]);
}
}
void write_sfm(uchar add,uchar date) //写液晶时分秒显示函数
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0xc0+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_ds(uchar add,uchar date)//写12c887函数
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P1=add; //写地址
dsas=0;
dsrw=0;
P1=date; //写数据
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add) //读12c887
{
uchar ds_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P1=add;
dsas=0;
dsds=0;
P1=0xff;
ds_date=P1;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
void set_time() //初始化
{
write_ds(0,0);//秒
write_ds(2,34);//分钟
write_ds(4,15);//小时
}
void main()
{
init();
set_time();
while(1)
{
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
write_sfm(10,miao);//送液晶显示
write_sfm(7,fen);
write_sfm(4,shi);
}
}