📄 disk.c
字号:
/*-------------------------------------
程序功能:万年历
硬件连接:输出(PO连接J3,P1.0连接位码,P1.1连接段码)
独立按键输入(P2连接K1--8,但是只用到了端口低位4个)
--------------------------------------*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define InPut P2
#define DataOut P0
sbit SegDat=P1^0;
sbit SegCs=P1^1;
ulong JBit;
uint KeyData,CsCount,JChoose,i;
uint TimeCount,SecondData,MinuteData,HourData;DayData,MonthData,YearDataL,YearDataH;
bit JDisplay;
uint ReadKey();
DisplayData [8];
CsData [9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x67};
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
/*0 1 2 3 4 5 6 7 8 9 共阴*/
//*****时间模式*****
TimeDisplay()
{DisplayData [0]=tab[HourData/10];
DisplayData [1]=tab[HourData%10];
DisplayData [2]=0x40;
DisplayData [3]=tab[MinuteData/10];
DisplayData [4]=tab[MinuteData%10];
DisplayData [5]=0x40;
DisplayData [6]=tab[SecondData/10];
DisplayData [7]=tab[SecondData%10]; //送入显示数据
if(JChoose==1) //小时修改
{if(KeyData==0xfb)
{KeyData=0xff,HourData++;}
if(KeyData==0xf7)
{KeyData=0xff,HourData--;}
if(SecondData%2==0) //光标闪烁
{DisplayData [0]=0x00;
DisplayData [1]=0x00;}
}
else if(JChoose==2) //分钟修改
{if(KeyData==0xfb)
{KeyData=0xff,MinuteData++;}
if(KeyData==0xf7)
{KeyData=0xff,MinuteData--;}
if(SecondData%2==0) //光标闪烁
{DisplayData [3]=0x00;
DisplayData [4]=0x00;}
}
else JChoose=0;
}
//*****日期模式*****
DateDisplay()
{DisplayData [0]=tab[2];
DisplayData [1]=tab[0];
DisplayData [2]=tab[YearDataL/10];
DisplayData [3]=tab[YearDataL%10];
DisplayData [4]=tab[MonthData/10];
DisplayData [5]=tab[MonthData%10];
DisplayData [6]=tab[DayData/10];
DisplayData [7]=tab[DayData%10]; //送入显示数据
if(JChoose==1) //年份修改
{if(KeyData==0xfb)
{KeyData=0xff,YearDataL++;}
if(KeyData==0xf7)
{KeyData=0xff,YearDataL--;}
if(SecondData%2==0)
{DisplayData [0]=0x00;
DisplayData [1]=0x00;
DisplayData [2]=0x00;
DisplayData [3]=0x00;}
}
else if(JChoose==2) //月份修改
{if(KeyData==0xfb)
{KeyData=0xff,MonthData++;}
if(KeyData==0xf7)
{KeyData=0xff,MonthData--;}
if(SecondData%2==0)
{DisplayData [4]=0x00;
DisplayData [5]=0x00;}
}
else if(JChoose==3) //日期修改
{if(KeyData==0xfb)
{KeyData=0xff,DayData++;}
if(KeyData==0xf7)
{KeyData=0xff,DayData--;}
if(SecondData%2==0)
{DisplayData [6]=0x00;
DisplayData [7]=0x00;}
}
else JChoose=0;
}
//////////菜单判断系统////////////////
DisplaySystem()
{ if(KeyData==0xfe) //判断菜单按键
{JDisplay=~JDisplay;
KeyData=0xff;}
else if(KeyData==0xfd) //判断修改按键
{JChoose++;
KeyData=0xff;}
else;
if(JDisplay==0)
{TimeDisplay();} //时间模式
else
{DateDisplay();} //日期模式
}
////////时间判断系统////////////////
HourSystem() //小时判断
{ if(SecondData==60)
{SecondData=0;
MinuteData++;}
else if(SecondData>60)
{SecondData=0;}
else;
if(MinuteData==60)
{MinuteData=0;
HourData++;}
else if(MinuteData>60)
{MinuteData=0;}
else;
if(HourData>24)
{HourData=0;
DayData++;}
else;
}
/////////////日期判断系统///////////
DaySystem()
{ if(MonthData<7&MonthData>0) //1~7月
{if(MonthData==2) //2月
{if(YearDataL%4==0) //润年
{if(DayData>29)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
else //平年
{if(DayData>28)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
}
if(MonthData%2==0&MonthData!=2) //小月
{if(DayData>30)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
else //大月
{if(DayData>31)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
}
else if(MonthData>=7&MonthData<=12)//8~12月
{if(MonthData%2==0) //大月
{if(DayData>31)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
else //小月
{if(DayData>30)
{DayData=1;
MonthData++;}
else if(DayData==0)
{DayData=1;}
else;
}
}
else if(MonthData==13) //月份进位
{MonthData=1;
YearDataL++;}
else {MonthData=1;}//超出范围
}
///////////年份判断系统/////////////
YearSystem()
{if(YearDataL>50)
{YearDataL=50;}
else if(YearDataL<0)
{YearDataL=0;}
else ;
}
///////////按键////////////
KeyScan()
{ if(ReadKey()!=0xff)
{JBit++;
if(JBit==10) //短按防抖
{KeyData=ReadKey();}
else if(JBit%50==0) //长按加1
{KeyData=ReadKey();}
else;
}
else {JBit=0;}
}
uint ReadKey() //键值读取
{ uint tempkey;
InPut=0xff;
tempkey=InPut;
return (tempkey);
}
//*****显示
Display()
{ while(CsCount<8)
{ DataOut=DisplayData[CsCount]; //送数据
SegDat=1;
SegDat=0;
DataOut=CsData[CsCount]; //送位码
SegCs=1;
SegCs=0;
for(i=0;i<100;i++); //循环写入
DataOut=0xff;
SegCs=1;
SegCs=0;
CsCount++;
}
CsCount=0;
}
main()
{ TMOD=0x01;
TH0=(65539-50000)/256;
TL0=(65539-50000)%256;
EA=1;
ET0=1;
TR0=1;
//*****************************
while(1)
{HourSystem();
DaySystem();
YearSystem();
KeyScan();
DisplaySystem();
Display();
}
}
////////定时中断///////////////
void Time() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TimeCount++;
if(TimeCount==20)
{SecondData++;
TimeCount=0;}
else;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -