多功能电子万年历Word文档下载推荐.docx

上传人:b****6 文档编号:20092537 上传时间:2023-01-16 格式:DOCX 页数:30 大小:21.01KB
下载 相关 举报
多功能电子万年历Word文档下载推荐.docx_第1页
第1页 / 共30页
多功能电子万年历Word文档下载推荐.docx_第2页
第2页 / 共30页
多功能电子万年历Word文档下载推荐.docx_第3页
第3页 / 共30页
多功能电子万年历Word文档下载推荐.docx_第4页
第4页 / 共30页
多功能电子万年历Word文档下载推荐.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

多功能电子万年历Word文档下载推荐.docx

《多功能电子万年历Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多功能电子万年历Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。

多功能电子万年历Word文档下载推荐.docx

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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1