📄 jishiqi31.c
字号:
#include<reg52.h>
#include"DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^5; //按键一
sbit key2=P3^6; //按键二
sbit key3=P3^7;
uchar dis[8]; //按键三
uchar model,num=0,num2,sec,ms;
uchar shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //显示数字0->10
// 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchar code read_add[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
uchar date[]={1,1,1,5,12,1,11,0};
uchar time[]={0x01,0x01,0x01,0x05,0x0C,0x01,0x0b,0X00};
// ---秒---分---时---日---月--星期--年--写保护---
void begin(void); //初始设置
void delayms (uint); //延时函数
void display1 (void); //时间输出
void display (void); //输出
//void display2 (void); //日期输出
//void display3 (void);
void keyscan(); //按键检查
void exchange1(void);
void exchange2(void);
extern void set_RTC();
extern void read_time(uchar *time);
extern void write_time(uchar *time);
extern void write_1302(uchar add,uchar date);
void T1_time() interrupt 3 //定时器1中断
{
num++;
if(40==num)
{
num=0;
ms++;
if(100==ms)
{
ms=0;
sec++;
if(100==sec)sec=0;
}
}
}
void main()
{
begin();
// EA=1;
// P0=0xaa; //暂时没用
RST=0;
set_RTC() ;
write_time(time);
write_1302(0x80,time[0]);
while(1)
{
read_time(time);
keyscan(); //扫描键盘
exchange2();
display(); //显示结果
}
}
void delayms(uint m) //延时ms秒
{
uint i,j;
for(i=m;i>0;i--)
for(j=120;j>0;j--);
}
uchar m=0;
void display()
{
switch (model) //模式选择
{
case 0: dis[0]=date[2]/10; dis[1]=date[2]%10; dis[2]=0x0a; dis[3]=date[1]/10;
dis[4]=date[1]%10; dis[5]=0x0a; dis[6]=date[0]/10; dis[7]=date[0]%10; break;
case 1: dis[0]=date[6]/10; dis[1]=date[6]%10; dis[2]=0x0a; dis[3]=date[4]/10;
dis[4]=date[4]%10; dis[5]=0x0a; dis[6]=date[3]/10; dis[7]=date[3]%10; break;
case 2: dis[0]=0x0b; dis[1]=0x0b; dis[2]=0x0b; dis[3]=sec/10;
dis[4]=sec%10; dis[5]=0x0a; dis[6]=ms/10; dis[7]=ms%10; break;
case 4: if(m%3!=0) { dis[0]=0x0b; dis[1]=0x0b;}
else {dis[0]=date[2]/10;dis[1]=date[2]%10;} dis[2]=0x0a; dis[3]=date[1]/10;
dis[4]=date[1]%10; dis[5]=0x0a; dis[6]=date[0]/10; dis[7]=date[0]%10; break;
case 5: if(m%3!=0) { dis[3]=0x0b; dis[4]=0x0b;}
else{dis[3]=date[1]/10;dis[4]=date[1]%10;}dis[0]=date[2]/10; dis[1]=date[2]%10;
dis[2]=0x0a; dis[5]=0x0a; dis[6]=date[0]/10; dis[7]=date[0]%10; break;
case 6: if(m%3!=0) { dis[6]=0x0b; dis[7]=0x0b;}
else{dis[6]=date[0]/10;dis[7]=date[0]%10;}dis[0]=date[2]/10; dis[1]=date[2]%10;
dis[2]=0x0a; dis[3]=date[1]/10; dis[4]=date[1]%10; dis[5]=0x0a; break;
case 7: if(m%3!=0) { dis[0]=0x0b; dis[1]=0x0b;}
else{dis[0]=date[6]/10;dis[1]=date[6]%10;} dis[2]=0x0a; dis[3]=date[4]/10;
dis[4]=date[4]%10; dis[5]=0x0a; dis[6]=date[3]/10; dis[7]=date[3]%10; break;
case 8: if(m%3!=0) { dis[4]=0x0b; dis[3]=0x0b;}
else{dis[4]=date[4]%10;dis[3]=date[4]/10;} dis[0]=date[6]/10; dis[1]=date[6]%10;
dis[2]=0x0a; dis[5]=0x0a; dis[6]=date[3]/10; dis[7]=date[3]%10; break;
case 9: if(m%3!=0) { dis[6]=0x0b; dis[7]=0x0b;}
else{dis[6]=date[3]/10;dis[7]=date[3]%10;} dis[0]=date[6]/10; dis[1]=date[6]%10;
dis[2]=0x0a; dis[3]=date[4]/10; dis[4]=date[4]%10; dis[5]=0x0a; break;
}
display1(); m++;
}
void display1 ()
{
P2=0X01; P1=shuzi[dis[0]]; delayms(5); P1=0XFF; //小时输出
P2=0X02; P1=shuzi[dis[1]]; delayms(5); P1=0XFF;
P2=0x04; P1=shuzi[dis[2]]; delayms(5); P1=0XFF;
P2=0X08; P1=shuzi[dis[3]]; delayms(5); P1=0XFF;
P2=0X10; P1=shuzi[dis[4]]; delayms(5); P1=0XFF; // 分钟输出
P2=0X20; P1=shuzi[dis[5]]; delayms(5); P1=0XFF;
P2=0X40; P1=shuzi[dis[6]]; delayms(5); P1=0XFF;
P2=0X80; P1=shuzi[dis[7]]; delayms(5); P1=0XFF; //秒钟输出
}
void begin()
{ //开始设置 打开定时器
TMOD=0X22;
// TH0=(65536-45872)/256;
// TL0=(65536-45872)%256;
TH1=(256-250)%256; //初值
TL1=(256-250)%256;
EA=1; //总中断 打开
// ET0=1;
ET1=1; //定时器1中断打开
// TR0=1;
TR1=0; //打开定时器1
}
void keyscan()
{
if(0==key2) //按键key2
{
delayms(10);
if (0==key2) //是否按键
{
switch (model) // 时间显示
{
case 0:case 1: model++;break; //下一模式
case 2: model=0; break; //回时间模式
case 4: if(23!=date[2])date[2]++; //日期显示 改变小时
else date[2]=0;break;
case 5: if(59!=date[1])date[1]++; // 改变分钟
else date[1]=0;break;
case 6: if(59!=date[0])date[0]++; //改变秒钟
else date[0]=0; break;
case 7: date[6]++;break; //改变年
case 8: if(12!=date[4])date[4]++; //改变月分
else date[4]=1; break;
//以下为闰年日期问题
case 9: if(1==date[4]||3==date[4]||5==date[4]||7==date[4]||8==date[4]||10==date[4]||12==date[4])
if(date[3]!=31) //改变日期
date[3]++;
else date[3]=1;
else if(4==date[4] || 6==date[4] || 9==date[4] || 11==date[4])
if(date[3]!=30)
date[3]++;
else date[3]=1;
else if (2==date[4])
if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0)
if(date[3]!=29)
date[3]++;
else date[3]=1;
else if(date[3]!=28)
date[3]++;
else date[3]=1;break; //看上边
}
} //时间校准
exchange1();
write_time(time);
read_time(time);
exchange2();
while(!key2) display();
}
if(0==key3) //按键key3 功能同上
{
delayms(10);
if (0==key3)
{
switch(model)
{
case 1:case 2: model--;break;
case 0: model=2;break;
case 4: if(0!=date[2])date[2]--;
else date[2]=23; break;
case 5: if(0!=date[1])date[1]--;
else date[1]=59;break;
case 6: if(0!=date[0])date[0]--;
else date[0]=59;break;
case 7: date[6]--;break;
case 8: if(1!=date[4])date[4]--;
else date[4]=12;break;
case 9: if(1==date[4]||3==date[4]||5==date[4]||7==date[4]||8==date[4]||10==date[4]||12==date[4])
if(date[3]!=1)
date[3]--;
else date[3]=31;
else if(4==date[4] || 6==date[4] || 9==date[4] || 11==date[4])
if(date[3]!=1)
date[3]--;
else date[3]=30;
else if (2==date[4])
if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0)
if(date[3]!=1)
date[3]--;
else date[3]=29;
else if(date[3]!=1)
date[3]--;
else date[3]=28;
break;
}
}
exchange1();
write_time(time);
read_time(time);
exchange2();
while(!key3) display();
}
if(key1==0) //是否按键1
{
delayms(10);
if(0==key1)
{
switch (model) //模式选择
{
case 0:model=4;break; //模式改变
case 1:model=7;break;
case 4:
case 5:
case 6:
case 7:
case 8:model++;break;
// case 6:model=0;break;
case 9:model=0;break;
// case 3:break;
case 2:if(num2==0){sec=0;ms=0;ET0=0;TR0=0;num2++;}
else if(num2==1){ET0=1; TR0=1;num2++;}
else {ET0=0;TR0=0;num2=0;}break;
}
}
while(!key1) display();
}
}
void exchange1()
{
int i;
for(i=0;i<7;i++)
time[i]=date[i]/10*16+date[i]%10;
}
void exchange2()
{
int i;
for(i=0;i<7;i++)
date[i]=(time[i]/16)*10+time[i]%16;
}
//---------------------以前程序-------------------
/*void time1()
{
switch(date[5])
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:if(date[4]>31) //是否到一月
{
date[4]=0; //月加一
date[5]++;
}break;
case 4:
case 6:
case 9:
case 11:if(date[4]>30) //同上
{
date[4]=0;
date[5]++;
}break;
case 2:if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0) //是否为闰年
{
if(date[4]>29) //29天一月
{
date[4]=0;
date[5]++;
}
}
else //28天一月
{ if(date[4]>28)
{
date[4]=0;
date[5]++;
}
}break;
case 13:date[5]=1;date[6]++;break; //一年过去
default :date[5]=1;break; //月份出错
}
} */
/*void display()
{
switch (model) //模式选择
{
case 0:display1();break; //输出对应模式显示
case 1:display2();break;
case 4:case 5: case 6:display1();break;
case 7: case 8: case 9: display2();break;
case 2:display3();break;
case 3:break;
}
} */
/*
void display1()
{
P2=0X01; P1=shuzi[date[2]/10]; delayms(5); P1=0XFF; //小时输出
P2=0X02; P1=shuzi[date[2]%10]; delayms(5); P1=0XFF;
P2=0x04; P1=0xbf; delayms(5); P1=0XFF;
P2=0X08; P1=shuzi[date[1]/10]; delayms(5); P1=0XFF;
P2=0X10; P1=shuzi[date[1]%10]; delayms(5); P1=0XFF; // 分钟输出
P2=0x20; P1=0xbf; delayms(5); P1=0xff;
P2=0X40; P1=shuzi[date[0]/10]; delayms(5); P1=0XFF;
P2=0X80; P1=shuzi[date[0]%10]; delayms(5); P1=0XFF; //秒钟输出
}
void display2()
{
P2=0X01; P1=shuzi[date[6]%100/10]; delayms(5); P1=0XFF; //年输出
P2=0X02; P1=shuzi[date[6]%10]; delayms(5); P1=0XFF;
P2=0x04; P1=0xbf; delayms(5); P1=0XFF;
P2=0X08; P1=shuzi[date[4]/10]; delayms(5); P1=0XFF; //月输出
P2=0X10; P1=shuzi[date[4]%10]; delayms(5); P1=0XFF;
P2=0x20; P1=0xbf; delayms(5); P1=0XFF;
P2=0X40; P1=shuzi[date[3]/10]; delayms(5); P1=0XFF; //日输出
P2=0X80; P1=shuzi[date[3]%10]; delayms(5); P1=0XFF;
}
void display3()
{
P2=0X08; P1=shuzi[sec/10]; delayms(5); P1=0XFF;
P2=0X10; P1=shuzi[sec%10]; delayms(5); P1=0XFF;
P2=0x20; P1=0xbf; delayms(5); P1=0XFF;
P2=0X40; P1=shuzi[ms/10]; delayms(5); P1=0XFF;
P2=0X80; P1=shuzi[ms%10]; delayms(5); P1=0XFF;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -