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

📄 test1.c

📁 lm3s615实验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			{ 
				if(time_setup.year/400!=0)	//非闰年
				{
				 	if(time_setup.date == non_leap_month[time_setup.month-1])
						time_setup.date=1;
					else
						time_setup.date++;
				}
				else						//闰年
				{
				 	if(time_setup.date == leap_month[time_setup.month-1])
						time_setup.date=1;
					else
						time_setup.date++;
				} 
			}
			else if( ReadKey(3) == 1 )		//检测到KEY3按下时,递减
		    {
				if(time_setup.date == 1)
				{
					if(time_setup.year/400!=0)
					{
						time_setup.date=non_leap_month[time_setup.month-1];
					}
					else
					{
						time_setup.date=leap_month[time_setup.month-1];
					} 
				}
				else
					time_setup.date--;
			}
			else if( ReadKey(4) == 1 ) 		// 检测到KEY4按下时,确认设置的日并刷新时间
			{ 
			  time = time_setup;
			  Disp_Status = 4;
			}
		}

}

// 0000年~9999年星期算法
unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,unsigned char d) 
{
	unsigned char WeekTab[] = {//闰年月星期表
								  (3 << 5) + 31,//1月
								  (6 << 5) + 29,//2月
								  (0 << 5) + 31,//3月
								  (3 << 5) + 30,//4月
								  (5 << 5) + 31,//5月
								  (1 << 5) + 30,//6月
								  (3 << 5) + 31,//7月
								  (6 << 5) + 31,//8月
								  (1 << 5) + 30,//9月
								  (4 << 5) + 31,//10月
								  (0 << 5) + 30,//11月
								  (2 << 5) + 31 //12月
								};
	unsigned char week, day;

	c &= 0x03;									//百年%4
	c = c | (c << 2);							//百年%4*5
	day = WeekTab[m - 1];						//月表
	week = day >> 5;							//月星期数
	day &= 0x1f;								//月天数
	if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))) //平年
	{
		if (m == 2) day--;						//平年月天数
		week++;									//平年月表+1
	}
	y = y + (y >> 2);							//年+年/4
	week = (week + c + y + d + 2) % 7;			//(星期=百年%4*5+年+年/4+月表+日+2)%7
	return week;								//返回星期
}

void Task_Disp(void)
{
 	unsigned int ulTemp;
	signed int lTemp;
    unsigned char D1,D2,D3,D4;
	static unsigned char time_temp;			// 控制数字或间隔符的抖动
	

		switch ( Disp_Status )				// 根据LCD的状态显示不同的画面
		{
		    case 1:     					// 显示正常的时间
				if( time.hour > 11)			// 用12进制显示时间
				{
					Lcd_Seg.Sign = LCD_PM;	// 如果是下午,则显示PM
					Lcd_Seg.D1 = HexToSeg((time.hour-12)/10);
			        Lcd_Seg.D2 = HexToSeg((time.hour-12)%10);
				}
				else
				{
					Lcd_Seg.Sign = LCD_AM;	// 如果是上午,则显示AM
					Lcd_Seg.D1 = HexToSeg(time.hour/10);
			        Lcd_Seg.D2 = HexToSeg(time.hour%10);
				}
		        Lcd_Seg.D3 = HexToSeg(time.minute/10);
		        Lcd_Seg.D4 = HexToSeg(time.minute%10);
				if( time_temp == time.second )	// 实现闪动":"
					Lcd_Seg.Sign |= LCD_DOT;
				else
				{
					time_temp = time.second;
					Lcd_Seg.Sign |= 0;
				}

				delay(500);						// 接近0.5秒的延时
	   			break;

			case 2:								//星期
		        time.week = WeekDay(time.year/100, time.year%100, time.month, time.date);
				Lcd_Seg.D1 = 0;
		        Lcd_Seg.D2 = 0;
		        Lcd_Seg.D3 = 0;
		        Lcd_Seg.D4 = HexToSeg(time.week%10);
			    Lcd_Seg.Sign = 0;
				
				break;						   
			case 3:		  						//年
		        Lcd_Seg.D1 = HexToSeg(time.year/1000);
		        Lcd_Seg.D2 = HexToSeg(time.year/100%10);
		        Lcd_Seg.D3 = HexToSeg(time.year/10%10);
		        Lcd_Seg.D4 = HexToSeg(time.year%10);
			    Lcd_Seg.Sign = LCD_YEAR;
				
			 	break;
			case 4:								//月/日
		        Lcd_Seg.D1 = HexToSeg(time.month/10);
		        Lcd_Seg.D2 = HexToSeg(time.month%10)+LCD_DP;
		        Lcd_Seg.D3 = HexToSeg(time.date/10);
		        Lcd_Seg.D4 = HexToSeg(time.date%10);
			    Lcd_Seg.Sign = LCD_MON | LCD_DAY;
				
				break;
			case 5:  							// 秒表
				if( time_second.second == 60 )	// 60进制的秒
				{
					time_second.second = 0;
					time_second.minute++;
				}
				if( time_second.minute == 60 )	// 到60分时,停止计时
					Start_Time = 0;
		        Lcd_Seg.D1 = HexToSeg(time_second.minute/10);
		        Lcd_Seg.D2 = HexToSeg(time_second.minute%10);
		        Lcd_Seg.D3 = HexToSeg(time_second.second/10);
		        Lcd_Seg.D4 = HexToSeg(time_second.second%10);
			    Lcd_Seg.Sign = LCD_DOT;
			    break;

			case 6:    							// 显示CPU的工作温度
         	    lTemp= GetTemp();		// 获取温度值

			    if( lTemp >= 0 )	
				{ ulTemp = 1;}
				else
				{ ulTemp = 0; lTemp =lTemp*(-1); }

				D1 = (unsigned char) (lTemp/1000);
                D2 = (unsigned char) ((lTemp-D1*1000)/100);
		       	D3 = (unsigned char) ((lTemp-D1*1000-D2*100)/10);
		        D4 = (unsigned char) (lTemp-D1*1000-D2*100-D3*10);

		        Lcd_Seg.D1 = HexToSeg(D1);
		        Lcd_Seg.D2 = HexToSeg(D2)+LCD_DP;
		        Lcd_Seg.D3 = HexToSeg(D3);
		        Lcd_Seg.D4 = HexToSeg(D4);

				if( ulTemp>0 )					// 正负号的判断和显示
				{ Lcd_Seg.Sign = LCD_PLUS + LCD_TMP; }
				else
				{ Lcd_Seg.Sign = LCD_MINUS + LCD_TMP; }

				delay(500);						//延时0.5秒左右刷新一次

                break;

		    case 7:     						// 设置时间的小时
				if( time_setup.hour > 11)		// 12进制显示
				{
					Lcd_Seg.Sign = LCD_PM;		// 下午,则显示PM
					if( time_temp == 1 )		// 闪动正在设置的小时的数据
					{
						time_temp = 0;
						Lcd_Seg.D1 = HexToSeg((time_setup.hour-12)/10);
					    Lcd_Seg.D2 = HexToSeg((time_setup.hour-12)%10);
					}
					else
					{
					    Lcd_Seg.D1 = 0;
					    Lcd_Seg.D2 = 0;	
						time_temp = 1;
					}
				}
				else
				{
					Lcd_Seg.Sign = LCD_AM;		// 上午,则显示AM
					if( time_temp == 1 )		// 闪动正在设置的小时的数据
					{
						time_temp = 0;
						Lcd_Seg.D1 = HexToSeg(time_setup.hour/10);
				        Lcd_Seg.D2 = HexToSeg(time_setup.hour%10);
					}
					else
					{
					    Lcd_Seg.D1 = 0;
					    Lcd_Seg.D2 = 0;	
						time_temp = 1;
					}
				}
				Lcd_Seg.D3 = HexToSeg(time_setup.minute/10);
				Lcd_Seg.D4 = HexToSeg(time_setup.minute%10);
				Lcd_Seg.Sign |= LCD_DOT;
				delay(200);
				break;
			case 8:								// 设置时间的分
				if( time_temp == 1 )			// 闪动正在设置的分钟的数据
				{
				    time_temp = 0;
					Lcd_Seg.D3 = HexToSeg(time_setup.minute/10);
				    Lcd_Seg.D4 = HexToSeg(time_setup.minute%10);
				}
				else
				{
					Lcd_Seg.D3 = 0;
					Lcd_Seg.D4 = 0;
					time_temp = 1;	
				}
				if( time_setup.hour > 11)		// 以12进制显示时间
				{
					Lcd_Seg.Sign = LCD_PM;
					Lcd_Seg.D1 = HexToSeg((time_setup.hour-12)/10);
					Lcd_Seg.D2 = HexToSeg((time_setup.hour-12)%10);
				}
				else
				{
					Lcd_Seg.Sign = LCD_AM;
					Lcd_Seg.D1 = HexToSeg(time_setup.hour/10);
				    Lcd_Seg.D2 = HexToSeg(time_setup.hour%10);
				}
				Lcd_Seg.Sign |= LCD_DOT;
				delay(200);
	   			break;
			case 9:  					//年
				Lcd_Seg.Sign = LCD_YEAR;		
				if( time_temp == 1 )		// 闪动正在设置的年的数据
				{
					time_temp = 0;
			        Lcd_Seg.D1 = HexToSeg(time_setup.year/1000);
			        Lcd_Seg.D2 = HexToSeg(time_setup.year/100%10);
			        Lcd_Seg.D3 = HexToSeg(time_setup.year/10%10);
			        Lcd_Seg.D4 = HexToSeg(time_setup.year%10);
				}
				else
				{
					Lcd_Seg.D1 = 0;
				    Lcd_Seg.D2 = 0;					    
					Lcd_Seg.D3 = 0;
				    Lcd_Seg.D4 = 0;	
					time_temp = 1;
				}
				Lcd_Seg.Sign = LCD_YEAR;
				delay(200);
				break;
			case 10:						//月
				Lcd_Seg.Sign = LCD_MON;		
				if( time_temp == 1 )		// 闪动正在设置的月的数据
				{
					time_temp = 0;
					Lcd_Seg.D1 = HexToSeg(time_setup.month/10);
				    Lcd_Seg.D2 = HexToSeg(time_setup.month%10)+LCD_DP;
				}
				else
				{
				    Lcd_Seg.D1 = 0;
				    Lcd_Seg.D2 = LCD_DP;	
					time_temp = 1;
				}
				Lcd_Seg.D3 = HexToSeg(time_setup.date/10);
				Lcd_Seg.D4 = HexToSeg(time_setup.date%10);
				Lcd_Seg.Sign |= LCD_DP;
				delay(200);
				break;
			case 11:						//日
				Lcd_Seg.Sign = LCD_DAY;		
				if( time_temp == 1 )		// 闪动正在设置的日的数据
				{
					time_temp = 0;
					Lcd_Seg.D3 = HexToSeg(time_setup.date/10);
				    Lcd_Seg.D4 = HexToSeg(time_setup.date%10);
				}
				else
				{
				    Lcd_Seg.D3 = 0;
				    Lcd_Seg.D4 = 0;	
					time_temp = 1;
				}
				Lcd_Seg.D1 = HexToSeg(time_setup.month/10);
				Lcd_Seg.D2 = HexToSeg(time_setup.month%10)+LCD_DP;
				Lcd_Seg.Sign |= LCD_DP;
				delay(200);
				break;

			default:
				break;
		}
		Data_Time();
	    Lcd_Update();						// 刷新LCD的内容
		delay( 100 );						// 延时
}


int main(void)
{
     SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);                    // 设定晶振为时钟源
	
	// KEY2,PA5   KEY4,PA4
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);       
    GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_5, GPIO_DIR_MODE_IN);
	// KEY1,PD4
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);        
    GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
	// KEY3 ,PB5
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_DIR_MODE_IN); 
    // 设置PD7为LED1的输入口,以显示1秒的跳动
	GPIODirModeSet(GPIO_PORTD_BASE, LED1 , GPIO_DIR_MODE_OUT);	 
	GPIOPinWrite(GPIO_PORTD_BASE, LED1,LED1);			// 点亮LED	
	
	//中断优先级分配  (错的)
	//IntPrioritySet(INT_I2C,0x04<<5);
	//IntPrioritySet(INT_TIMER1A,0x05<<5);

	Timer1a_int(2);										// 初始化TIMER1A
    I2CInit(100000, 1);   								// 初始化I2C
    ADCInit();											// 初始化ADC
	if(PCF8576_Ini(MODE_E, NOGLITTER)!=1)	   			// 初始化液晶屏
    {
      while(1);	  										// 初始化不成功,则在此等待
    }

    Lcd_Clean();	 									// 清屏

	//初始化时间
	time.year = 2007;
	time.month = 4;
	time.date = 13;
	time.hour=16;
	time.minute=23;
	time.second=0;

    while(1)
	{
		Manage_Key();						// 按键处理及界面切换
		Task_Disp();									// 显示各状态
	}
}

⌨️ 快捷键说明

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