📄 time.c
字号:
#include <AT89X52.H>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
extern void delay(uint dtime);
/*串口操作 ************************* ******************************/
extern char getbyte(void); //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
extern putbyte(char c); //放入一个字节到发送缓冲区
extern putstring(uchar *puts); //发送一个定义在程序存储区的字符串到串口
extern putbytes(uchar *outplace,uint j);//放一串数据到发送缓冲区,需要定义发送的字节数
extern puthex(uchar c); //发送一个字节的hex码,分成两个字节发。
extern bit inbufsign; //串口接收到数据标志
extern void serial_init (void); //串口初始化
#define CR putstring("\r\n") //发送一个回车换行
/*液晶操作***/
extern void lcd_cls(void); //清屏
extern void lcd_string(uchar attr,uchar *string); //显示字符串
extern void lcd_rect();
extern void lcd_char(uchar attr,uchar num);
extern void lcd_char1(uchar attr,uchar num);
extern void lcd_cursor(uchar x, uchar y);
//8279操作
extern void init8279();
//变量声明
//不能对绝对变量进行初始化,对于函数和bit类型变量不能采用这种方法进行绝对地址定位
uchar xdata time_num[6] _at_ 0x2020;
uchar xdata time_num1[6] _at_ 0x2030;
uchar xdata s0 _at_ 0x2000;
uchar xdata s1 _at_ 0x2001;
uchar xdata m0 _at_ 0x2002;
uchar xdata m1 _at_ 0x2003;
uchar xdata h0 _at_ 0x2004;
uchar xdata h1 _at_ 0x2005;
uint xdata num _at_ 0x2006 ;
uchar data aa=0,key_data=0;
bit bdata flag1=0,flag2=0; //flag2控制第一次输出00:00:00
//**********键盘操作
extern uchar data key;
//函数声明
bit GetKeyInput(void);
void updatetime();
void time_1ms();
//变量初始化
void var_init()
{
s0=0;
s1=0;
m0=0;
m1=0;
h0=0;
h1=0;
num=0;
}
//函数定义
void func_up() //按下向上键时的处理函数
{
if(aa==1||aa==3)
{
time_num[aa-1]++;
if(time_num[aa-1]==10)
time_num[aa-1]=0;
return;
}
if(aa==2||aa==4)
{
time_num[aa-1]++;
if(time_num[aa-1]==6)
time_num[aa-1]=0;
return;
}
if(aa==5&&time_num[5]<=1)
{
time_num[aa-1]++;
if(time_num[aa-1]==10)
time_num[aa-1]=0;
return;
}
if(aa==6)
{
time_num[aa-1]++;
if(time_num[aa-1]==3)
time_num[aa-1]=0;
}
}
void func_down()//按下向下键时的处理函数
{
if(aa==1||aa==3)
{
if(time_num[aa-1]==0)
time_num[aa-1]=10;
time_num[aa-1]--;
return;
}
if(aa==2||aa==4)
{
if(time_num[aa-1]==0)
time_num[aa-1]=6;
time_num[aa-1]--;
return;
}
if(aa==5&&time_num[5]<=1)
{
if(time_num[aa-1]==0)
time_num[aa-1]=10;
time_num[aa-1]--;
return;
}
if(aa==6)
{
switch(time_num[aa-1])
{
case 2:
time_num[aa-1]=1;
break;
case 1:
time_num[aa-1]=0;
break;
case 0:
time_num[aa-1]=2;
break;
}
}
}
void time_out()
{
if(flag2==0) //第一次输出"00:00:00"
{
lcd_cls();
flag2=1;
lcd_cursor(3,1);
lcd_string(0,"00:00:00");
}
if(time_num[5]!=time_num1[5])
{
lcd_cursor(3,1);
lcd_char1(0,time_num[5]);
time_num1[5]=time_num[5];
}
if(time_num[4]!=time_num1[4])
{
lcd_cursor(4,1);
lcd_char1(0,time_num[4]);
time_num1[4]=time_num[4];
}
if(time_num[3]!=time_num1[3])
{
lcd_cursor(6,1);
lcd_char1(0,time_num[3]);
time_num1[3]=time_num[3];
}
if(time_num[2]!=time_num1[2])
{
lcd_cursor(7,1);
lcd_char1(0,time_num[2]);
time_num1[2]=time_num[2];
}
if(time_num[1]!=time_num1[1])
{
lcd_cursor(9,1);
lcd_char1(0,time_num[1]);
time_num1[1]=time_num[1];
}
lcd_cursor(10,1);
lcd_char1(0,time_num[0]);
}
void init_main()
{
serial_init();
init8279();
var_init();
//**************
T2CON=0x00;
RCAP2L=(65536-1843)%256;
RCAP2H=(65536-1843)/256;
TL2 = RCAP2L;
TH2 = RCAP2H;
ET2 = 1; // 允许T2中断
TR2=1;//启动定时器
//*********************
lcd_cls();
delay(100);
}
void get_data()
{
if(num==1000)
{
flag1=1;
updatetime();
num=0;
time_num[0]=s0;
time_num[1]=s1;
time_num[2]=m0;
time_num[3]=m1;
time_num[4]=h0;
time_num[5]=h1;
}
}
void main(void) //recursive 递归
{
init_main();
for(;;)
{
if(GetKeyInput()==1)
{
if(key_data==3)
{
aa++;
TR2=0; //关定时器
flag1=1; //保证每次修改数据后进行LCD刷新
}
if(aa==7)
aa=1;
switch(key_data)
{
case 1:
func_up();
flag1=1; //保证每次修改数据后进行LCD刷新
break;
case 2:
func_down();
flag1=1; //保证每次修改数据后进行LCD刷新
break;
case 4: //完成设置
s0=time_num[0];
s1=time_num[1];
m0=time_num[2];
m1=time_num[3];
h0=time_num[4];
h1=time_num[5];
TR2=1; //重新启动定时器
break;
}
}
if(flag1==1)
{
flag1=0;
time_out();
}
}
}
bit GetKeyInput(void)
{
uchar bdata flag=0;//由数据时为1
switch(key)
{
case 0x00:
return 0;
case 0xd2:
key_data=1;//上
flag=1;
break;
case 0xda: //下
key_data=2;
flag=1;
break;
case 0xdb://左
key_data=3;
flag=1;
break;
case 0xdc:
key_data=4; //完成
flag=1;
break;
}
key=0;
return flag;
}
//定时器0中断处理函数
void time_1ms() interrupt 5//定时一毫秒
{
TF2=0; //软件清除T2溢出标志
num++;
get_data();
}
//计时函数
void updatetime()
{
if(s0==9) //如果10ms位需要进位,则进入语句
{
s0=0;
if(s1==5) //如果100ms位需要进位,则进入语句
{
s1=0;
if(m0==9) //如果1sec位需要进位,则进入语句
{
m0=0;
if(m1==5) //如果10sec位需要进位,则进入语句
{
m1=0;
if(h0==9&&h1<=1)
{h0=0;
h1++;}
else if(h0==3&&h1==2)
{h0=0;
h1=0;}
else h0++;
}
else m1++;
}
else m0++;
}
else s1++;
}
else s0++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -