51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
电子时钟加日历显示
作者:叶思奇  发布时间:2009/10/14  阅读次数:4717  字体大小: 【】 【】【

/***************************************定时器2,做数码管的动态扫描,并确定显示的是时间还是年月日******************/
void time1(void) interrupt 3
{
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
if(++cnt>8) cnt=0;
if(sw5==0) //显示时分秒
{ switch(cnt)
{
case 0: P1 = 0x00;
P0 = duan[sec%10];
P1 = wei[cnt]; break;
case 1: P1 = 0x00;
P0 = duan[sec/10];
P1 = wei[cnt];break;
case 2: P1 = 0x00;
P0 = duan[min%10];
P1 = wei[cnt]; break;
case 3: P1 = 0x00;
P0 = duan[min/10];
P1 = wei[cnt];
scan_key(); break;
case 4: P1 = 0x00;
P0 = duan[hour%10];
P1 = wei[cnt];
scan_key();break;
case 5: P1 = 0x00;
P0 = duan[hour/10];
P1 = wei[cnt];
scan_key();break;
case 6: P1 = 0x00;
P0 = 0x7f;
P1 = wei[cnt];
scan_key(); break;
case 7: P1 = 0x00;
P0 = week1[week];
P1 = wei[cnt];
scan_key();break;
default: break;
}
}
if(sw5==1) //显示年月日
{switch(cnt)
{
case 0: P1 = 0x00;
P0 = duan[day%10];
P1 = wei[cnt]; break;
case 1: P1 = 0x00;
P0 = duan[day/10];
P1 = wei[cnt];break;
case 2: P1 = 0x00;
P0 = duan[month%10];
P1 = wei[cnt]; break;
case 3: P1 = 0x00;
P0 = duan[month/10];
P1 = wei[cnt];
scan_key(); break;
case 4: P1 = 0x00;
P0 = duan[year1%10];
P1 = wei[cnt];
scan_key();break;
case 5: P1 = 0x00;
P0 = duan[year1/10];
P1 = wei[cnt];
scan_key();break;
case 6: P1 = 0x00;
P0 = duan[year2%10];
P1 = wei[cnt];
scan_key(); break;
case 7: P1 = 0x00;
P0 = duan[year2/10];
P1 = wei[cnt];
scan_key();break;
default: break;
}
}
}
/**************************************************时钟控制子函数,自动加分钟,小时等****************************/
void conv(void)
{
if(dataa>=201)
{dataa=0;sec++;}
if(sec>=60)
{sec=0;min++;}
if(sw1==0&&min>=60)
{min=0;hour++;}
if(sw1==0&&hour>=24)
{
if(year%4==0)
{
if(month==2)
{
if(day==29)
{
day = 1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day = 1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day = 1;
month++;
if(month==13)
{
month = 1;
year++;
}
}
else day++;
}
}
}
else
{
if(month==2)
{
if(day==28)
{
day = 1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day = 1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day = 1;
month++;
if(month==13)
{
month = 1;
year1++;
if(year1==100)
{
year2++;
}
}
}
else day++;

}
}
}
hour=0;
week++;
}
if(sw1==0&&week>=7)
week=0;
}
/*************************************************延时子函数**************************************************/
void delay(ms)
{
uchar i, k;
while(ms--)
for(k=0;k<123;k++);
for(i=0;i<123;i++);
}
/***********************************************键盘扫描程序**************************************************/
void scan_key(void)
{
if(cnt==7&&P3_4==0)
{
delay(3);
if(cnt==7&&P3_4==0)
{
key4 = 0;
key1 = 1; //检查是第一个键按下
}
}
if(sw5==0&&key1==1&&cnt==7&&P3_4==1) //按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日
{
sw1 = 1; //闪烁分针
}
if(sw5==1&&key1==1&&cnt==7&&P3_4==1) //若为年月日则闪烁第一二位
{
sw1 = 9;
}
if(sw1==1&&P3_4==0&&cnt==7) //在时间状态第一个键又一次按下
{
delay(3);
if(sw1==1&&P3_4==0&&cnt==7)
{
key1 = 2; //在时间状态第一个键的第二种状态
}
}
if(sw1==9&&P3_4==0&&cnt==7) //在年月日状态第一个键第二次按下
{
delay(3);
if(sw1==9&&P3_4==0&&cnt==7)
{
key1 = 9; //在年月日状态第一个键的第二种状态
}
}
if(key1==2&&cnt==7&&P3_4==1) //在时间确认第一个键第二次按下
{
sw1 = 2; // 并闪烁时针
}
if(key1==9&&cnt==7&&P3_4==1) //年月日状态确认第一个键第二次按下
{
sw1 = 8; // 并闪烁月分
}
if(sw1==8&&P3_4==0&&cnt==7) //在年月日状态第一个键第三次按下
{
delay(3);
if(sw1==8&&P3_4==0&&cnt==7)
{
key1 = 8; //在年月日状态第一个键的第三种状态
}
}
if(key1==8&&cnt==7&&P3_4==1) //年月日状态确认第一个键第三次按下
{
sw1 = 7; // 并闪烁年的后两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 = 3;
}
}
if(sw1==7&&P3_4==0&&cnt==7) //在年月日状态第一个键第四次按下
{
delay(3);
if(sw1==7&&P3_4==0&&cnt==7)
{
key1 = 7; //在年月日状态第一个键的第四种状态
}
}
if(key1==7&&cnt==7&&P3_4==1) //年月日状态确认第一个键第四次按下
{
sw1 = 6; // 并闪烁年的前两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 = 3;
}
}
if(key1==3&&cnt==7&&P3_4==1)
{
sw1 = 3; // 并闪烁星期
}
if(sw5==0&&P3_4==0&&cnt==6) //检查第二个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==6)
{
key2 = 1;
}
}
if(key2==1&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 = 1; //在时间状态确认第二个键按下
if(sw2==1&&sw1==1) //和sw1的值对比,加分
{
min++;
if(min>=60)
min = 0;
}
if(sw2==1&&sw1==2) //和sw1的值对比,加时
{
hour++;
if(hour>=24)
hour = 0;
}
if(sw2==1&&sw1==3)
{
week++;
if(week>6)
week = 0;
}
}
if(sw5==1&&P3_4==0&&cnt==6) //在年月日检查第二个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==6)
{
key2 = 7;
}
}
if(key2==7&&cnt==6&&P3_4==1)
{
key2 = 0;
sw2 = 1; //确认第二个键按下
if(sw2==1&&sw1==9) //和sw1的值对比,加day
{
day++;
if(day>31)
day = 0;
}
if(sw2==1&&sw1==8) //和sw1的值对比,加month
{
month++;
if(month>12)
month = 0;
}
if(sw2==1&&sw1==7)
{
year1++;
if(year1>100)
year1 = 0;
}
if(sw2==1&&sw1==6)
{
year2++;
if(year2>100)
year2 = 20;
}
} //检查时间状态第三个键是否按下

来源:甘肃省天水师范学院
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号