8数码管闹钟c程序.docx

上传人:b****4 文档编号:3592563 上传时间:2022-11-24 格式:DOCX 页数:22 大小:20.51KB
下载 相关 举报
8数码管闹钟c程序.docx_第1页
第1页 / 共22页
8数码管闹钟c程序.docx_第2页
第2页 / 共22页
8数码管闹钟c程序.docx_第3页
第3页 / 共22页
8数码管闹钟c程序.docx_第4页
第4页 / 共22页
8数码管闹钟c程序.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

8数码管闹钟c程序.docx

《8数码管闹钟c程序.docx》由会员分享,可在线阅读,更多相关《8数码管闹钟c程序.docx(22页珍藏版)》请在冰豆网上搜索。

8数码管闹钟c程序.docx

8数码管闹钟c程序

#include

#include

#include

#include

#include

#include

#include<24C02IIC.c>

#defineucharunsignedchar

#defineuintunsignedint

sbitalout=P3^7;

voidaloutput()

{

uchari;

for(i=0;i<8;i++)

{if(al[i].m==hour&&al[i].s==min)

{if(al[i].alon==0);

if(al[i].alon==1)alout=0;

if(al[i].alon==2)alout=1;

}

}

}

//***************主函数**********************************************

voidmain()

{

alout=1;

ini();

iicread();

//init_ds1302();//每次上电写入时间,仅作为调试程序用

while

(1)

{

send();//送数

display(a0,a1,a2,a3,a4,a5,a6,a7);//显示

chuli();

aloutput();

if(stoptime)stoptimes();

if(starttime)starttimes();

if(!

settime)timerup();

if(saveiic)iicsave();

if(readiic)iicread();

if(function==1||function_al!

=0)reset=0;

}

}

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x00,0x40,0xb8,0xf4};//0~9,OFF,-,h.,L.

//***************显示子程序*******************************************************************

voiddisplay(uchara7,uchara6,uchara5,uchara4,uchara3,uchara2,uchara1,uchara0)

{P0=table[a0];

P1=0xfe;

delay

(2);

P0=table[a1];

P1=0xfd;

delay

(2);

P0=table[a2];

P1=0xfb;

delay

(2);

P0=table[a3];

P1=0xf7;

delay

(2);

P0=table[a4];

P1=0xef;

delay

(2);

P0=table[a5];

P1=0xdf;

delay

(2);

P0=table[a6];

P1=0xbf;

delay

(2);

P0=table[a7];

P1=0x7f;

delay

(2);

}

//******************将数送至缓冲单元,当shan的标志位为1时,再根据此时的此时的功能标示,对该位熄灭**************************

voidsend()

{if(function_al==0)//time

{a0=sec%10;

a1=sec/10;

a2=11;

a3=min%10;

a4=min/10;

a5=11;

a6=hour%10;

a7=hour/10;}

if(function_al!

=0)//al

{a0=al[function_al-1].s%10;

a1=al[function_al-1].s/10;

a2=11;

a3=al[function_al-1].m%10;

a4=al[function_al-1].m/10;

a5=11;

a6=al[function_al-1].alon+add;

a7=function_al;}

if(shan==1&&next==0&&(function_al!

=0||function!

=0))

{a0=10,a1=10;a2=10;a3=10,a4=10;a5=10;a6=10,a7=10;}

if(shan==1&&next==1&&(function_al!

=0||function!

=0))

{a0=10,a1=10;}

if(shan==1&&next==2&&(function_al!

=0||function!

=0))

{a3=10,a4=10;}

if(shan==1&&next==3&&(function_al!

=0||function!

=0))

{a6=10,a7=10;}

}

voiddisplay(uchara7,uchara6,uchara5,uchara4,uchara3,uchara2,uchara1,uchara0);

voidsend();

voiddelay(uintcount);

#defineucharunsignedchar

#defineuintunsignedint

#defineAT24C020xa0//AT24C02地址

bitISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno);

bitIRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno);

ucharreset,t0,t1,sec,min,hour,function,a0,a1,a2,a3,a4,a5,a6,a7;

ucharfunction_al,next,stop;

ucharadd=11,pDat[24];

bitshan,stoptime,starttime,settime,saveiic,readiic;

struct{ucharalon;

ucharm;

uchars;

}al[8];//8AL结构数组

voidresets()

{

init_ds1302();

al[0].m=8;al[0].s=3;al[0].alon=1;

al[1].m=12;al[1].s=0;al[1].alon=2;

al[2].m=13;al[2].s=33;al[2].alon=1;

//al[3].m=17;al[3].s=30;al[3].alon=2;

//al[4].m=18;al[4].s=3;al[4].alon=1;

//al[5].m=21;al[5].s=0;al[5].alon=2;

//al[6].m=0;al[6].s=0;al[6].alon=1;

//al[7].m=8;al[7].s=0;al[7].alon=2;

saveiic=1;

}

voidiicsave()//保存数据

{uchari;EA=0;

for(i=0;i<2;i++)

{pDat[i+0]=al[i].s;

pDat[i+2]=al[i].m;

pDat[i+4]=al[i].alon;}

ISendStr(AT24C02,0,&pDat[0],6);delay(20);

for(i=2;i<4;i++)

{pDat[i+4]=al[i].s;

pDat[i+6]=al[i].m;

pDat[i+8]=al[i].alon;}

ISendStr(AT24C02,0,&pDat[0],6);delay(20);

saveiic=0;EA=1;

}

voidiicread()//读取数据

{uchari;EA=0;

IRcvStr(AT24C02,0,&pDat[0],6);

for(i=0;i<2;i++)

{al[i].s=pDat[i+0];

al[i].m=pDat[i+2];

al[i].alon=pDat[i+4];}delay(20);

IRcvStr(AT24C02,0,&pDat[0],6);

for(i=2;i<4;i++)

{al[i].s=pDat[i+4];

al[i].m=pDat[i+6];

al[i].alon=pDat[i+8];}delay(20);

readiic=0;EA=1;

}

voidstoptimes()

{

write_ds1302(0x8e,0x00);//WP写保护关

write_ds1302(0x80,0x80|((sec/10)*16+(sec%10)));//stop秒

write_ds1302(0x8e,0x80);//写保护开

stoptime=0;starttime=0;

}

voidstarttimes()

{

write_ds1302(0x8e,0x00);//WP写保护关

write_ds1302(0x80,0x00|((sec/10)*16+(sec%10)));//stop秒

write_ds1302(0x8e,0x80);//写保护开

stoptime=0;starttime=0;

}

voidsavetime()//savetime

{

write_ds1302(0x8e,0x00);

write_ds1302(0x80,0x80|((sec/10)*16+(sec%10)));

write_ds1302(0x82,0x80|((min/10)*16+(min%10)));

write_ds1302(0x84,0x80|((hour/10)*16+(hour%10)));

write_ds1302(0x8e,0x80);

}

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

ucharkeychuli()

{uchark;

k=P3;//P1口内容送K

k=~k;//取反

k=(k&0x3f);//屏蔽高3位,如果扫描8键,屏蔽该句。

return(k);//返回键值

}

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

*函数原型:

key();

*功能:

键盘扫描函数,函数返回值即键值。

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

ucharkey()

{

ucharkeyzhi,keyzhii;//电子钟键盘按键键值临时存放

keyzhi=keychuli();//调P1口处理函数

if(keyzhi!

=0)//有键动作延时去抖动,否则函数返回

{

send();

display(a0,a1,a2,a3,a4,a5,a6,a7);

display(a0,a1,a2,a3,a4,a5,a6,a7);

keyzhi=keychuli();//再次调P1口处理函数

if(keyzhi!

=0)//真正有键按下,取键值并暂存

{

keyzhii=keyzhi;

while(keyzhi!

=0)//判按键是否释放,没有释放延时去抖动等待释放

{

send();

display(a0,a1,a2,a3,a4,a5,a6,a7);

display(a0,a1,a2,a3,a4,a5,a6,a7);

keyzhi=keychuli();

}

keyzhi=keyzhii;//按键释放后恢复按键键值

}

}

return(keyzhi);//返回按键键值

}

//**************键值处理程序*************************

voidchuli()

{switch(key())

{

case0:

break;

case1:

//

{function++;

switch(function)

{case1:

if(function_al==0){settime=1;stoptime=1;starttime=0;TR1=1;shan=1;}

if(function_al!

=0){settime=0;stoptime=0;starttime=1;TR1=0;shan=0;next=0;function=0;function_al=0;}break;

case2:

savetime();settime=0;stoptime=0;starttime=1;function=0;function_al=0;TR1=0;shan=0;next=0;break;//

}

}

break;

case2:

//+++

{

if(function_al==0&&function!

=0)

{switch(next)

{case1:

sec++;if(sec==60)sec=0;break;

case2:

min++;if(min==60)min=0;break;

case3:

hour++;if(hour==24)hour=0;break;}

}

if(function_al!

=0)

{switch(next)

{case1:

al[function_al-1].s++;if(al[function_al-1].s==60)al[function_al-1].s=0;break;

case2:

al[function_al-1].m++;if(al[function_al-1].m==24)al[function_al-1].m=0;break;

case3:

al[function_al-1].alon++;if(al[function_al-1].alon==3)al[function_al-1].alon=0;break;

}}

}break;

case4:

//---

{

if(function_al==0&&function!

=0)

{switch(next)

{case1:

sec--;if(sec==255)sec=59;break;

case2:

min--;if(min==255)min=59;break;

case3:

hour--;if(hour==255)hour=23;break;}

}

if(function_al!

=0)

{switch(next)

{case1:

al[function_al-1].s--;if(al[function_al-1].s==255)al[function_al-1].s=59;break;

case2:

al[function_al-1].m--;if(al[function_al-1].m==255)al[function_al-1].m=23;break;

case3:

al[function_al-1].alon--;if(al[function_al-1].alon==255)al[function_al-1].alon=2;break;

}}

}break;

case8:

//al

{function_al++;

switch(function_al)

{case1:

readiic=1;TR1=1;shan=1;break;

case2:

TR1=1;shan=1;break;

case3:

TR1=1;shan=1;break;

//case4:

TR1=1;shan=1;break;

//case5:

TR1=1;shan=1;break;

//case6:

TR1=1;shan=1;break;

//case7:

TR1=1;shan=1;break;

//case8:

TR1=1;shan=1;break;

case4:

saveiic=1;function_al=0;shan=0;next=0;break;

}

}

break;

case16:

//next

{if(function||function_al!

=0)next++;

switch(next)

{case1:

TR1=1;shan=1;break;

case2:

TR1=1;shan=1;break;

case3:

TR1=1;shan=1;break;

case4:

next=0;shan=1;TR1=1;break;

}

}

break;

case32:

//next

{if(function==0&&function_al==0&&reset<5)reset++;

switch(reset)

{case1:

TR1=1;shan=1;break;

case2:

TR1=0;shan=0;break;

case3:

TR1=1;shan=1;break;

case4:

TR1=0;shan=0;break;

case5:

reset=0;resets();break;

}

}

break;

}

}

voidtimerup()//BCD

{

sec=(read_ds1302(0x81)&0x0f)+((read_ds1302(0x81)>>4)&0x07)*10;//秒

min=(read_ds1302(0x83)&0x0f)+((read_ds1302(0x83)>>4)&0x07)*10;//分

hour=(read_ds1302(0x85)&0x0f)+((read_ds1302(0x85)>>4)&0x03)*10;//时

}

#defineucharunsignedchar

#defineuintunsignedint

sbitACC0=ACC^0;

sbitACC7=ACC^7;

sbitsclk=P3^6;

sbitio=P3^4;

sbitrst=P3^5;

voiddelay1302(uintx)

{

uinti,j;

for(i=x;i>0;i--)

for(j=114;j>0;j--);

}

voidwrite_ds1302byte(uchardat)//上升沿写1字节数据

{

uchari;

ACC=dat;//数据放入累加器中

//rst=1;启动数据传送

for(i=8;i>0;i--)

{

io=ACC0;//累加器数据赋给io送出

sclk=0;

sclk=1;

sclk=0;//上升沿

ACC=ACC>>1;//累加器数据左移一位,先写最低位

}

}

ucharread_ds1302byte()//下降沿读1字节数据

{

uchari;

//rst=1;

for(i=8;i>0;i--)

{

ACC=ACC>>1;//累加器数据左移一位,先读最低位

ACC7=io;//把io线上的数据赋给累加器

sclk=1;

sclk=0;//下降沿

}

returnACC;//返回累加器数据

}

voidwrite_ds1302(ucharaddr,uchardat)//写地址,写数据

{

rst=0;

sclk=0;

delay1302

(1);

rst=1;

write_ds1302byte(addr);//写地址

write_ds1302byte(dat);//写数据

rst=0;

sclk=1;

//delay1302

(1);

//rst=1;

//io=1;

}

ucharread_ds1302(ucharaddr)//写地址,读数据

{

ucharda;

rst=0;

sclk=0;

rst=1;

write_ds1302byte(addr);

da=read_ds1302byte();

rst=0;

sclk=1;

returnda;

}

voidinit_ds1302()

{

write_ds1302(0x8e,0x00);//WP写保护关

write_ds1302(0x80,0x00);//写秒,十进制初值

write_ds1302(0x82,0x00);//分

write_ds1302(0x84,0x00);//时

write_ds1302(0x86,0x10);//day

write_ds1302(0x88,0x03);//month

write_ds1302(0x8a,0x6);//week

write_ds1302(0x8c,0x12);//year

//write_ds1302(0x90,0x00);//涡流^_^是指充电的了

write_ds1302(0x8e,0x80);//写保护开

}

#defineucharunsignedchar

#defineuintunsignedint

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

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

当前位置:首页 > 求职职场 > 简历

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

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