基于51数码管显示的万年历仿真+程序完整.docx
- 文档编号:8576190
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:53.92KB
基于51数码管显示的万年历仿真+程序完整.docx
《基于51数码管显示的万年历仿真+程序完整.docx》由会员分享,可在线阅读,更多相关《基于51数码管显示的万年历仿真+程序完整.docx(12页珍藏版)》请在冰豆网上搜索。
基于51数码管显示的万年历仿真+程序完整
基于数码管显示的万年历(proteus仿真+C程序)
Proteus仿真图
C语言程序
/*********************************************************
TITLE:
万年历设计
FUNCTION:
显示:
年-月-日-星期-时-分-秒
WRITER:
LINLIANHUO
TIME:
2014-07-24
REMARK:
译码扫描时间不能过长,否则无法实现调整
**********************************************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
/***********码表***************/
ucharcodesmg_table[]={0xBF,0x86,0xDB,0xCF,0xE6,
0xED,0xFD,0xA7,0xFF,0xEF,0xC0};
ucharcodemonths_days[]={31,28,31,30,31,30,31,31,30,31,30,31};
ucharcodetranscode[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,
0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,
0xee,0xef,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
ucharbuffer[22]={0};
/**********数据定义*********/
ucharadd_sub;
ucharkey_detection=0;
ucharcount=0;
typedefstruct
{
ucharyear[2];
ucharmonth;
ucharday;
ucharweek;
}date;
typedefstruct
{
ucharhour;
ucharminute;
ucharsecond;
}moment;
datetoday={{14,20},7,25,5};
momentnow={16,52,45};
/**********延时子程序*************/
voiddelay()
{
uchari,j;
for(i=0;i<=8;i++)
for(j=0;j<40;j++);
}
/**********数码管显示子程序***********/
voidsmg_display()
{
uchari;
buffer[0]=now.second%10;
buffer[1]=now.second/10;
buffer[2]=10;
buffer[3]=now.minute%10;
buffer[4]=now.minute/10;
buffer[5]=10;
buffer[6]=now.hour%10;
buffer[7]=now.hour/10;
buffer[8]=today.week%10;
buffer[9]=today.week/10;
buffer[10]=10;
buffer[11]=today.day%10;
buffer[12]=today.day/10;
buffer[13]=10;
buffer[14]=today.month%10;
buffer[15]=today.month/10;
buffer[16]=10;
buffer[17]=today.year[0]%10;
buffer[18]=today.year[0]/10;
buffer[19]=today.year[1]%10;
buffer[20]=today.year[1]/10;
buffer[21]=10;
for(i=0;i<22;i++)
{
P0=smg_table[buffer[i]];
P2=transcode[i];
delay();
P2=0xff;
}
}
/***********初始化子程序************/
voidinit()
{
TMOD=0X01;
TH0=55535/256;
TL0=55535%256;
EA=1;
ET0=1;
TR0=1;
P1=0XFF;
}
/**********按键扫描子程序********/
voidkey_scan()
{
key_detection=P1&0xff;
add_sub=key_detection&0x80;
switch(add_sub)
{
case0x80:
switch(key_detection)
{
case0xfe:
{EA=1;EX0=1;IT0=1;}break;
case0xfd:
{EA=1;EX0=1;IT0=1;}break;
case0xfb:
{EA=1;EX0=1;IT0=1;}break;
case0xf7:
{EA=1;EX0=1;IT0=1;}break;
case0xef:
{EA=1;EX0=1;IT0=1;}break;
case0xdf:
{EA=1;EX0=1;IT0=1;}break;
case0xbf:
{EA=1;EX0=1;IT0=1;}break;
default:
{EA=1;EX0=0;TR0=1;}break;
}break;
case0x00:
switch(key_detection)
{
case0x7e:
{EA=1;EX0=1;IT0=1;}break;
case0x7d:
{EA=1;EX0=1;IT0=1;}break;
case0x7b:
{EA=1;EX0=1;IT0=1;}break;
case0x77:
{EA=1;EX0=1;IT0=1;}break;
case0x6f:
{EA=1;EX0=1;IT0=1;}break;
case0x5f:
{EA=1;EX0=1;IT0=1;}break;
case0x3f:
{EA=1;EX0=1;IT0=1;}break;
default:
{EA=1;EX0=0;TR0=1;}break;
}break;
}
}
/***********闰年计算子程序***********/
ucharleap_year(uchara,ucharb)
{
ucharx,y;
x=a*100+b;
if((x%4==0)&&(x%100!
=0)||(x%400==0))
y=1;
else
y=0;
returny;
}
/***********主程序************/
voidmain()
{
init();
while
(1)
{
key_scan();
}
}
/**********T0中断服务子程序************/
voidT0_int()interrupt1using0
{
ucharl;
TH0=55535/256;
TL0=55535%256;
count++;
if(count==30)
{
count=0;
now.second++;
if(now.second>=60)
{
now.second=0;
now.minute++;
if(now.minute>=60)
{
now.minute=0;
now.hour++;
if(now.hour>=24)
{
now.hour=0;
today.day++;
today.week++;
if(today.week>=8)
{
today.week=1;
}
l=leap_year(today.year[1],today.year[0]);
if((l==1)&&(today.month==2))
{
if(today.day>=30)
{
today.day=1;
today.month++;
}
}
else
if(today.day>=months_days[today.month-1]+1)
{
today.day=1;
today.month++;
if(today.month>=12)
{
today.month=1;
today.year[0]=today.year[0]+1;
if(today.year[0]>=100)
{
today.year[0]=0;
today.year[1]=today.year[1]+1;
if(today.year[1]==100)
{
today.year[1]=0;
}
}
}
}
}
}
}
}
smg_display();
}
/*************INT0中断服务子程序*****************/
voidint0_int()interrupt0using1
{
uchark;
switch(add_sub)
{
case0x80:
switch(key_detection)
{
case0xfe:
{
now.second++;
if(now.second>=60)now.second=0;
smg_display();
}break;
case0xfd:
{
now.minute++;
if(now.minute>=60)now.minute=0;
smg_display();
}break;
case0xfb:
{
now.hour++;
if(now.hour>=24)now.hour=0;
smg_display();
}break;
case0xf7:
{
today.week++;
if(today.week>=8)today.week=1;
smg_display();
}break;
case0xef:
{
today.day++;
k=leap_year(today.year[1],today.year[0]);
if((k==1)&&(today.month==2))
{
if(today.day>=30)today.day=1;
}
else
if(today.day>=months_days[today.month-1])
today.day=1;
smg_display();
}break;
case0xdf:
{
today.month++;
if(today.month>=13)
today.month=1;
smg_display();
}break;
case0xbf:
{
today.year[0]=today.year[0]+1;
if(today.year[0]>=100)
{
today.year[0]=0;
today.year[1]=today.year[1]+1;
if(today.year[1]==100)
today.year[1]=0;
}
smg_display();
}break;
default:
{EA=1;EX0=0;TR0=1;}break;
}break;
case0x00:
switch(key_detection)
{
case0x7e:
{
//now.second++;
if(now.second>0)now.second--;
elsenow.second=59;
smg_display();
}break;
case0x7d:
{
//now.minute++;
if(now.minute>0)now.minute--;
elsenow.minute=59;
smg_display();
}break;
case0x7b:
{
//now.hour++;
if(now.hour>0)now.hour--;
elsenow.hour=23;
smg_display();
}break;
case0x77:
{
//today.week++;
if(today.week>1)today.week--;
elsetoday.week=1;
smg_display();
}break;
case0x6f:
{
//today.day++;
k=leap_year(today.year[1],today.year[0]);
if((k==1)&&(today.month==2))
{
if(today.day>1)today.day--;
elsetoday.day=29;
}
else
{
if(today.day>1)today.day--;
elsetoday.day=months_days[today.month-1];
}
smg_display();
}break;
case0x5f:
{
//today.month++;
if(today.month>1)
today.month--;
elsetoday.month=12;
smg_display();
}break;
case0x3f:
{
//today.year[0]=today.year[0]+1;
if(today.year[0]>0)
today.year[0]=today.year[0]-1;
else
{
today.year[0]=99;
today.year[1]=today.year[1]-1;
}
smg_display();
}break;
default:
{EA=1;EX0=0;TR0=1;}break;
}break;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 数码管 显示 万年历 仿真 程序 完整