⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time.c

📁 使用C语言编写的单片机控制LCD显示程序
💻 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 + -