多功能电子万年历.docx

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

多功能电子万年历.docx

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

多功能电子万年历.docx

多功能电子万年历

/************************超级电子万年历***************************************/

#include

#include

#defineU8unsignedchar

#defineU16unsignedint

U8secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;

U8monthl,monthh,month,datel,dateh,date,dayl,dayh,day,year,yearl,yearh;

/*******************延时函数***********************************/

voiddelay(U16time)

{

U16time1,time2;

for(time1=time;time1>0;time1--)

for(time2=110;time2>0;time2--);

}

/**************************************************************/

/***********蜂鸣器**************************************/

sbitbeen=P1^2;//蜂鸣器引脚

voidbeen_scan(void)

{U16m=30;

while(m--)

{

been=1;

delay

(1);

been=0;

delay

(1);

}

}

/*************************************************/

/***********定义LCD功能管脚**************************************/

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;

LCDRW=0;

LCDEN=1;

delay

(1);

LCDEN=0;

}

/***************************************************************/

/***********实现LCD写指令及数据********************************/

voidwrite_lcd_com_date(U16addr,U16date)

{

write_lcd_command(addr);

delay

(1);

write_lcd_date(date);

}

/**************************************************************/

/******************初始化LCD***********************************/

voidinit_lcd()

{

write_lcd_command(0x38);//设置16x2显示,5x7点阵,8位数据口

delay

(1);

write_lcd_command(0x0c);//开显示,不显示光标,光标不闪烁

delay

(1);

write_lcd_command(0x06);//读写一个字符后,地址自动加1,不移动屏幕

delay

(1);

write_lcd_command(0x01);//清屏

delay

(1);

}

/**************************************************************/

/**********************读DS1302********************************/

U8read_ds1302(U8addr)

{

U8i,temp=0x00;

DSRST=0;

DSIO=1;

DSCLK=0;

DSRST=1;

for(i=0;i<8;i++)//循环8次写入地址数据

{

DSCLK=0;

DSIO=addr&0x01;//每次传输低字节

addr>>=1;//右移一位

DSCLK=1;

}

delay

(1);

if(DSIO)

temp|=0x80;//每次传输低字节

DSCLK=0;

temp>>=1;

for(i=0;i<7;i++)//循环8次读取数据

{

DSCLK=0;

if(DSIO)

temp|=0x80;//每次传输低字节

DSCLK=1;

temp>>=1;//右移一位

}

DSCLK=1;

DSRST=0;

DSIO=0;

returntemp;//返回

}

/************************************************************/

/******************写DS1302**********************************/

voidwrite_ds1302(U8addr,U8date)

{

U8i;

DSRST=0;

DSCLK=0;

DSRST=1;

for(i=0;i<8;i++)//循环8次写入地址数据

{

DSCLK=0;

_nop_();

DSIO=addr&0x01;//每次传输低字节

addr>>=1;//右移一位

DSCLK=1;

_nop_();

}

for(i=0;i<8;i++)//循环8次写入数据

{

DSCLK=0;

_nop_();

DSIO=date&0x01;//每次传输低字节

date>>=1;//右移一位DSCLK=1

DSCLK=1;

_nop_();

}

DSRST=0;

delay

(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:

if(newval>12)newval=1;

break;

case3:

if(newval>31)newval=1;

break;

case4:

if(newval>7)newval=1;

break;

case5:

if(newval==24)newval=0;

break;

case6:

if(newval==60)newval=0;

break;

case7:

if(newval==60)newval=0;

break;

default:

break;

}

}

else

{

newval--;

switch(s1num)

{

case1:

if(newval==0)newval=99;

write_ds1302(0x8c,0x44);

break;

case2:

if(newval==0)newval=12;

break;

case3:

if(newval==0)newval=31;

break;

case4:

if(newval==0)newval=7;

break;

case5:

if(newval==-1)newval=23;

break;

case6:

if(newval==-1)newval=59;

break;

case7:

if(newval==-1)newval=59;

break;

default:

break;

}

}

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);

if(menu==0)

{

been_scan();

while(!

menu);

s1num++;

while

(1)

{

if(menu==0)

{

delay(5);

if(menu==0)

{

been_scan();

while(!

menu);

s1num++;

}

}

write_lcd_command(0x0f);//光标闪烁

if(s1num==1)

{

year=read_ds1302(0x8d);

write_lcd_command(0x80+4);//年光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(year,1,0x8d,1,0x80+4);//写入年寄存器

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(year,0,0x8d,1,0x80+4);//写入年寄存器

}

}

}

if(s1num==2)

{

month=read_ds1302(0x89);

write_lcd_command(0x80+7);//月光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(month,1,0x89,2,0x80+7);//写入月寄存器

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(month,0,0x89,2,0x80+7);//写入月寄存器

}

}

}

if(s1num==3)

{

day=read_ds1302(0x87);

write_lcd_command(0x80+10);//日光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(day,1,0x87,3,0x80+10);//写入日寄存器

turn_val(day,1,0x8b,4,0x80+13);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

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);//星期光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(day,1,0x8b,4,0x80+13);//写入星期寄存器

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(day,0,0x8b,4,0x80+13);//写入星期寄存器

}

}

}

if(s1num==5)

{

hour=read_ds1302(0x85);

write_lcd_command(0xc2);//时光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(hour,1,0x85,5,0xc2);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(hour,0,0x85,5,0xc2);

}

}

}

if(s1num==6)

{

minute=read_ds1302(0x83);

write_lcd_command(0xc5);//分光标

if(add==0)

{

delay(5);

if(add==0)

{

been_scan();

while(!

add);

turn_val(minute,1,0x83,6,0xc5);//写入分寄存器

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(minute,0,0x83,6,0xc5);

}

}

}

if(s1num==7)//调时间秒

{

write_lcd_command(0x0c);//光标不闪烁//

second=read_ds1302(0x80);

write_lcd_command(0xc8);//秒光标

if(add==0)

{

delay(3);

if(add==0)

{

been_scan();

while(!

add);

turn_val(second,1,0x80,7,0xc8);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{

been_scan();

while(!

dec);

turn_val(second,0,0x80,7,0xc8);

}

}

}

if(s1num==8)

{

write_ds1302(0x8e,0x00);

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<8;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