📄 time.c
字号:
#include<reg52.h>
#include<absacc.h>
#include <stdio.h>
#include <intrins.h>
xdata unsigned char CW _at_ 0xf9fc; //?????
xdata unsigned char CR _at_ 0xf9fe;
xdata unsigned char DW _at_ 0xf9fd;
xdata unsigned char DR _at_ 0xf9ff;
unsigned char key;
bit flag;
int k;
int g; //取月份
int f=29; //f进位标志
int clockon; //闹钟开关
void delay(unsigned int i)
{ while(i--);
}
unsigned char lc_read(void)
{ unsigned char a;
delay(100);
a=CR;
return(a);
}
void readbf(void)
{ while(flag)
{ flag=(bit)(lc_read())&0x80; //????
}
}
void lc_write(unsigned char a)
{ delay(20);
CW=a;
delay(20);
}
void ld_write(unsigned char a)
{ delay(20);
DW=a;
delay(20);
}
void inttilcs(void)
{
readbf();
lc_write(0x38);
delay(500);
readbf();
lc_write(0x38);
delay(500);
readbf();
lc_write(0x38);
delay(500);
lc_write(0x01);
readbf();
lc_write(0x0f);
readbf();
delay(500);
lc_write(0x0f);
readbf();
delay(500);
lc_write(0x06);
delay(500);
}
unsigned char code display_code[10]=
{
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39 //0,1,2,3,4,5,6,7,8,9
};
unsigned char data display_data_buff[15]={2,0,0,6,0,1,0,1,1,2,0,0,0,0,1};//数据显示缓冲区 ??????
unsigned char data display_code_buff[15]={2,0,0,6,0,1,0,1,1,2,0,0,0,0,1};//段码显示缓冲区
struct time_str
{signed char year;
unsigned char month;
unsigned char day;
signed char hour;
signed char minute;
signed char second;
unsigned char second20;
unsigned char week;
}time;
/* struct clock_str
{unsigned char hour;
unsigned char minute;
}clock;*/
//**************************************************************************
void dp_data_to_dp_code_buff(void)
{
unsigned char i;
for (i=0;i<15;i++)
{
display_code_buff[i]=display_code[display_data_buff[i]];
}
}
//**************************************************************************
void js_week()
{
//计算星期几
int i;
int n;
int year,month,day;
int a1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
year=time.year+2000;
month=time.month;
day=time.day;
if (year%4==0 && year%100!=0)
{ a1[1]=29;f=30;}
if (year%400==0)
{a1[1]=29;f=30;}
for(i=0;i<month-1;i++)
day+=a1[i];
n=year-1900+(year-1901)/4+day;
n=n%7; //星期几
time.week=n;
}
int jinwei(int d)
{
g=time.month;
switch(g)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: f=32;break;
case 4:
case 6:
case 9:
case 11:f=31;break;
}
return f;
}
void time_to_display_data_buff(void)
{ display_data_buff[0]=2;
display_data_buff[1]=0;
display_data_buff[2]=time.year/10;
display_data_buff[3]=time.year%10;
display_data_buff[4]=time.month/10;
display_data_buff[5]=time.month%10;
display_data_buff[6]=time.day/10;
display_data_buff[7]=time.day%10;
display_data_buff[8]=time.hour/10;
display_data_buff[9]=time.hour%10;
display_data_buff[10]=time.minute/10;
display_data_buff[11]=time.minute%10;
display_data_buff[12]=time.second/10;
display_data_buff[13]=time.second%10;
js_week();//计算星期
display_data_buff[14]=time.week;
dp_data_to_dp_code_buff();
}
void display2(void)
{
ld_write(0x20); //空格
ld_write(display_code_buff[0]);
ld_write(display_code_buff[1]);
ld_write(display_code_buff[2]);
ld_write(display_code_buff[3]);
ld_write(0xb0);
ld_write(display_code_buff[4]);
ld_write(display_code_buff[5]);
ld_write(0xb0);
ld_write(display_code_buff[6]);
ld_write(display_code_buff[7]);
ld_write(0x3c);
ld_write(display_code_buff[14]);
ld_write(0x3e);
lc_write(0x40);
lc_write(0x14);
readbf();
ld_write(display_code_buff[8]);
ld_write(display_code_buff[9]);
ld_write(0x3a); // “:”
ld_write(display_code_buff[10]);
ld_write(display_code_buff[11]);
ld_write(0x3a);
ld_write(display_code_buff[12]);
ld_write(display_code_buff[13]);
/* if(clockon==1&time.hour==clock.hour&time.minute==clock.minute)
{
ld_write(0x20);
ld_write(0x40);
}*/
}
void display(void)
{
time.second20++;
if (time.second20==18)
{
time.second20=0;
time.second++;
if (time.second==60)
{
time.second=0;
time.minute++;
if (time.minute==60)
{
time.minute=0;
time.hour++;
if (time.hour==24)
{
time.hour=0;
time.day++;
if(time.week==8)
time.week=1;
if(time.day==jinwei())
{
time.day=1;
time.month++;
if(time.month==13)
{
time.month=1;
time.year++;
}
}
}
}
}
delay(500);
lc_write(0x01);
time_to_display_data_buff();
delay(500);
display2();
}
}
void keyboard(void) interrupt 2 using 0 //键盘中断子程序
{
unsigned char i,j,w;
EX1=0; //键盘中断关
key=0;
delay(200); //延时去处抖动
XBYTE[0x0010]; //?????????%¥¥#¥¥
if(~XBYTE[0xf800]&0x0f) //是否有键按下
{
w=XBYTE[0xf8f0]&0x0f; //键植查询,key高4位为列信息,左列对应其中的低位,
if(~w&0x0f) //key低4位对应行信息 ,即i值,键盘最上行为5,
{
i=4;
j=w;
w=0xff;
}
w=XBYTE[0xf8e8]&0x0f;
if(~w&0x0f)
{
i=3;
j=w;
w=0xff;
}
w=XBYTE[0xf8d8]&0x0f;
if(~w&0x0f)
{
i=2;
j=w;
w=0xff;
}
w=XBYTE[0xf8b8]&0x0f;
if(~w&0x0f)
{
i=1;
j=w;
w=0xff;
}
w=XBYTE[0xf878]&0x0f;
if(~w&0x0f)
{
i=0;
j=w;
w=0xff;
}
w=~j;
key=(w<<4)|i;
}
//-----编码键值左上起1--20---------键值编码,返回1到20的16进制数,
switch (key)
{
case 0x14 :key=0x01;break; //00010100
case 0x24 :key=0x02;break; //00100100
case 0x44 :key=0x03;break; //01000100
case 0x84 :key=0x04;break; //10000100
case 0x13 :key=0x05;break; //00010011
case 0x23 :key=0x06;break; //00100011
case 0x43 :key=0x07;break; //01000011
case 0x83 :key=0x08;break; //10000011
case 0x12 :key=0x09;break; //00010010
case 0x22 :key=0x0a;break; //00100010
case 0x42 :key=0x0b;break; //01000010
case 0x82 :key=0x0c;break; //10000010
case 0x11 :key=0x0d;break; //00010001
case 0x21 :key=0x0e;break; //00100001
case 0x41 :key=0x0f;break; //01000001
case 0x81 :key=0x10;break; //10000001
case 0x10 :key=0x11;break; //00010000
case 0x20 :key=0x12;break; //00100000
case 0x40 :key=0x13;break; //01000000
case 0x80 :key=0x14;break; //10000000
default: key=0;
}
while(~XBYTE[0xf800]&0x0f)
k=1;
EX1=1;
}
void main(void)
{
int a;
//XBYTE[0xf801];
inttilcs();
time.year=0;
time.month=1;
time.day=1;
time.hour=0;
time.minute=0;
time.second=0;
time.second20=0;
time.week=6;
//clockon=0;
//clock.hour=0;
//clock.minute=0;
lc_write(0x0c);
EA=1;
EX1=1;
k=0;
a=0;
while (1)
{
if(k)
{ if(key==0x01) //键盘1更改年+
{lc_write(0x01);
lc_write(0x0f);
time.year++;
if (time.year>99 )
time.year=0;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x0d) //键盘1更改年-
{lc_write(0x01);
lc_write(0x0f);
time.year--;
if(time.year<=0)
time.year=0;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x02) //键盘2更改月+
{lc_write(0x01);
lc_write(0x0f);
time.month++;
if (time.day>=jinwei())
time.day=1;
if(time.month==13)
time.month=1;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x0e) //键盘2更改月-
{lc_write(0x01);
lc_write(0x0f);
time.month--;
if (time.day>=jinwei())
time.day=1;
if(time.month==0)
time.month=12;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x03) //键盘3更改天+
{lc_write(0x01);
lc_write(0x0f);
time.day++;
if (time.day==jinwei()) time.day=1;
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x0f) //键盘3更改天-
{lc_write(0x01);
lc_write(0x0f);
time.day--;
if (time.day<=0) time.day=jinwei()-1;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x05) //键盘5更改小时+
{lc_write(0x01);
lc_write(0x0f);
time.hour++;
if(time.hour==24)
time.hour=0;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x11) //键盘5更改小时-
{lc_write(0x01);
lc_write(0x0f);
time.hour--;
if(time.hour==-1)
time.hour=23;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x06) //键盘6更改分钟+
{lc_write(0x01);
lc_write(0x0f);
time.minute++;
if(time.minute==60)
time.minute=0;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x12) //键盘6更改分钟-
{lc_write(0x01);
lc_write(0x0f);
time.minute--;
if(time.minute==-1)
time.minute=59;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x07) //键盘7更改秒+
{lc_write(0x01);
lc_write(0x0f);
time.second++;
if(time.second==60)
time.second=0;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
else if(key==0x13) //键盘7更改秒-
{lc_write(0x01);
lc_write(0x0f);
time.second--;
if(time.second==-1)
time.second=59;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}
/* else if(key==0x04) //键盘4更改星期
{lc_write(0x01);
lc_write(0x0f);
time.week++;
if(time.week==8)
time.week=1;
k=0;a=1;
delay(500);
time_to_display_data_buff();
display2();
}*/
else if(key==0x08) //键盘8恢复时钟
{a=0;k=0;
lc_write(0x0c);
}
/*
else if (key==0x09) //键盘9闹钟开,小时+
{
lc_write(0x01);
lc_write(0x0f);
clockon=1;
k=0;
a=1;
clock.hour++;
if(clock.hour==24)
clock.hour=0;
display_data_buff[0]=clock.hour/10;
display_data_buff[1]=clock.hour%10;
display_data_buff[2]=clock.minute/10;
display_data_buff[3]=clock.minute%10;
display_code_buff[0]=display_code[display_data_buff[0]];
display_code_buff[1]=display_code[display_data_buff[1]];
display_code_buff[2]=display_code[display_data_buff[2]];
display_code_buff[3]=display_code[display_data_buff[3]];
ld_write(0x20); //空白
lc_write(0x40); //闹钟符号
ld_write(display_code_buff[0]);
ld_write(display_code_buff[1]);
ld_write(0x3a); //显示:
ld_write(display_code_buff[2]);
ld_write(display_code_buff[3]);
}
else if (key==0x0a) //键盘9闹钟开,分钟+
{
lc_write(0x01);
lc_write(0x0f);
clockon=1;
k=0;
a=1;
clock.minute++;
if(clock.minute==60)
clock.minute=0;
display_data_buff[0]=clock.hour/10;
display_data_buff[1]=clock.hour%10;
display_data_buff[2]=clock.minute/10;
display_data_buff[3]=clock.minute%10;
display_code_buff[0]=display_code[display_data_buff[0]];
display_code_buff[1]=display_code[display_data_buff[1]];
display_code_buff[2]=display_code[display_data_buff[2]];
display_code_buff[3]=display_code[display_data_buff[3]];
ld_write(0x20); //空白
lc_write(0x40); //闹钟符号
ld_write(display_code_buff[0]);
ld_write(display_code_buff[1]);
ld_write(0x3a); //显示:
ld_write(display_code_buff[2]);
ld_write(display_code_buff[3]);
}
else if(key==0x0b) //键盘11关闹钟
{a=1;k=0;clockon=0;
lc_write(0x01);
delay(500);
lc_write(0x0c);
ld_write(0x20);
ld_write(0x20);
ld_write(0x20);
ld_write(0x4f);
ld_write(0x46);
ld_write(0x46);
}
*/
else {}
}
else if(a==0)
{
TMOD=0X01;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //????
do{}while(!TF0);
display();
TF0=0;
}
else {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -