多功能电子万年历Word文档下载推荐.docx
《多功能电子万年历Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多功能电子万年历Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
![多功能电子万年历Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/10/67b34277-009d-44af-85fc-007169a2c54d/67b34277-009d-44af-85fc-007169a2c54d1.gif)
sbitLCDRS=P2^0;
//控制LCD数据或命令的读写
sbitLCDRW=P2^1;
//控制LCD读写信号
sbitLCDEN=P2^2;
//使能LCD
/***************************************************************/
/***********定义键盘功能管脚**************************************/
sbitmenu=P3^4;
//菜单
sbitadd=P3^5;
//加一
sbitdec=P3^6;
//减一
/****************************************************************/
/*********************定义温度所需功能管脚和变量****************/
sbitDQ=P1^3;
//ds18b20与单片机连接口
U8tflag;
U16tvalue;
//温度值
U8datadisdata[5];
/***********定义DS1302功能管脚*********************************/
sbitDSRST=P1^4;
//DS1302复位管脚
sbitDSIO=P1^0;
//控制DS1302数据传输
sbitDSCLK=P1^1;
//DS1302时钟
/***********实现LCD写指令**************************************/
voidwrite_lcd_command(U16command)
P0=command;
LCDRS=0;
LCDRW=0;
LCDEN=1;
delay
(1);
LCDEN=0;
/***********实现LCD写数据**************************************/
voidwrite_lcd_date(U16date)
P0=date;
LCDRS=1;
/***********实现LCD写指令及数据********************************/
voidwrite_lcd_com_date(U16addr,U16date)
write_lcd_command(addr);
write_lcd_date(date);
/******************初始化LCD***********************************/
voidinit_lcd()
write_lcd_command(0x38);
//设置16x2显示,5x7点阵,8位数据口
write_lcd_command(0x0c);
//开显示,不显示光标,光标不闪烁
write_lcd_command(0x06);
//读写一个字符后,地址自动加1,不移动屏幕
write_lcd_command(0x01);
//清屏
/**********************读DS1302********************************/
U8read_ds1302(U8addr)
U8i,temp=0x00;
DSRST=0;
DSIO=1;
DSCLK=0;
DSRST=1;
for(i=0;
i<
8;
i++)//循环8次写入地址数据
{
DSIO=addr&
0x01;
//每次传输低字节
addr>
>
=1;
//右移一位
DSCLK=1;
}
if(DSIO)
temp|=0x80;
//每次传输低字节
DSCLK=0;
temp>
for(i=0;
7;
i++)//循环8次读取数据
{
if(DSIO)
temp|=0x80;
temp>
}
DSCLK=1;
DSIO=0;
returntemp;
//返回
/************************************************************/
/******************写DS1302**********************************/
voidwrite_ds1302(U8addr,U8date)
U8i;
DSRST=0;
DSCLK=0;
_nop_();
i++)//循环8次写入数据
DSIO=date&
date>
//右移一位DSCLK=1
/*****************初始化DS1302********************************/
voidinit_ds1302(void)
{
//if((((second=read_ds1302(0x81))>
7)&
&
0x01)==1)//读秒判断芯片是否依旧运行(开启断电储存)
//{
write_ds1302(0x8e,0x00);
//关闭写保护
write_ds1302(0x80,0x00);
//00秒
write_ds1302(0x82,0x00);
//00分
write_ds1302(0x84,0x00);
//00点
write_ds1302(0x86,0x12);
//12日
write_ds1302(0x88,0x06);
//6月
write_ds1302(0x8a,0x02);
//星期二
write_ds1302(0x8c,0x12);
//2012年
write_ds1302(0x8e,0x80);
//允许写保护
//}
/********************************************************/
/*****************键盘扫描程序*****************************/
voidturn_val(U8newval,U8flag,U8newaddr,U8s1num,U8lad)
{
newval=read_ds1302(newaddr);
//读取当前时间
newval=((newval&
0x70)>
4)*10+(newval&
0x0f);
//将bcd码转换成十进制
if(flag)//判断是加一还是减一
newval++;
switch(s1num)
case1:
if(newval>
99)newval=0;
break;
case2:
12)newval=1;
case3:
31)newval=1;
case4:
7)newval=1;
case5:
if(newval==24)newval=0;
case6:
if(newval==60)newval=0;
case7:
default:
break;
}
else
newval--;
switch(s1num)
if(newval==0)newval=99;
write_ds1302(0x8c,0x44);
if(newval==0)newval=12;
break;
if(newval==0)newval=31;
if(newval==0)newval=7;
if(newval==-1)newval=23;
if(newval==-1)newval=59;
default:
}
write_lcd_com_date((lad-1),(0x30+newval/10));
//液晶显示调数
write_lcd_com_date((lad),(0x30+newval%10));
write_ds1302(0x8e,0x00);
write_ds1302((newaddr-1),((newval/10)<
<
4)|(newval%10));
//将新数据写入寄存器
write_ds1302(0x8e,0x80);
voidkey_scan(void)
U8s1num=0;
if(menu==0)
delay(5);
been_scan();
while(!
menu);
s1num++;
while
(1)
if(menu==0)
been_scan();
while(!
s1num++;
write_lcd_command(0x0f);
//光标闪烁
if(s1num==1)
{
year=read_ds1302(0x8d);
write_lcd_command(0x80+4);
//年光标
if(add==0)
{
delay(3);
{
been_scan();
while(!
add);
turn_val(year,1,0x8d,1,0x80+4);
//写入年寄存器
}
if(dec==0)
if(dec==0)
dec);
turn_val(year,0,0x8d,1,0x80+4);
//写入年寄存器
if(s1num==2)
month=read_ds1302(0x89);
write_lcd_command(0x80+7);
//月光标
if(add==0)
been_scan();
turn_val(month,1,0x89,2,0x80+7);
//写入月寄存器
turn_val(month,0,0x89,2,0x80+7);
if(s1num==3)
{
day=read_ds1302(0x87);
write_lcd_command(0x80+10);
//日光标
if(add==0)
while(!
turn_val(day,1,0x87,3,0x80+10);
//写入日寄存器
turn_val(day,1,0x8b,4,0x80+13);
turn_val(day,0,0x87,3,0x80+10);
//写入日寄存器
turn_val(day,0,0x8b,4,0x80+13);
if(s1num==4)
day=read_ds1302(0x8b);
write_lcd_command(0x80+13);
//星期光标
turn_val(day,1,0x8b,4,0x80+13);
//写入星期寄存器
turn_val(day,0,0x8b,4,0x80+13);
if(s1num==5)
hour=read_ds1302(0x85);
write_lcd_command(0xc2);
//时光标
turn_val(hour,1,0x85,5,0xc2);
turn_val(hour,0,0x85,5,0xc2);
if(s1num==6)
minute=read_ds1302(0x83);
write_lcd_command(0xc5);
//分光标
delay(5);
turn_val(minute,1,0x83,6,0xc5);
//写入分寄存器
turn_val(minute,0,0x83,6,0xc5);
if(s1num==7)//调时间秒
//光标不闪烁//
second=read_ds1302(0x80);
write_lcd_command(0xc8);
//秒光标
turn_val(second,1,0x80,7,0xc8);
turn_val(second,0,0x80,7,0xc8);
if(s1num==8)
write_ds1302(0x80,0x00);
//秒清零
write_ds1302(0x8e,0x00);
s1num=0;
//s1num清零
break;
/**********************红外部分*************************************/
U8irtime;
//红外时间
U8startflag;
//启动接收
U8irdata[33];
U8bitnum;
U8irreceiveok;
//红外接收完毕
U8ircode[4];
U8irprosok;
U8disp[4];
voidirpros(void)//1.125ms/0.2777=4.39=4.05个irtime(数据零)
U8k,i,j;
U8value;
k=1;
//跳过引导码
for(j=0;
j<
4;
j++)
for(i=0;
i++)
value=value>
1;
//7次
if(irdata[k]>
6)//8次
value=value|0x80;
k++;
ircode[j]=value;
irprosok=1;
voidir_scan(void)
U8s1num=0;
if(irreceiveok)
irpros();
irreceiveok=0;
if(irprosok)