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

📄 main.c

📁 这是我自己在做实验设计时做的,用摩托罗拉飞思卡尔做的一个多功能电子钟
💻 C
字号:
/*-----------------------------------------------------*
*工 程 名:	                                
*硬件连接:                                
*程序描述: SD-HC08 模板生成                            
*/
/*[头文件]*/
#include "GP32C.h"                //映像寄存器地址头文件
#include "userdefine.h"
#include "KB.h" 

#define TSTOPBit   5      //定时器计数停止位
#define TOFBit     7      //定时器溢出标志位

extern void lcdshow(unsigned char *str);
extern void Lcd_show_cursor(char x,char y);

void Time_Var2char(Time_Struct Time);
void Timer1init(void);
void Year_adjust(void);
void Month_adjust(void);
void Day_adjust(void);
void Hour_adjust(void);
void Minute_adjust(void);
void A_Year_adjust(void);
void A_Month_adjust(void);
void A_Day_adjust(void);
void A_Hour_adjust(void);
void A_Minute_adjust(void);
void Alarm_handle(void);
void Alarm_play(void);
void Alarm_Off(void);
void swap(char *m,char *n);


Time_Struct Time={2000,1,1,12,0,0};
Time_Struct Alarm={2000,1,1,7,30,0};
unsigned char LCD_buff[32]="                                ";
char Timer_5sec_trigger=0;
char Timer_5sec_counter=0,Alarm_counter=0;
char Alarm_enable_flag=0,Alarm_trigger=0;
char Select_key_is_pressed_flag=0,Up_Modify_key_is_pressed_flag=0,Down_Modify_key_is_pressed_flag=0;
char Normal_show_time=1,Time_fresh=1,Alarm_fresh;
char Minute_second_integral_flag=0,Integral_counter=0;

/*[主函数]*/
void main()
  {  
     char i,j=0;
 	 asm("SEI");               //关总中断
     Timer1init();             //调定时器1初始化子程序
     KB_Init();
     INTKBSCR&= ~(1<<IntBit); //开放键盘中断(IMASKk=1)
     Alarm_Off();
	 asm("CLI");               //开总中断
     while(1)
	 {
	 	j++;
	 	while(1)
		{
            if(Normal_show_time&&Time_fresh)
	     	{
	     		Alarm_counter++;
	     		for(i=11;i<16;i++)
	   			{
	   			 	LCD_buff[i]=' ';
	   			}
	     		Time_Var2char(Time);
	     		lcdshow((unsigned char *)LCD_buff);
	     		Time_fresh=0;
	     	} 
	     	if(!Normal_show_time&&Alarm_fresh)
	     	{
	     		Alarm_fresh=0;
	     		Time_Var2char(Alarm);
	     		lcdshow((unsigned char *)LCD_buff);
	     	}
			if(Alarm_trigger)
	     	{
	     		if(Alarm_counter<20)
	     		Alarm_play();
	     		else 
	     		{
	     			Alarm_trigger=0;
	     			Alarm_counter=0;
	     			Alarm_Off();
	     		}
	     	}
	     	if(Minute_second_integral_flag)
	     	{
	     		if(Integral_counter<5)
	     		Alarm_play();
	     		else 
	     		{
	     			Minute_second_integral_flag=0;
	     			Integral_counter=0;
	     			Alarm_Off();
	     		}
	     	}
	   		if(Timer_5sec_trigger)
	   		{
	   				if(Timer_5sec_counter>5)
	   			 	{
	   			 		
	   			 		Timer_5sec_trigger=0;
	   					Timer_5sec_counter=0;
	   					Select_key_is_pressed_flag=0;
	   					Normal_show_time=1;
	   					break;
	   				}
	   				if(Select_key_is_pressed_flag==0)
	   				{
	   					Timer_5sec_trigger=0;
	   					Timer_5sec_counter=0;
	   					break;
	   				}
	   				switch(Select_key_is_pressed_flag%11)
	   				{
	   					case 0:Year_adjust();break;
	   					case 1:Year_adjust();break;
	   					case 2:Month_adjust();break;
	   					case 3:Day_adjust();break;
	   					case 4:Hour_adjust();break;
	   					case 5:Minute_adjust();break;
	   					case 6:A_Year_adjust();break;
	   					case 7:A_Month_adjust();break;
	   					case 8:A_Day_adjust();break;
	   					case 9:A_Hour_adjust();break;
	   					case 10:A_Minute_adjust();break;
	   					default: ;break;
	   				}
	   		
	   		} //end if
     	}//end while
     }//end while
  }// end main
  
  
void Time_Var2char(Time_Struct Time)
{
	unsigned char i,tmpchar;
	unsigned short int tmp;
	tmp=Time.year;
	for(i=0;i<4;i++)
	{
		LCD_buff[i]=tmp%10+48;
		tmp=tmp/10;
	}
	swap(&LCD_buff[0],&LCD_buff[3]);
	swap(&LCD_buff[1],&LCD_buff[2]);
	LCD_buff[i]='-';
	tmpchar=Time.month;
	for(i=5;i<7;i++)
	{
		LCD_buff[i]=tmpchar%10+48;
		tmpchar=tmpchar/10;
	}
	swap(&LCD_buff[6],&LCD_buff[5]);
	LCD_buff[i]='-';
	tmpchar=Time.day;
	for(i=8;i<10;i++)
	{
		LCD_buff[i]=tmpchar%10+48;
		tmpchar=tmpchar/10;
	}
	swap(&LCD_buff[9],&LCD_buff[8]);
	tmpchar=Time.hour;
	for(i=16;i<18;i++)
	{
		LCD_buff[i]=tmpchar%10+48;
		tmpchar=tmpchar/10;
	}
	swap(&LCD_buff[17],&LCD_buff[16]);
	LCD_buff[i]=':';
	tmpchar=Time.min;
	for(i=19;i<21;i++)
	{
		LCD_buff[i]=tmpchar%10+48;
		tmpchar=tmpchar/10;
	}
	swap(&LCD_buff[20],&LCD_buff[19]);
	LCD_buff[i]=':';
	tmpchar=Time.sec;
	for(i=22;i<24;i++)
	{
		LCD_buff[i]=tmpchar%10+48;
		tmpchar=tmpchar/10;
	}
	swap(&LCD_buff[23],&LCD_buff[22]);
}

char Is_yunnian(unsigned short year)
{
	if((year%400==0)||((year%4==0)&&(year%100!=0)))
	return 1;
	else return 0;
}

    
/*Timer1init:定时器1初始化子程序-----------------------*
*功能:对定时器1初始化                                  *
*参数:无                                               *
*返回:无                                               *
*-----------------------------------------------------*/
void Timer1init(void)
 {
     //允许溢出中断、不启动计数、分频因子=64
     T1SC=0b01100110;
     //计数寄存器初值=0x0000
     T1CNTH=0x00; T1CNTL=0x00;           
     //1秒产生1次溢出中断,计数寄存器=1×(2457600/64)=9600
     T1MODH=0x96; T1MODL=0x00;
     //允许定时器1计数寄存器计数
     T1SC&=~(1<<TSTOPBit);
 }

void Year_adjust(void)
{
	Normal_show_time=1;
	Lcd_show_cursor(0,3);
	if(Up_Modify_key_is_pressed_flag)
	{
		Time.year++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Time.year--;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void Month_adjust(void)
{
	Normal_show_time=1;
	Lcd_show_cursor(0,6);
	if(Up_Modify_key_is_pressed_flag)
	{
		if(Time.month<12)
        	Time.month++;
		else
			Time.month=1;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		if(Time.month>1)
			Time.month--;
		else
			Time.month=12;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void Day_adjust(void)
{
	Normal_show_time=1;
	Lcd_show_cursor(0,9);
	if(Up_Modify_key_is_pressed_flag)
	{
		if((Time.month!=2)&&(Time.month==1)||(Time.month==3)||(Time.month==5)||(Time.month==7)||(Time.month==8)||(Time.month==10||(Time.month==12)))
		{
			if(Time.day<31)
				Time.day++;
			else
				Time.day=1;
		}
		else if((Time.month!=2)&&(Time.month==4)||(Time.month==6)||(Time.month==9)||(Time.month==11))
		{
			if(Time.day<30)
				Time.day++;
			else
				Time.day=1;
		}
		else
		{
			if(!Is_yunnian(Time.year))       //如果不是闰年
			{
				if(Time.day<28)
					Time.day++;
			    else
					Time.day=1;
			}
			else
			{
				if(Time.day<29)
					Time.day++;
			    else
					Time.day=1;
			}
		}
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		if((Time.month!=2)&&(Time.month==1)||(Time.month==3)||(Time.month==5)||(Time.month==7)||(Time.month==8)||(Time.month==10||(Time.month==12)))
		{
			if(Time.day>1)
				Time.day--;
			else
				Time.day=31;
		}
		else if((Time.month!=2)&&(Time.month==4)||(Time.month==6)||(Time.month==9)||(Time.month==11))
		{
			if(Time.day>1)
				Time.day--;
			else
				Time.day=30;
		}
		else
		{
			if(!Is_yunnian(Time.year))       //如果不是闰年
			{
				if(Time.day>1)
					Time.day--;
			    else
					Time.day=1;
			}
			else
			{
				if(Time.day>1)
					Time.day--;
			    else
					Time.day=1;
			}
		}
		Down_Modify_key_is_pressed_flag=0;
	}
	
	
}


void Hour_adjust(void)
{
	Normal_show_time=1;
	Lcd_show_cursor(1,1);
	if(Up_Modify_key_is_pressed_flag)
	{
		if(Time.hour<59)
			Time.hour++;
		else
			Time.hour=0;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		if(Time.hour>0)
			Time.hour--;
		else
			Time.hour=59;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void Minute_adjust(void)
{
	Normal_show_time=1;
	Lcd_show_cursor(1,4);
	if(Up_Modify_key_is_pressed_flag)
	{
		if(Time.min<59)
			Time.min++;
		else
			Time.min=0;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		if(Time.min>0)
			Time.min--;
		else
			Time.min=59;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void A_Year_adjust(void)
{

	Normal_show_time=0;
	LCD_buff[11]='A';
	LCD_buff[12]='L';
	LCD_buff[13]='A';
	LCD_buff[14]='R';
	LCD_buff[15]='M';
	
	if(Up_Modify_key_is_pressed_flag)
	{
		
		Alarm.year++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Alarm.year--;
		Down_Modify_key_is_pressed_flag=0;
	}
	Lcd_show_cursor(0,3);
	
}

void A_Month_adjust(void)
{
	Normal_show_time=0;
	Lcd_show_cursor(0,6);
	if(Up_Modify_key_is_pressed_flag)
	{
		Alarm.month++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Alarm.month--;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void A_Day_adjust(void)
{
	Normal_show_time=0;
	Lcd_show_cursor(0,9);
	if(Up_Modify_key_is_pressed_flag)
	{
		Alarm.day++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Alarm.day--;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}


void A_Hour_adjust(void)
{
	Normal_show_time=0;
	Lcd_show_cursor(1,1);
	if(Up_Modify_key_is_pressed_flag)
	{
		Alarm.hour++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Alarm.hour--;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void A_Minute_adjust(void)
{
	Normal_show_time=0;
	Lcd_show_cursor(1,4);
	if(Up_Modify_key_is_pressed_flag)
	{
		Alarm.min++;
		Up_Modify_key_is_pressed_flag=0;
	}
	
	if(Down_Modify_key_is_pressed_flag)
	{
		Alarm.min--;
		Down_Modify_key_is_pressed_flag=0;
	}
	
}

void Alarm_handle(void)
{
	Alarm_enable_flag=!Alarm_enable_flag;
	if(Alarm_enable_flag)
	{
		LCD_buff[29]=' ';
		LCD_buff[30]='E';
		LCD_buff[31]='N';
	}
	else
	{
		LCD_buff[29]='D';
		LCD_buff[30]='I';
		LCD_buff[31]='S';
	}
}

void Alarm_play(void)
{
	DDRD|=0b00000001;
	PTD|=0b00000001;
}

void Alarm_Off(void)
{
	DDRD|=0b00000001;
	PTD&=0b11111110;
}

void swap(char *m,char *n)
{
	char tmp;
	tmp=*m;
	*m=*n;
	*n=tmp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -