//lcd1602显示,pcf8563产生时钟,P3.0到P3.3四个独立按键
//P0口接lcd数据端
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define keyinc 0xfb
#define keydec 0xf7
#define flaginc 0xfe
#define flagdec 0xfd
#define reset 0xef
//uchar num;
sbit rw=P2^4;
sbit lcdrs=P2^5;
sbit lcden=P2^3;
sbit sda=P1^1;
sbit scl=P1^0;
//uint year;
uchar num,s,k,hour,min,sec,week,mon,day,year,flag=0;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'},table1[]={'S','u','n','M','o','n','T','u','e','W','e','d','T','h','u','F','r','i','S','a','t'};
uchar code mon_day[]={0x29,0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0x31,0x30,0x31};
//uchar code table2[]={"DLMUIT"};
//uchar code
/*BCD码转十进制*/
uchar bcd_dec(unsigned char bat)
{
return (((bat&0xf0)>>4)*10+(bat&0x0f));
}
/*延时函数*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
{;}
}
/*向LCM1602中写指令*/
void write_com(uchar com)
{
rw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*向LCM1602中写数据*/
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void sflag()
{
write_com(0x0f);
delay(800);
}
/*向LCM1602中写各种指令用于**********初始化LCM1602*************/
void init()
{
rw=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*开始信号*/
void start()
{
sda=1; {;}
scl=1; {;}
sda=0; {;}
}
/*停止信号*/
void stop()
{
sda=0; {;}
scl=1; {;}
sda=1; {;}
}
/*应答信号*/
void respons()
{
uchar i;
scl=1; {;}
while((sda==1)&&(i<250)) i++;
scl=0; {;}
}
/*写一个字节的函数*/
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0; {;}
sda=CY; {;}
scl=1; {;}
}
scl=0; {;}
sda=1; {;}
}
/*读一个字节的函数*/
uchar read_byte()
{
uchar i,k;
scl=0; {;}
sda=1; {;}
for(i=0;i<8;i++)
{
scl=1; {;}
k=(k<<1)|sda;
scl=0; {;}
}
return k;
}
/*向某个地址单元中写内容的函数*/
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa2);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
/*从某个地址单元中读内容的函数*/
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa2);
respons();
write_byte(address);
respons();
start();
write_byte(0xa3);
respons();
date=read_byte();
stop();
return date;
}
/*从对应地址读出值并赋值给相应变量*/
void read8563()
{
sec=read_add(0x02);
min=read_add(0x03);
hour=read_add(0x04);
day=read_add(0x05);
week=read_add(0x06);
mon=read_add(0x07);
year=read_add(0x08);
}
/*扫描按键*/
key()
{
uchar temp;
P3=0xff;
temp=P3;
if(!temp==0xff)
{
delay(10);
P3=0xff;
temp=P3;
}
return(temp);
}
/*执行对应的按键功能*/
void key_date()
{
uchar num;
num=key();
/*复位键功能*/
if(num==reset)
{
init();
write_com(0x80+0x10);
sda=1; {;}
scl=1; {;}
/*初始化时间设定*/
write_add(0x00,0x00);
write_add(0x01,0x00);
write_add(0x02,0x00);
write_add(0x03,0x00);
write_add(0x04,0x00);
write_add(0x05,0x08);
write_add(0x06,0x05);
write_add(0x07,0x01);
write_add(0x08,0x16);
flag=0;//每次复位时,闪光标消失
}
/*闪光标的左移*/
if(num==flaginc)
{
if(flag==12) flag=0;
else flag++;
}
/*闪光标的右移*/
if(num==flagdec)
{
if(flag==0) flag=12;
else flag--;
}
/*参数的增加*/
if(num==keyinc)
{
uchar ktemp,week,mm,yy,hh,dd;
/*闪光标不同的位置对应不同的实现功能*/
switch(flag)
{
case 1://秒位
ktemp=0;
write_add(0x02,ktemp);
break;
case 2://分位
ktemp=read_add(0x03)&0x7f;
hh=read_add(0x04)&0x7f;
if(ktemp==0x59)//@
{
ktemp=0x00;
if(hh==0x23) hh=0x00;
else
{
if(hh%16==0x09) hh+=0x07;
else hh++;
}
}
else//@
{
if(ktemp%16==0x09) ktemp+=0x07;
else ktemp++;
}
write_add(0x03,ktemp);
write_add(0x04,hh);
break;
case 3:
ktemp=read_add(0x03)&0x7f;
if(ktemp>=0x50)
{
ktemp=bcd_dec(ktemp)%10;
if(hh==0x23) hh=0x00;
else
{
if(hh%16==0x09) hh+=0x07;
else hh++;
}
}
else
ktemp+=0x10;
write_add(0x03,ktemp);
write_add(0x04,hh);
break;
case 4://时位
ktemp=read_add(0x04)&0x3f;
if(ktemp==0x23) ktemp=0x00;
else
{
if(ktemp%16==0x09) ktemp+=0x07;
else ktemp++;
}
write_add(0x04,ktemp);
break;
case 5:
ktemp=read_add(0x04)&0x3f;
if(ktemp>=0x14)
ktemp=bcd_dec(ktemp)%10;
else
ktemp+=0x10;
write_add(0x04,ktemp);
break;
case 6://星期变化同日
case 7:
case 8://日位
yy=read_add(0x08)&0x7f;
mm=read_add(0x07)&0x7f;
week=read_add(0x06)&0x07;
ktemp=read_add(0x05)&0x7f;
if(week==6) week=0;
else week++;
/*@*/if(((mm!=0x02)&&(ktemp==mon_day[bcd_dec(mm)]))//所有月份的最后一天
||((bcd_dec(yy)%4==0)&&(ktemp==0x29)&&(mm==0x02))
||((bcd_dec(yy)%4!=0)&&(ktemp==0x28)&&(mm==0x02)))
{
ktemp=0x01;
mm++;
if(mm==0x13)
{
mm=0x01;
if(yy==0x99)
yy=0x00;
else
yy++;
}
}
/*@*/else
{
if(ktemp%16==0x09) ktemp+=0x06;
ktemp++;
}
write_add(0x08,yy);
write_add(0x07,mm);
write_add(0x06,week);
write_add(0x05,ktemp);
break;
case 9:
case 10://月位
yy=read_add(0x08)&0x7f;
ktemp=read_add(0x07)&0x7f;
week=bcd_dec(read_add(0x06)&0x07);
dd=read_add(0x05)&0x7f;
/*@*/if(ktemp==0x12)
{
ktemp=0x01;
if(yy==0x99)
yy=0x00;
else if(yy%16==0x09) yy+=0x06;
yy++;
week+=3;
}
/*@*/else if((ktemp==0x01)&&(bcd_dec(yy)%4==0))
{
ktemp=0x02;
week+=3;
if(dd>29)
{
week-=(bcd_dec(dd)-29);
dd=0x29;
}
}
/*@*/else if((ktemp==0x02)&&(bcd_dec(yy)%4==0))
{
ktemp=0x03;
week+=0x01;
}
/*@*/else
{
week+=bcd_dec(mon_day[bcd_dec(ktemp)]);
if(dd>mon_day[bcd_dec(ktemp)+1])
{
week-=(bcd_dec(dd)-bcd_dec(mon_day[bcd_dec(ktemp)+1]));
dd=mon_day[bcd_dec(ktemp)+1];
}
if(ktemp%16==0x09) ktemp+=0x06;
ktemp++;
}
week%=7;
write_add(0x08,yy);
write_add(0x07,ktemp);
write_add(0x06,week);
write_add(0x05,dd);
break;
case 11://年位
dd=read_add(0x05)&0x7f;
week=read_add(0x06)&0x07;
mm=read_add(0x07)&0x7f;
ktemp=read_add(0x08)&0x7f;
if(bcd_dec(ktemp)%4==0)
{
if(mm>0x02) week+=0x01;
else if((mm==0x02)&&(dd==0x29))
{
week+=0x01;
dd=0x28;
}
else
{
week+=0x02;
}
}
else if((bcd_dec(ktemp)+1)%4==0)
{
if(mm<0x03) week+=0x01;
else week+=0x02;
}
else
{
week+=0x01;
}
week=bcd_dec(week)%7;
if(ktemp==0x99) ktemp=0x00;
else
{
if(ktemp%16==0x09) ktemp+=0x06;
ktemp++;
}
write_add(0x08,ktemp);
write_add(0x07,mm);
write_add(0x06,week);
write_add(0x05,dd);
break;
case 12:
ktemp=read_add(0x08)&0x7f;
week=read_add(0x06)&0x07;
if(ktemp>=0x90)
{
ktemp=bcd_dec(ktemp)%10;
}
else
{
ktemp+=0x10;
}
break;
default:break;
}
}
/*参数的减小*/
if(num==keydec)
{
uchar dtemp,week,mm,yy,dd;
switch(flag)
{
case 1://秒位
dtemp=0;
write_add(0x02,dtemp);
break;
case 2:
case 3://分位
dtemp=read_add(0x03)&0x7f;
if(dtemp==0x00) dtemp=0x59;
else
{
if(dtemp%16==0x00) dtemp-=6;
dtemp--;
}
write_add(0x03,dtemp);
break;
case 4:
case 5://时位
dtemp=read_add(0x04)&0x3f;
if(dtemp==0x00) dtemp=0x23;
else
{
if(dtemp%16==0x00) dtemp-=6;
dtemp--;
}
write_add(0x04,dtemp);
break;
case 6://星期变化同日
case 7:
case 8://日位
yy=read_add(0x08)&0x7f;
mm=read_add(0x07)&0x7f;
week=read_add(0x06)&0x07;
dtemp=read_add(0x05)&0x7f;
if(week==0) week=6;
else week--;
/***#***/if(dtemp==0x01)
{
/*@*/if((bcd_dec(yy)%4==0)&&(mm==0x03))
{
dtemp=0x29;
mm=0x02;
}
/*@*/else if(bcd_dec(mm)==0x01)
{
dtemp=0x31;
mm=0x12;
if(yy==0x00) yy=0x99;
else
{
if(yy%16==0x00) yy-=6;
yy--;
}
}
/*@*/else
{
dtemp=mon_day[bcd_dec(mm)-1];
if(mm%16==0x00) mm-=6;
mm--;
}
}
/***#***/else
{
if(dtemp%16==0x00) dtemp-=6;
dtemp--;
}
write_add(0x08,yy);
write_add(0x07,mm);
write_add(0x06,week);
write_add(0x05,dtemp);
break;
case 9:
case 10://月位
yy=read_add(0x08)&0x7f;
dtemp=read_add(0x07)&0x7f;
week=read_add(0x0
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于单片机的电子时钟源码+工具.rar (70个子文件)
基于单片机的电子时钟源码+工具
STC单片机下载软件 V4.80
STC单片机下载软件 V4.80
MSJTER35.DLL 24KB
STC_ISP_V480.BAT 189B
expsrv.dll 372KB
MSCMCCHS.DLL 122KB
DATGDCHS.DLL 25KB
MSSTDFMT.DLL 116KB
COMCAT.DLL 22KB
MSDATGRD.OCX 255KB
vbajet32.dll 30KB
MSREPL35.DLL 398KB
oleaut32.dll 541KB
Setup.Lst 5KB
COMDLG32.oca 35KB
CMDLGCHS.DLL 28KB
COMDLG32.OCX 137KB
asycfilt.dll 64KB
msvbvm60.dll 1.33MB
MSJET35.DLL 1021KB
STC_ISP_V480.DDF 785B
MSRD2X35.DLL 246KB
stdole2.tlb 18KB
MSCOMCTL.OCX 1.03MB
olepro32.dll 82KB
VB6CHS.DLL 100KB
VB6STKIT.DLL 101KB
MSCOMCHS.DLL 13KB
MSCOMM32.OCX 101KB
STC_ISP_V480.exe 4.24MB
test-hex
PENDB-62k.bin 62KB
STC58_2003.rom 4KB
TWOBALL-8k.bin 8KB
PENDB-16k.bin 16KB
PENDB.HEX 368B
BINCTR-62k.bin 62KB
twoball-5k.bin 5KB
PENDB-64k.bin 64KB
BINCTR-64k.bin 64KB
test_p0_p1_p2_p3.hex 323B
TWOBALL.HEX 198B
twoball-7k.bin 7KB
twoball-4k.bin 4KB
twoball-3k.bin 3KB
twoball-512.bin 512B
twoball-1k.bin 1024B
BINCTR.HEX 143B
twoball-2k.bin 2KB
STC2000.rom 384B
nul-ffh.bin 64KB
BINCTR-16k.bin 16KB
PENDB-32k.bin 32KB
BINCTR-32k.bin 32KB
twoball-6k.bin 6KB
STC516_2003.rom 4KB
zero-00.bin 64KB
BINCTR-8k.bin 8KB
TWOBALL-62k.bin 62KB
TWOBALL-64k.bin 64KB
LOOP_P0_P1_P2_P3_P4.hex 993B
TWOBALL-32k.bin 32KB
TWOBALL-16k.bin 16KB
PENDB-8k.bin 8KB
MSJINT35.DLL 121KB
MSVCRT40.DLL 319KB
VB5DB.DLL 87KB
USB驱动程序
USB驱动程序
WIN7 for 32bit
CH341SER.EXE 1.34MB
WIN8 for 32bit
CH341SER.EXE 273KB
WIN2K-XP
HL-340.EXE 275KB
WIN8 for 64bit
CH341SER.EXE 301KB
WIN7 for 64bit
CH341SER.EXE 301KB
基于51单片机的电子时钟设计.c 11KB
共 70 条
- 1
资源评论
倚珂
- 粉丝: 25
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功