多功能电子万年历.docx
- 文档编号:7067143
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:30
- 大小:21.01KB
多功能电子万年历.docx
《多功能电子万年历.docx》由会员分享,可在线阅读,更多相关《多功能电子万年历.docx(30页珍藏版)》请在冰豆网上搜索。
多功能电子万年历
/************************超级电子万年历***************************************/
#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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 电子 万年历