#include <reg52.h>
#include <INTRINS.h>
unsigned char code table[12]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00,0x02};
unsigned char code table_plot[11]={0xFd,0x61,0xDb,0xF3,0x67,0xB7,0xBf,0xE1,0xFf,0xF7,0x01};
unsigned char Time[8],Data[8],k;
signed char Time_scan,second,minute,hour,date,month;
signed int year;
sbit Ch0=P1^1;
sbit left=P1^0;
sbit right=P1^2;
sbit up=P1^4;
sbit down=P1^3;
sbit int0=P3^2;
bit fleft,fright,fup,fdown;
void delay(unsigned int i)
{
while(--i){} ;
}
void Scan()
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Ch0==1)
{
P0=table[Time[i]];
}
else
{
if(i==2||i==4)
{
P0=table_plot[Data[i]];
}
else
{
P0=table[Data[i]];
}
}
switch(i)
{
case 0:P2=0xfe;break;
case 1:P2=0xfd;break;
case 2:P2=0xfb;break;
case 3:P2=0xf7;break;
case 4:P2=0xef;break;
case 5:P2=0xdf;break;
case 6:P2=0xbf;break;
case 7:P2=0x7f;break;
}
delay(200);
}
}
void runtime_0()
{
second++;
if(second==60) {second=0;minute++;}
if(minute==60) {minute=0;hour++;}
if(hour==24)
{
hour=0;date++;
switch(month)
{ case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(date>=32){date=1;month++;}
if(month>=13){month=1;year++;}
break;
case 4:
case 6:
case 9:
case 11:
if(date>=31){date=1;month++;}
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0)
{
if(date>=30){date=1;month++; break; }
}
else if (date>=29){date=1;month++;}
break;
}
}
if(year>=10000) year=1;
}
void div()
{
Time[0]=second%10;
Time[1]=second/10;
Time[2]=11;
Time[3]=minute%10;
Time[4]=minute/10;
Time[5]=11;
Time[6]=hour%10;
Time[7]=hour/10;
Data[0]=date%10;
Data[1]=date/10;
Data[2]=month%10;
Data[3]=month/10;
Data[4]=year%10;
Data[5]=year/10%10;
Data[6]=year/100%10;
Data[7]=year/1000;
}
void data_add()
{
date++;
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(date>=32) date=1;
break;
case 4: case 6: case 9: case 11:
if(date>=31) date=1;
break;
case 2:
{
if(year%4==0&&year%100!=0||year%400==0)
{
if(date>=30) date=1;
}
else if (date>=29) date=1;
break ;
}
}
}
void data_sub()
{
date--;
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(date<=0) date=31;
break;
case 4: case 6: case 9: case 11:
if(date<=0) date=30;
break;
case 2:
{
if(year%4==0&&year%100!=0||year%400==0)
{
if(date<=0) date=29;
}
else if(date<=0) date=28;
break;
}
}
}
void Scan_time()
{
if(Time_scan==0)
{
P0=table[Time[0]];
P2=0xfe;
delay(50);
P0=table[Time[1]];
P2=0xfd;
delay(50);
}
else if(Time_scan==1)
{
P0=table[Time[3]];
P2=0xf7;
delay(50);
P0=table[Time[4]];
P2=0xef;
delay(50);
}
else if(Time_scan==2)
{
P0=table[Time[6]];
P2=0xbf;
delay(50);
P0=table[Time[7]];
P2=0x7f;
delay(50);
}
}
void Scan_data()
{
if(Time_scan==0)
{
P0=table[Data[0]];
P2=0xfe;
delay(50);
P0=table[Data[1]];
P2=0xfd;
delay(50);
}
else if(Time_scan==1)
{
P0=table[Data[2]];
P2=0xfb;
delay(50);
P0=table[Data[3]];
P2=0xf7;
delay(50);
}
else if(Time_scan==2)
{
P0=table[Data[4]];
P2=0xef;
delay(50);
P0=table[Data[5]];
P2=0xdf;
delay(50);
P0=table[Data[6]];
P2=0xbf;
delay(50);
P0=table[Data[7]];
P2=0x7f;
delay(50);
}
}
void Scan_key()
{
if(left==0&&fleft==1)
{
if(++Time_scan>=3) Time_scan=0;
}
if(right==0&&fright==1)
{
if(--Time_scan<=-1) Time_scan=2;
}
if(up==0&&fup==1)
{
if(Ch0==1)
{
switch(Time_scan)
{
case 0: {second++;if(second>=60) {second=0;}break;}
case 1: {minute++;if(minute>=60) {minute=0;}break;}
case 2: {hour++;if(hour>=24) {hour=0;} break;}
}
}
else
{
switch(Time_scan)
{
case 0: {data_add();break;}
case 1: {month++;if(month>=13) {month=1;}break;}
case 2: {year++;if(year>=10000) {year=0;} break;}
}
}
div();
Scan_time();
}
if(down==0&&fdown==1)
{
if(Ch0==1)
{
switch(Time_scan)
{
case 0: {second--;if(second<=-1) {second=59;}break;}
case 1: {minute--;if(minute<=-1) {minute=59;}break;}
case 2: {hour--;if(hour<=-1) {hour=23;} break;}
}
}
else
{
switch(Time_scan)
{
case 0: {data_sub();break; }
case 1: {month--;if(month<=0) {month=12;}break;}
case 2: {year--;if(year<=-1) {year=9999;}break;}
}
}
div();
Scan_time();
}
}
void timer0() interrupt 1 using 1 //T0为第1中断,INT0为第0中断
{
TH0=0x3c;
TL0=0x84; //定时时间
k++;
if(k==20)
{ k=0;
runtime_0();
div();
}
}
void Int0() interrupt 0 using 0 //int0中断,调时间
{
while(1)
{
fleft=left; fright=right; fup=up; fdown=down;
if(Ch0==1) Scan_time();
else Scan_data();
Scan_key();
if(int0==1)
{
break;
}
}
}
void main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0x84;
TR0=1;
ET0=1;
EX0=1;
IT0=1;
EA=1;
hour=6;
minute=30;
second=0;
year=2007;
month=10;
date=15;
while(1)
{
Scan();
}
}
C51单片机时钟(八段LED)MCS-51程序
需积分: 15 55 浏览量
2009-06-15
17:40:51
上传
评论
收藏 65KB RAR 举报
headla
- 粉丝: 0
- 资源: 4
最新资源
- 徐州市区shp边界文件
- 简易数字频率计设计(原理图、PCB、源码、分析报告)
- 20225207038罗丽文财管专2201班.rar
- Golang:通过Gin框架+Redis+责任链,实现一个简单的钉钉机器人,进行消息处理 ps:多应用版
- 基于cnn和AlexNet的铝材缺陷检测内含数据集和demo原型2种方法
- 2023年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- go 语言 实现的 使用modbus 协议 通过DTU tcp 链接 采集数据
- SHELL脚本(全是干货)
- Windows屏幕录屏软件
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈