赛题

//NINTH//
dian zi ding shi qi 
//main.c//
#include "stm32f10x.h"
#include "lcd.h"
#include "io.h"
#include "i2c.h"
#include "stdio.h"

u32 TimingDelay = 0;
u8 KEY_Flag = 0;
u8 Display_Flag = 0;
u8 string[20];
u8 system_mode = 0;
u8 Channel_num = 0;
u32 Timer[5] = {0}; // 定时储存区域
u8 hour; //显示分解:时
u8 min ; //显示分解:分
u8 sec ; //显示分解:秒
u32 DingShi;
u8 _1s_Flag = 0;
u8 LED_Flag = 0;
extern u8 Set_Select;
extern u16 LED_MODE;
extern u8 Run_Stop;  //1:运行   0:停止

void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{

	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	LED_Init();
	KEY_Init();
	TIM3_PWM_OUTPUT(1000,80,1,0);
	Timer[0] = _24c02_Read(0x00) * 3600 + _24c02_Read(0x01) * 60 + _24c02_Read(0x02);
	Delay_Ms(10);
	Timer[1] = _24c02_Read(0x10) * 3600 + _24c02_Read(0x11) * 60 + _24c02_Read(0x12);
	Delay_Ms(10);
	Timer[2] = _24c02_Read(0x20) * 3600 + _24c02_Read(0x21) * 60 + _24c02_Read(0x22);
	Delay_Ms(10);
	Timer[3] = _24c02_Read(0x30) * 3600 + _24c02_Read(0x31) * 60 + _24c02_Read(0x32);
	Delay_Ms(10);
	Timer[4] = _24c02_Read(0x40) * 3600 + _24c02_Read(0x41) * 60 + _24c02_Read(0x42);
	Delay_Ms(10);
	while(1)
	{
			/   KEY    /
			if(KEY_Flag)
			{
					KEY_Flag = 0;
					KEY_Read();
			}
			  DISPLAY   //
			if(Display_Flag)
			{
					Display_Flag = 0;
					if(system_mode == 0)  // Stanby
					{
							sprintf((char*)string," NO:%d            ",Channel_num + 1);
							LCD_DisplayStringLine(Line1,string);
							hour = Timer[Channel_num] / 3600;
							min  = Timer[Channel_num] % 3600 / 60;
							sec  = Timer[Channel_num] % 3600 % 60;
							sprintf((char*)string,"      %.2d:%.2d:%.2d     ",hour,min,sec);
							LCD_DisplayStringLine(Line4,string);
							LCD_DisplayStringLine(Line7,(u8*)"      Standby   ");
						//	LCD_DisplayChar(Line0,210, '1');
							//LCD_DisplayChar(Line0,195, '2');
					}
					if(system_mode == 1)  // Setting
					{
							sprintf((char*)string," NO:%d            ",Channel_num + 1);
							LCD_DisplayStringLine(Line1,string);
//							sprintf((char*)string,"      %.2d:%.2d:%.2d     ",hour,min,sec);
//							LCD_DisplayStringLine(Line4,string);
							if(Set_Select == 2)
							{
									LCD_SetTextColor(Red);
							}else
							{
									LCD_SetTextColor(White);
							}
							LCD_DisplayChar(Line4,210, hour / 10 + 0x30);
							LCD_DisplayChar(Line4,195, hour % 10 + 0x30);
							LCD_SetTextColor(White);
							LCD_DisplayChar(Line4,180, ':');
							if(Set_Select == 1)
							{
									LCD_SetTextColor(Red);
							}else
							{
									LCD_SetTextColor(White);
							}
							LCD_DisplayChar(Line4,165, min / 10 + 0x30);
							LCD_DisplayChar(Line4,150, min % 10 + 0x30);
							LCD_SetTextColor(White);
							LCD_DisplayChar(Line4,135, ':');
							if(Set_Select == 0)
							{
									LCD_SetTextColor(Red);
							}else
							{
									LCD_SetTextColor(White);
							}
							LCD_DisplayChar(Line4,120, sec / 10 + 0x30);
							LCD_DisplayChar(Line4,105, sec % 10 + 0x30);
							LCD_SetTextColor(White);
												
							LCD_DisplayStringLine(Line7,(u8*)"      Setting   ");
					}
					if(system_mode == 2)  // running、pause
					{
							sprintf((char*)string," NO:%d            ",Channel_num + 1);
							LCD_DisplayStringLine(Line1,string);
							hour = Timer[Channel_num] / 3600;
							min  = Timer[Channel_num] % 3600 / 60;
							sec  = Timer[Channel_num] % 3600 % 60;
							sprintf((char*)string,"      %.2d:%.2d:%.2d     ",hour,min,sec);
							LCD_DisplayStringLine(Line4,string);
							if(Run_Stop)
							{
									LCD_DisplayStringLine(Line7,(u8*)"      Running   ");
							}else
							{
									LCD_DisplayStringLine(Line7,(u8*)"      Pause     ");
							}
					}
			}
			
			/  定时   ///
			if(_1s_Flag)
			{
					_1s_Flag = 0;
					if(system_mode == 2)
					{
							if(Run_Stop)
							{
									if(DingShi)
									{
											DingShi--;
									}
									if(DingShi != 0)
									{
											TIM3_PWM_OUTPUT(1000,80,0,1);
									}else
									{
											system_mode = 0;
											Run_Stop = 0;
											TIM3_PWM_OUTPUT(1000,80,0,0);
									}
							}else
							{
									TIM3_PWM_OUTPUT(1000,80,0,0);
							}
					}
			}
			
			//   LED   /
			if(LED_Flag)
			{
					LED_Flag = 0;
					if(system_mode == 2 && Run_Stop == 1)
					{
							LED_MODE ^= (1<<8);
					}else
					{
							LED_MODE |= (1<<8);
					}
					GPIOC->ODR = LED_MODE;
					GPIOD->ODR |= (1<<2);
					GPIOD->ODR &=~(1<<2);
			}
	}
}

void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//IT.C//
extern u8 KEY_Flag;
extern u8 Display_Flag ;
extern u16 TIM3_CH1_Val;
extern u16 TIM3_CH1_Duty;
u8 TIM3_CH1_Flag;
extern u8 _1s_Flag;
extern u8 LED_Flag;
void SysTick_Handler(void)
{
		static u8 key_sum = 0;
		static u8 display_sum = 0;
		static u16 _1s_sum = 0;
		static u16 led_sum = 0;
		TimingDelay--;
		if(++led_sum == 500)
		{
				led_sum = 0;
				LED_Flag = 1;
		}
		if(++_1s_sum == 1000)
		{
				_1s_sum = 0;
				_1s_Flag = 1;
		}
		if(++key_sum == 50) // 50ms
		{
				key_sum = 0;
				KEY_Flag = 1;
		}
		if(++display_sum == 100) 
		{
				display_sum = 0;
				Display_Flag = 1;
		}
}

void TIM3_IRQHandler(void)
{
		u16 capture;
		if(TIM_GetITStatus(TIM3,TIM_IT_CC1) == 1)
		{
				TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
				capture = TIM_GetCapture1(TIM3);
				if(TIM3_CH1_Flag)
				{
						TIM_SetCompare1(TIM3,capture + TIM3_CH1_Duty);
				}else
				{
						TIM_SetCompare1(TIM3,capture + TIM3_CH1_Val - TIM3_CH1_Duty);
				}	
				TIM3_CH1_Flag ^= 1;
		}
}

//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#define KEY1 GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_2)

void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
void TIM3_PWM_OUTPUT(u16 Frequency,u8 duty,u8 status,u8 enable);
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);

#endif
//IO.C//
#include "io.h"
#include "i2c.h"
#include "lcd.h"

extern void Delay_Ms(u32 nTime);
u16 LED_MODE = 0xffff;
u16 TIM3_CH1_Val;
u16 TIM3_CH1_Duty;
extern u8 system_mode;   // 系统当前状态  0:Stanby  1:Setting  2:running、pause
extern u8 Channel_num;   // 存储位置选择  0 ~ 4
u8 Set_Select = 0;    // 选择设置的时间  时  分  秒
extern u32 Timer[5];  // 定时储存区域
u32 Timer_Buf;   //  修改缓存区
extern u8 hour; //显示分解:时
extern u8 min ; //显示分解:分
extern u8 sec ; //显示分解:秒  
u8 Run_Stop = 0;  //1:运行   0:停止
extern u32 DingShi;

  24C02   //
void _24c02_Write(u8 address,u8 data)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(data);
		I2CWaitAck();
		I2CStop();
}
u8 _24c02_Read(u8 address)
{
		u8 temp;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
	
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		temp = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return temp;
}


   LED   ///
void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOD, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = 0xff00;
		GPIO_Init(GPIOC, &GPIO_InitStructure);
		
		GPIOC->ODR = LED_MODE;
		GPIOD->ODR |= (1<<2);
		GPIOD->ODR &=~(1<<2);
}

   PWM_OUTPUT   ///
void TIM3_PWM_OUTPUT(u16 Frequency,u8 duty,u8 status,u8 enable)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		TIM_OCInitTypeDef TIM_OCInitStructure;
		if(status)
		{
				RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
				RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
			
				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
				GPIO_Init(GPIOA, &GPIO_InitStructure);
			
				NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
				NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
				NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
				NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
				NVIC_Init(&NVIC_InitStructure);
			
				TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
				TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
				TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
				TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
				TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
		}
		TIM3_CH1_Val = 1000000 / Frequency;
		TIM3_CH1_Duty = TIM3_CH1_Val * duty / 100;
		
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		if(enable)
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		}else
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
		}
		TIM_OCInitStructure.TIM_Pulse = TIM3_CH1_Val;
		TIM_OC1Init(TIM3, &TIM_OCInitStructure);
		
		//TIM_SetCounter(TIM3, 0x0);
		//TIM_SetCompare1(TIM3,0x0);
		if(status)
		{
				TIM_Cmd(TIM3, ENABLE);
				TIM_ITConfig( TIM3, TIM_IT_CC1,ENABLE);
		}
}

///   KEY   
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void KEY_Read(void)
{
		static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
		// KEY1  
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1) // 单次触发
				{
						if(system_mode == 0 || system_mode == 1)
						{
								Channel_num++;
								if(Channel_num > 4) Channel_num = 0;
						}
				}
		}else
		{
				key1_sum = 0;
		}
		// KEY2  
		if(KEY2 == 0)
		{
				key2_sum++;
				if(key2_sum == 1) //  短按
				{
						if(system_mode == 0)
						{
								system_mode = 1;  // 进入 Setting
								Timer_Buf = Timer[Channel_num];
								LCD_ClearLine(Line0);
								LCD_ClearLine(Line1);
								LCD_ClearLine(Line2);
								LCD_ClearLine(Line3);
								LCD_ClearLine(Line4);
								LCD_ClearLine(Line5);
								LCD_ClearLine(Line6);
								LCD_ClearLine(Line7);
								LCD_ClearLine(Line8);
								LCD_ClearLine(Line9);
						}
						if(system_mode == 1)
						{
								Set_Select++;
								if(Set_Select > 2) Set_Select = 0;
						}
				}
				if(key2_sum == 16) // 800ms
				{
						if(system_mode == 1)
						{
								system_mode = 0;
								Timer[Channel_num] = Timer_Buf;
								switch(Channel_num)
								{
									case 0: _24c02_Write(0x00,hour);
													Delay_Ms(10);
													_24c02_Write(0x01,min);
													Delay_Ms(10);
													_24c02_Write(0x02,sec);
													break;
									case 1:	_24c02_Write(0x10,hour);
													Delay_Ms(10);
													_24c02_Write(0x11,min);
													Delay_Ms(10);
													_24c02_Write(0x12,sec);
													break;
									case 2:	_24c02_Write(0x20,hour);
													Delay_Ms(10);
													_24c02_Write(0x21,min);
													Delay_Ms(10);
													_24c02_Write(0x22,sec);
													break;
									case 3:	_24c02_Write(0x30,hour);
													Delay_Ms(10);
													_24c02_Write(0x31,min);
													Delay_Ms(10);
													_24c02_Write(0x32,sec);
													break;
									case 4:	_24c02_Write(0x40,hour);
													Delay_Ms(10);
													_24c02_Write(0x41,min);
													Delay_Ms(10);
													_24c02_Write(0x42,sec);
													break;
								}
								LCD_ClearLine(Line0);
								LCD_ClearLine(Line1);
								LCD_ClearLine(Line2);
								LCD_ClearLine(Line3);
								LCD_ClearLine(Line4);
								LCD_ClearLine(Line5);
								LCD_ClearLine(Line6);
								LCD_ClearLine(Line7);
								LCD_ClearLine(Line8);
								LCD_ClearLine(Line9);
						}
				}
		}else
		{
				key2_sum = 0;
		}
		// KEY3 
		if(KEY3 == 0)
		{
				key3_sum++;
				if(key3_sum == 1) // 短按
				{
						if(system_mode == 1) // Setting 模式
						{
								switch(Set_Select)
								{
									case 0: sec++;
													if(sec > 59) sec = 0;
													break;
									case 1: min++;
													if(min > 59) min = 0;
													break;
									case 2: hour++;
													if(hour > 23) hour = 0;
													break;
								}
								Timer_Buf = hour * 3600 + min * 60 + sec;
						}
				}
				
				if(key3_sum == 16) // 长按
				{
						if(system_mode == 1) // Setting 模式
						{
								switch(Set_Select)
								{
									case 0: sec++;
													if(sec > 59) sec = 0;
													break;
									case 1: min++;
													if(min > 59) min = 0;
													break;
									case 2: hour++;
													if(hour > 23) hour = 0;
													break;
								}
								Timer_Buf = hour * 3600 + min * 60 + sec;
								key3_sum = 15;
						}
				}
		}else
		{
				key3_sum = 0;
		}
		// KEY4 
		if(KEY4 == 0)
		{
				key4_sum++;
				if(key4_sum == 1) // 短按
				{
						if(system_mode == 0)
						{
								DingShi = Timer[Channel_num];
						}else
						if(system_mode == 1)
						{
								DingShi = hour * 3600 + min * 60 + sec;
						}
						system_mode = 2; // Running,pause
						if(system_mode == 2)
						{
								switch(Run_Stop)
								{
									case 0: Run_Stop = 1;break;
									case 1: Run_Stop = 0;break;
								}
						}
				}
				
				if(key4_sum == 16)  //长按触发
				{
						system_mode = 0;
						DingShi = 0;
						Run_Stop = 0;
				}
		}else
		{
				key4_sum = 0;
		}
		
}

//EIGHTH//
wen shi du jian kong she bei 

//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "i2c.h"
#include "IO.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 string[20];
u8 ADC_Flag = 0;
u8 RTC_Flag = 0;
u8 KEY_Flag = 0;
u8 Display_Flag = 0;
u32 TimeVal;
u8 LED_Flag = 0;
u8 hour,min,sec;
u32 RH; 
u8 i;
u16 LED_MODE = 0XFFFF;
u8 Remember_Flag = 0;
u8 TH_Remember[60];
u8 RH_Remember[60];
u8 Remember_sum;
u8 Remember_number;
int Temperature;
extern u8 TIM3_Ch2_CAPTURE_MODE;
extern u32 TIM_Ch2_CAPTURE_HL;
extern u8 RXOVER ;
extern u8 RX_BUF[20];
extern u8 Set_Flag;
extern int TH_compare;
extern u8 Select_Flag;
extern u8 RH_cpmpare;
extern u16 Ceshi_Fre;
extern u8 Remember_Delay;
float ADC_Val;
void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	TH_compare = _24c02_Read(0x11);
	Delay_Ms(5);
	RH_cpmpare = _24c02_Read(0x22); 
	Delay_Ms(5);
	Remember_Delay = _24c02_Read(0x33); 
	Delay_Ms(5);
	Ceshi_Fre = _24c02_Read(0x44) * 100; 
	Delay_Ms(5);
	ADC1_Init();
	TIM2_Ch2_PWM_Init(Ceshi_Fre,1);
	TIM3_Ch2_CAPTURE_Init();
	RTC_Init(23,59,55);
	USART2_Init(9600);
	LED_Init();
	KEY_Init();
	while(1)
	{
			  Remember  /
			if(Remember_Flag)
			{
					LED_MODE ^= (1<<10);
					TH_Remember[Remember_sum] = Temperature;
					RH_Remember[Remember_sum] = RH;
					Remember_sum++;
					if(Remember_sum >= 60) Remember_sum = 0;
					Remember_number++;
					Remember_Flag = 0;
			}
			 ADC 
			if(ADC_Flag)
			{
					ADC_Val = Get_Adc() * 3.3 / 4096;
					Temperature = (80 * ADC_Val / 3.3) - 20;
					ADC_Flag = 0;
			}
			//   RTC   
			if(RTC_Flag)
			{
					TimeVal = RTC_GetCounter();
					hour = TimeVal / 3600;
					min  = TimeVal % 3600 / 60;
					sec  = TimeVal % 3600 % 60;
					RTC_Flag = 0;
			}
			/   CAPTURE   
			if(TIM3_Ch2_CAPTURE_MODE == 2)
			{
					RH = 1000000 / TIM_Ch2_CAPTURE_HL; 
					RH = 80 * (RH / 1000 - 1) / 9 + 10;
					TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
					TIM3_Ch2_CAPTURE_MODE = 0;
			}
			/  USART2  
			if(RXOVER)
			{
					for(i=0;i<20;i++)
					{
							string[i] = 0;
					}
					if(RX_BUF[0] == 'C')
					{
							sprintf((char*)string,"TH_C:%dC-Time:%.2d:%.2d:%.2d\r\n",TH_compare,hour,min,sec);
					}
					if(RX_BUF[0] == 'T')
					{
							sprintf((char*)string,"TH:%dC-RH:%d%%\r\n",Temperature,RH);
					}
					USART2_SendString(string);
					for(i=0;i<20;i++)
					{
							RX_BUF[i] = 0;
					}
					USART_ITConfig( USART2, USART_IT_RXNE,ENABLE);
					RXOVER = 0;
			}
			   KEY   //
			if(KEY_Flag)
			{
					KEY_Read();
					KEY_Flag = 0;
			}
			   LED   //
			if(LED_Flag)
			{
					if(Temperature > TH_compare)
					{
							LED_MODE ^= (1<<8);
					}else
					{
							LED_MODE |= (1<<8);
					}
					if(RH > RH_cpmpare)
					{
							LED_MODE ^= (1<<9);
					}else
					{
							LED_MODE |= (1<<9);
					}
					GPIOC-> ODR = LED_MODE;
					GPIOD-> ODR |= (1<<2);
					GPIOD-> ODR &=~(1<<2);
					LED_Flag = 0;
			}
			///   Display   
			if(Display_Flag)
			{
					if(!Set_Flag)
					{
							LCD_SetTextColor(White);
							LCD_DisplayStringLine(Line1, (u8*)"     Real Data     ");
							if(Temperature >= 0)
							{
									sprintf((char*)string," TH : %dC           ",Temperature);
							}else
							{
									sprintf((char*)string," TH :-%dC           ",-Temperature);
							}
							LCD_DisplayStringLine(Line3, string);
							sprintf((char*)string," RH : %d%%           ",RH);
							LCD_DisplayStringLine(Line5, string);
							sprintf((char*)string," Time : %.2d:%.2d:%.2d  ",hour,min,sec);
							LCD_DisplayStringLine(Line7, string);
							sprintf((char*)string,"       Remember:%d   ",Remember_number);
							LCD_DisplayStringLine(Line9, string);
					}else
					{
							LCD_SetTextColor(White);
							LCD_DisplayStringLine(Line1, (u8*)"      Set          ");
							if(Select_Flag == 1)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							if(TH_compare >= 0)
							{
									sprintf((char*)string," TH_compare: %dC           ",TH_compare);
							}else
							{
									sprintf((char*)string," TH_compare:-%dC           ",-TH_compare);
							}
							LCD_DisplayStringLine(Line3, string);
							if(Select_Flag == 2)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," RH_compare: %d%%           ",RH_cpmpare);
							LCD_DisplayStringLine(Line5, string);
							if(Select_Flag == 3)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," Remember: %dS              ",Remember_Delay);
							LCD_DisplayStringLine(Line7, string);
							if(Select_Flag == 4)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," PWM_Fre: %.1fkHZ            ",(double)Ceshi_Fre / 1000);
							LCD_DisplayStringLine(Line9, string);
					}	
					Display_Flag = 0;
			}
	}
}

void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}
//IT.C//
extern u8 ADC_Flag;
extern u8 RTC_Flag;
u8 TIM3_Ch2_CAPTURE_MODE = 0;
u32 TIM_Ch2_CAPTURE_HL = 0;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
extern u8 LED_Flag;
extern u8 KEY_Flag;
extern u8 Display_Flag;
extern u8 Remember_Flag;
extern u8 Remember_Delay;
void SysTick_Handler(void)
{
		static u8 key_sum = 0;
		static u8 adc_sum = 0;
		static u8 display_sum = 0;
		static u16 remember_sum;
		static u8 led_sum = 0;
		TimingDelay--;
		remember_sum++;
		if(++led_sum == 200)
		{
				led_sum = 0;
				LED_Flag = 1;
		}
		if(++adc_sum == 150)
		{
				adc_sum = 0;
				ADC_Flag = 1;
		}
		if(++key_sum == 50)
		{
				key_sum = 0;
				KEY_Flag = 1;
		}
		if(++display_sum == 100)
		{
				display_sum = 0;
				Display_Flag = 1;
		}
		if(remember_sum / 1000 == Remember_Delay)
		{
				remember_sum = 0;
				Remember_Flag = 1;
		}
		
}

void RTC_IRQHandler(void)
{
		if(RTC_GetITStatus(RTC_IT_SEC) == 1)
		{
				RTC_ClearITPendingBit(RTC_IT_SEC);
				RTC_Flag = 1;
				if(RTC_GetCounter() == (24 * 3600))
				{
						RTC_SetCounter(0x0);
						RTC_WaitForLastTask();
				}
		}
}

void TIM3_IRQHandler(void)
{
		if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == 1 )
		{
				TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
				switch(TIM3_Ch2_CAPTURE_MODE)
				{
						case 0: TIM_Ch2_CAPTURE_HL = 0;
										TIM3_Ch2_CAPTURE_MODE = 1;
										TIM_SetCounter(TIM3,0x0);
										break;
						case 1: TIM_Ch2_CAPTURE_HL = TIM_GetCounter(TIM3);
										TIM3_Ch2_CAPTURE_MODE = 2;
										TIM_ITConfig(TIM3, TIM_IT_CC2, DISABLE);
										break;
				}
		}
}

void USART2_IRQHandler(void)
{
		u16 temp;
		if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)
		{
				USART_ClearITPendingBit( USART2, USART_IT_RXNE);
				temp = USART_ReceiveData(USART2);
				if(temp == '\n')
				{
						RXCUNT = 0;
						RXOVER = 1;
						USART_ITConfig( USART2, USART_IT_RXNE,DISABLE);
				}else
				{
						RX_BUF[RXCUNT] = temp;
						RXCUNT++;
				}
		}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
extern void Delay_Ms(u32 nTime);
#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void TIM2_Ch2_PWM_Init(u16 fre,u8 status);
void RTC_Init(u8 HH,u8 MM,u8 SS);
void TIM3_Ch2_CAPTURE_Init(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif

//IO.C//
#include "IO.h"
extern u16 LED_MODE;
u8 Set_Flag = 0;
u8 Select_Flag = 1;
int TH_compare = 40;
u8 RH_cpmpare = 80;
u8 Remember_Delay = 1;
u16 Ceshi_Fre = 1000;

///   24c02   //
//根据iic协议编写读写程序
void _24c02_Write(u8 address,u8 data)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(data);
		I2CWaitAck();
		I2CStop();
}
u8 _24c02_Read(u8 address)
{
		u8 temp;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
	
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		temp = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return temp;
}
   ADC   //
void ADC1_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		ADC_InitTypeDef ADC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);//对ADC时钟进行6分频
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//ADC端口为PB0
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//端口设置为模拟输入
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//只用一个ADC,设置为独立模式
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;//禁止扫描,多通道才需要扫描
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续准换模式
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外不触发转换,使用软件控制转换
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换结果右对齐
		ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为1
		ADC_Init( ADC1, &ADC_InitStructure);
	
		ADC_Cmd( ADC1, ENABLE);//打开ADC开始转换
	
		ADC_ResetCalibration(ADC1);//初始化校表寄存器
		while(ADC_GetResetCalibrationStatus(ADC1));//等待校表完成
		
		ADC_StartCalibration(ADC1);//ADC开始校准
		while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
}
u16 Get_Adc(void)//ADC读取函数
{
		u16 temp;//设置存储变量
		ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1,ADC_SampleTime_239Cycles5);//配置ADC通道转换顺序1,第一个转换,通道为8,采样周期239.5个时钟周期
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能软件触发
		while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0);//等待转换完成
		temp = ADC_GetConversionValue(ADC1);//将数据存到变量中
		ADC_SoftwareStartConvCmd(ADC1, DISABLE);//关闭软件触发
		return temp;//返回数据
}
/  PA1_PWM_Out  
void TIM2_Ch2_PWM_Init(u16 fre,u8 status)
{
		u16 TIM2_Val;
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_OCInitTypeDef TIM_OCInitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		if(status)
		{
				RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
				RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2时钟
				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//配置为模拟输入
				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
				GPIO_Init(GPIOA, &GPIO_InitStructure);
		}
		时基设置
		TIM2_Val = 1000000 / fre;//计算频率对应的计数值
		TIM_TimeBaseInitStructure.TIM_Period = TIM2_Val - 1;//定时器周期
		TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//设置72分频后1M,所以每个时钟周期为1us
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;//时钟分频因子,配置死区时间需要用,这里分频
		TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;//计数器模式,向上计数
		TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM2模式
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性输出
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
		TIM_OCInitStructure.TIM_Pulse = (TIM2_Val - 2) * 0.5;//反转电平值
		TIM_OC2Init(TIM2, &TIM_OCInitStructure);
		if(status)
		{
				TIM_Cmd( TIM2, ENABLE);//使能TIM2
		}
}
///   RTC   ///
void RTC_Init(u8 HH,u8 MM,u8 SS)
{
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE);
	
		NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	
		PWR_BackupAccessCmd(ENABLE);
		BKP_DeInit();
		RCC_LSICmd(ENABLE);
		while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0);
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
		RCC_RTCCLKCmd(ENABLE);
	
		RTC_ITConfig(RTC_IT_SEC, ENABLE);
		RTC_WaitForLastTask();
	
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
	
		RTC_SetPrescaler(40000 - 1);
		RTC_WaitForLastTask();
	
		RTC_SetCounter(HH * 3600 + MM * 60 + SS);
		RTC_WaitForLastTask();
	
}
   CAPTURE  输入捕获
void TIM3_Ch2_CAPTURE_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		TIM_ICInitTypeDef TIM_ICInitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
		NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	   //跟比较模式一样,我们把计数值设置到最大,同时71分频
		TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
		TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
		TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
		TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	   //输入捕获结构体
		TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//配置捕获通道
		TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//输入通道和捕获通道的映射关系,直连和非直连
		TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入需要被捕获的信号的分频系数
		TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//输入捕获信号的极性配置
		TIM_ICInitStructure.TIM_ICFilter = 0x0;//输入捕获的滤波系数
		TIM_ICInit(TIM3,&TIM_ICInitStructure);
		
		TIM_Cmd(TIM3,ENABLE);//启动TIM3
		TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);//开启更新和捕获中断
}
/  USART2  ///
void USART2_Init(u32 bound)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		USART_InitTypeDef USART_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//能位于APB1总线上的USART2时钟
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//TX发射端为PA2
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//配置为复用输出模式
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//RX为接收端PA3
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置为浮空输入
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//开启串口2中断,在stm32f10x.h中查找
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	
		USART_InitStructure.USART_BaudRate = bound;//设置波特率为9600
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
		USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
		USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使能硬件流控制
		USART_Init(USART2, &USART_InitStructure);
		
		USART_Cmd(USART2,ENABLE);//开启USART2
		USART_ITConfig( USART2, USART_IT_RXNE,ENABLE);//使能接收中断
}
void USART2_SendString(u8 *str)//发送字符串函数
{
		u8 index = 0;
		do
		{
				USART_SendData(USART2,str[index]);//一位一位发送
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);//发送是否完成
				index++;
		}while(str[index] != 0);
}
///   LED   

void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOD, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = 0XFF00;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOC, &GPIO_InitStructure);
	
		GPIOC-> ODR = 0XFFFF;
		GPIOD-> ODR |= (1<<2);
		GPIOD-> ODR &=~(1<<2);
}
   KEY   /
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void KEY_Read(void)
{
		static u16 key1_sum,key2_sum,key3_sum,key4_sum;
		//KEY1
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1)
				{
						Set_Flag ^= 1;
						if(!Set_Flag)
						{
								_24c02_Write(0x11,TH_compare);
								Delay_Ms(4);
								_24c02_Write(0x22,RH_cpmpare);
								Delay_Ms(4);
								_24c02_Write(0x33,Remember_Delay);
								Delay_Ms(4);
								_24c02_Write(0x44,Ceshi_Fre / 100);
								Delay_Ms(4);
						}
						LCD_ClearLine(Line0);
						LCD_ClearLine(Line1);
						LCD_ClearLine(Line2);
						LCD_ClearLine(Line3);
						LCD_ClearLine(Line4);
						LCD_ClearLine(Line5);
						LCD_ClearLine(Line6);
						LCD_ClearLine(Line7);
						LCD_ClearLine(Line8);
						LCD_ClearLine(Line9);
				}
		}else
		{
				key1_sum  = 0;
		}
		//KEY2
		if((KEY2 == 0) && Set_Flag)
		{
				key2_sum++;
				if(key2_sum == 1)
				{
						Select_Flag++;
						if(Select_Flag > 4) Select_Flag = 1;
				}
		}else
		{
				key2_sum  = 0;
		}
		//KEY3
		if((KEY3 == 0) && Set_Flag)
		{
				key3_sum++;
				if(key3_sum == 1)
				{
						switch(Select_Flag)
						{
								case 1: TH_compare++;
												if(TH_compare > 60) TH_compare = 60;
												break;
								case 2: RH_cpmpare += 5;
												if(RH_cpmpare > 90) RH_cpmpare = 90;
												break;
								case 3: Remember_Delay++;
												if(Remember_Delay > 5) Remember_Delay = 5;
												break;
								case 4: Ceshi_Fre += 500;
												if(Ceshi_Fre > 10000) Ceshi_Fre = 10000;
												TIM2_Ch2_PWM_Init(Ceshi_Fre,0);
												break;
						}
				}
		}else
		{
				key3_sum  = 0;
		}
		//KEY4
		if((KEY4 == 0) && Set_Flag)
		{
				key4_sum++;
				if(key4_sum == 1)
				{
						switch(Select_Flag)
						{
								case 1: TH_compare--;
												if(TH_compare < -20) TH_compare = -20;
												break;
								case 2: RH_cpmpare -= 5;
												if(RH_cpmpare < 10) RH_cpmpare = 10;
												break;
								case 3: Remember_Delay--;
												if(Remember_Delay < 1) Remember_Delay = 1;
												break;
								case 4: Ceshi_Fre -= 500;
												if(Ceshi_Fre < 1000) Ceshi_Fre = 1000;
												TIM2_Ch2_PWM_Init(Ceshi_Fre,0);
												break;
						}
				}
		}else
		{
				key4_sum  = 0;
		}
}

//SEVENTH-ONE//
dian ya ce liang jian kong she bei
//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "stdio.h"
#include "i2c.h"
u32 TimingDelay = 0;
u8 string[20];
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RXBUF[20] = {0};
u8 RTC_flag = 0;
u32 TimeVal;
u8 key_read_flag = 0;
u8 _200ms_flag = 0;
float ADC_val;
float k;
u8 i;
extern u16 LED_MODE;
extern u8 B1_ALA_Flag;
extern u8 B2_Set_Flag;
extern u8 ALA_hour,ALA_min,ALA_sec;
void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	u8 hour,min,sec;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	USART2_Init(9600);
	RTC_Init(23,59,55);
	ADC1_Init();
	LED_Init();
	KEY_Init();
	k = _24c02_Read(0xaa) / 10.0;
	while(1)
	{
			if(RXOVER == 1)  //串口接收
			{
					RXOVER = 0;
//					USART2_SendString(RXBUF);
					if(((RXBUF[3] - 0x30) >= 1) && ((RXBUF[3] - 0x30) <= 9))
					{
							k = (RXBUF[3] - 0x30) / 10.0;
							_24c02_Write(0xaa,RXBUF[3] - 0x30);
							USART2_SendString((u8*)"OK\n");
					}
					for(i=0;i<20;i++)
					{
							RXBUF[i] = 0;
					}
					USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
			}
			
			if(RTC_flag == 1)  //RTC
			{
					RTC_flag = 0;
					TimeVal = RTC_GetCounter();
					hour = TimeVal / 3600;
					min = TimeVal % 3600 / 60;
					sec = TimeVal % 3600 % 60;
					if(TimeVal == (ALA_hour * 3600 + ALA_min * 60 + ALA_sec))
					{
						for(i=0;i<20;i++)
						{
							string[i] = 0;
						}
						sprintf((char*)string,"%.2f+%.1f+%.2d%.2d%.2d\n",ADC_val,k,ALA_hour,ALA_min,ALA_sec);
						USART2_SendString(string);
					}
			}
			
			if(key_read_flag == 1)  // KEY
			{
					KEY_Read();
					key_read_flag = 0;
			}
			
			if(!B2_Set_Flag)
			{
					sprintf((char*)string,"  V1 : %.2f          ",ADC_val);
					LCD_DisplayStringLine(Line3, string);
					sprintf((char*)string,"  k : %.1f          ",k);
					LCD_DisplayStringLine(Line4, string);
					if(B1_ALA_Flag)
					{
							LCD_DisplayStringLine(Line5,(u8*)"  LED : ON            ");
					}else
					{
							LCD_DisplayStringLine(Line5,(u8*)"  LED : OFF           ");
					}
					sprintf((char*)string,"  T : %.2d-%.2d-%.2d       ",hour,min,sec);
					LCD_DisplayStringLine(Line6, string);
					sprintf((char*)string,"                   %d",1);
					LCD_DisplayStringLine(Line9, string);
			}else
			{
					LCD_DisplayStringLine(Line3,(u8*)"     setting         ");
					sprintf((char*)string,"     %.2d-%.2d-%.2d         ",ALA_hour,ALA_min,ALA_sec);
					LCD_DisplayStringLine(Line6, string);
					sprintf((char*)string,"                   %d",2);
					LCD_DisplayStringLine(Line9, string);
			}
			ADC_val = Get_Adc() * 3.3 / 4096;
			
			if((ADC_val > (3.3 * k)) && (B1_ALA_Flag) && (_200ms_flag))  // LED  alarm
			{
					_200ms_flag = 0;
					LED_MODE ^= (1<<8);
					GPIOC->ODR  = LED_MODE;
					GPIOD->ODR |= (1<<2);
					GPIOD->ODR &=~(1<<2);
			}else
			{
					LED_MODE |= (1<<8);
					GPIOC->ODR  = LED_MODE;
					GPIOD->ODR |= (1<<2);
					GPIOD->ODR &=~(1<<2);
			}
	}
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//IT.C//
void USART2_IRQHandler(void)
{
		u8 temp = 0;
		if(USART_GetITStatus(USART2, USART_IT_RXNE) == 1)
		{
				USART_ClearITPendingBit(USART2,USART_IT_RXNE);
				temp = USART_ReceiveData(USART2);
				if(temp == '\n')
				{
						RXCUNT = 0;
						RXOVER = 1;
						USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
				}else
				{
						RXBUF[RXCUNT] = temp;
						RXCUNT++;
				}
		}
}

void RTC_IRQHandler(void)
{
		u32 counter;
		if(RTC_GetITStatus(RTC_IT_SEC) == 1)
		{
				RTC_ClearITPendingBit(RTC_IT_SEC);
				RTC_flag = 1;
				RTC_WaitForLastTask();
				counter = RTC_GetCounter();
				RTC_WaitForLastTask();
				if(counter == (23 * 3600 + 59 * 60 + 59))
				{
						RTC_SetCounter(0x0);
						RTC_WaitForLastTask();
				}
				
		}
}
void SysTick_Handler(void)
{
	static u8 key_sum = 0;
	static u8 _200ms_sum = 0;
	TimingDelay--;
	if(++key_sum == 50)  //50ms
	{
			key_sum = 0;
			key_read_flag = 1;
	}
	
	if(++_200ms_sum == 200) // 200ms
	{
			_200ms_sum = 0;
			_200ms_flag = 1;
	}
}

//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void RTC_Init(u8 HH,u8 MM,u8 SS);
void _24c02_Write(u8 address,u8 dat);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif

//IO.C//
#include "IO.h"
u16 LED_MODE = 0XFFFF;
u8 B1_ALA_Flag = 1; //复位默认打开
u8 B2_Set_Flag = 0; //默认界面1
u8 ALA_hour = 0,ALA_min = 0,ALA_sec = 0;
u8 B3_Select_Flag = 0;
// 串口部分  ///
void USART2_Init(u32 bound)
{
		GPIO_InitTypeDef GPIO_InitStructure;	
		USART_InitTypeDef USART_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		USART_InitStructure.USART_BaudRate = bound;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_Parity = USART_Parity_No;
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_Init(USART2, &USART_InitStructure);
		
		NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
		
		USART_Cmd(USART2, ENABLE);
		USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
		
}

void USART2_SendString(u8 *str)
{
		u8 index = 0;
		do
		{
				USART_SendData(USART2, str[index]);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);
				index++;
		}while(str[index] != 0);
}
/ RTC部分 ///
void RTC_Init(u8 HH,u8 MM,u8 SS)
{
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
	
		NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	
		PWR_BackupAccessCmd(ENABLE);
		BKP_DeInit();
	
		RCC_LSICmd(ENABLE);
		while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0);
	
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
	
		RTC_ITConfig(RTC_IT_SEC,ENABLE);
		RTC_WaitForLastTask();
	
		RTC_SetPrescaler(40000 - 1);
		RTC_WaitForLastTask();
	
		RTC_SetCounter(HH * 3600 + MM * 60 + SS);
		RTC_WaitForLastTask();
}

//  ADC 部分  
void ADC1_Init(void)
{
		ADC_InitTypeDef ADC_InitStructure;
		GPIO_InitTypeDef GPIO_InitStructure;	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
		ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;
		ADC_InitStructure.ADC_NbrOfChannel = 1;
		ADC_Init(ADC1, &ADC_InitStructure);
		ADC_Cmd(ADC1, ENABLE);
		ADC_ResetCalibration(ADC1);
		while(ADC_GetResetCalibrationStatus(ADC1));
	
		ADC_StartCalibration(ADC1);
		while(ADC_GetCalibrationStatus(ADC1));
		
		
}

u16 Get_Adc(void)
{
		ADC_RegularChannelConfig( ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
	
		ADC_SoftwareStartConvCmd(ADC1,ENABLE);
		while(ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) == 0);
		
		return ADC_GetConversionValue(ADC1);
}
//   24c02 部分//
void _24c02_Write(u8 address,u8 dat)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(dat);
		I2CWaitAck();
		I2CStop();
}

u8 _24c02_Read(u8 address)
{
		u8 dat;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		dat = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return dat;
}
//    LED 部分   
void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;	
		GPIO_InitStructure.GPIO_Pin = 0xff00;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOC, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_Init(GPIOD, &GPIO_InitStructure);
	
		GPIOC->ODR  = LED_MODE;
		GPIOD->ODR |= (1<<2);
		GPIOD->ODR &=~(1<<2);
}

//     按键部分    /
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void KEY_Read(void)
{
		static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1)
				{
						B1_ALA_Flag ^= 1;
				}
		}else
		{
				key1_sum = 0;
		}
		
		if(KEY2 == 0)
		{
				key2_sum++;
				if(key2_sum == 1)
				{
						B2_Set_Flag ^= 1;
						LCD_ClearLine(Line0);
						LCD_ClearLine(Line1);
						LCD_ClearLine(Line2);
						LCD_ClearLine(Line3);
						LCD_ClearLine(Line4);
						LCD_ClearLine(Line5);
						LCD_ClearLine(Line6);
						LCD_ClearLine(Line7);
						LCD_ClearLine(Line8);
						LCD_ClearLine(Line9);
				}
		}else
		{
				key2_sum = 0;
		}
		
		if(KEY3 == 0)
		{
				key3_sum++;
				if((key3_sum == 1) && B2_Set_Flag)
				{
						B3_Select_Flag++;
						if(B3_Select_Flag > 2)
						{
								B3_Select_Flag = 0;
						}
				}
		}else
		{
				key3_sum = 0;
		}
		
		if(KEY4 == 0)
		{
				key4_sum++;
				if((key4_sum == 1) && B2_Set_Flag)
				{
						if(B3_Select_Flag == 0)
						{
								ALA_hour++;
								if(ALA_hour >= 24) ALA_hour = 0;
						}else
						if(B3_Select_Flag == 1)
						{
								ALA_min++;
								if(ALA_min >= 60) ALA_min = 0;
						}else
						if(B3_Select_Flag == 2)
						{
								ALA_sec++;
								if(ALA_sec >= 60) ALA_sec = 0;
						}
				}
		}else
		{
				key4_sum = 0;
		}
}

//SEVENTH-TWO//
mo ni ye wei jian ce jing gao xi tong 

//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "i2c.h"
#include "IO.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 string[20];
u8 ADC_Flag = 0;
u8 KEY_Flag = 0;
u8 LED_Flag = 0;
u8 Display_Flag = 0;
u8 Level_Last = 0;
u8 Shan2_sum = 0;
u8 Shan3_sum = 0;
float ADC_Val;
u8 Height;
u8 Threshold1 = 30;
u8 Threshold2 = 50;
u8 Threshold3 = 70;
u8 Level = 0;
u16 LED_MODE = 0XFFFF;
extern u8 RXCUNT;
extern u8 RXOVER;
extern u8 RX_BUF[20];
extern u8 Set_Flag;
extern u8 Threshold_Flag;
void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	u8 i;
	u8 LD1_Flag = 0;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	ADC1_Init();
	USART2_Init(9600);
	LED_Init();
	KEY_Init();
	Threshold1 = _24c02_Read(0x00);
	Delay_Ms(5);
	Threshold2 = _24c02_Read(0x01);
	Delay_Ms(5);
	Threshold3 = _24c02_Read(0x02);
	Delay_Ms(5);
	while(1)
	{
//			sprintf(string,"  %.2f               ",ADC_Val);
//			LCD_DisplayStringLine(Line3, string);
			///   ADC   /
			if(ADC_Flag)
			{
					ADC_Val = Get_Adc() * 3.3 / 4096.0;
					Height = 100 * ADC_Val / 3.3;
					if(Height <= Threshold1)
					{
							Level = 0;
					}else
					if((Height > Threshold1) && (Height <= Threshold2))
					{
							Level = 1;
					}else
					if((Height > Threshold2) && (Height <= Threshold3))
					{
							Level = 2;
					}else
					if(Height > Threshold3)
					{
							Level = 3;
					}
					ADC_Flag = 0;
			}
			///  USART2   //
			if(RXOVER)
			{
					Shan3_sum = 10;
					if(RX_BUF[0] == 'C')
					{
							for(i = 0;i < 20;i++)
							{
									string[i] = 0;
							}
							sprintf((char*)string,"C:H%d+L%d\r\n",Height,Level);
							USART2_SendString(string);
					}
					if(RX_BUF[0] == 'S')
					{
							for(i = 0;i < 20;i++)
							{
									string[i] = 0;
							}
							sprintf((char*)string,"S:TL%d+TM%d+TH%d\r\n",Threshold1,Threshold2,Threshold3);
							USART2_SendString(string);
					}
					for(i = 0;i < 20;i++)
					{
							RX_BUF[i] = 0;
					}
					USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
					RXOVER = 0;
			}
			///   KEY   /
			if(KEY_Flag)
			{
					KEY_Read();
					KEY_Flag = 0;
			}
			///   LED   //
			if(LED_Flag)  // 100ms
			{
					LD1_Flag++;
					if(LD1_Flag == 10)
					{
							LD1_Flag = 0;
							LED_MODE ^= (1<<8);
					}
					if(Level_Last != Level)
					{
							Shan2_sum = 10;
							if(Level > Level_Last)
							{
									for(i = 0;i < 20;i++)
									{
											string[i] = 0;
									}
									sprintf((char*)string,"A:H%d+L%d+U\r\n",Height,Level);
									USART2_SendString(string);
							}else
							if(Level < Level_Last)
							{
									for(i = 0;i < 20;i++)
									{
											string[i] = 0;
									}
									sprintf((char*)string,"A:H%d+L%d+D\r\n",Height,Level);
									USART2_SendString(string);
							}
							Level_Last = Level;
					}
					if(!(LD1_Flag % 2))  // 200ms
					{
							if(Shan2_sum)
							{
									LED_MODE ^= (1<<9);
									Shan2_sum--;
							}
							if(Shan3_sum)
							{
									LED_MODE ^= (1<<10);
									Shan3_sum--;
							}
					}
					GPIOC-> ODR = LED_MODE;
					GPIOD-> ODR |= (1<<2);
					GPIOD-> ODR &=~(1<<2);
					LED_Flag = 0;
			}
			///   Display   //
			if(Display_Flag)
			{
					if(!Set_Flag)
					{
							LCD_SetTextColor(White);
							LCD_DisplayStringLine(Line1, (u8*)"    Liquid Level     ");
							sprintf((char*)string," Height : %dcm              ",Height);
							LCD_DisplayStringLine(Line3, string);
							sprintf((char*)string," ADC : %.2fV              ",ADC_Val);
							LCD_DisplayStringLine(Line5, string);
							sprintf((char*)string," Level : %d               ",Level);
							LCD_DisplayStringLine(Line7, string);
					}else
					{
							LCD_SetTextColor(White);
							LCD_DisplayStringLine(Line1, (u8*)"  Parameter Setup     ");
							if(Threshold_Flag == 1)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," Threshold 1 : %dcm       ",Threshold1);
							LCD_DisplayStringLine(Line3, string);
							if(Threshold_Flag == 2)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," Threshold 2 : %dcm       ",Threshold2);
							LCD_DisplayStringLine(Line5, string);
							if(Threshold_Flag == 3)
							{
									LCD_SetTextColor(Green);
							}else
							{
									LCD_SetTextColor(White);
							}
							sprintf((char*)string," Threshold 3 : %dcm       ",Threshold3);
							LCD_DisplayStringLine(Line7, string);
					}
					Display_Flag = 0;
			}
			
	}
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//IT.C//
extern u8 ADC_Flag;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
extern u8 Display_Flag;
extern u8 KEY_Flag;
extern u8 LED_Flag;
void SysTick_Handler(void)
{
		static u16 adc_sum = 0;
		static u8 key_sum = 0;
		static u8 display_sum = 0;
		static u8 led_sum = 0;
		TimingDelay--;
		if(++adc_sum == 1000) 
		{
				adc_sum = 0;
				ADC_Flag = 1;
		}
		if(++key_sum == 50)
		{
				key_sum = 0;
				KEY_Flag = 1;
		}
		if(++display_sum == 100)
		{
				display_sum = 0;
				Display_Flag = 1;
		}
		if(++led_sum == 100)
		{
				led_sum = 0;
				LED_Flag = 1;
		}
}

void USART2_IRQHandler(void)
{
		u16 temp;
		if(USART_GetITStatus(USART2, USART_IT_RXNE) == 1)
		{
				USART_ClearITPendingBit( USART2, USART_IT_RXNE);
				temp = USART_ReceiveData(USART2);
				if(temp == '\n')
				{
						RXCUNT = 0;
						RXOVER = 1;
						USART_ITConfig(USART2,USART_IT_RXNE, DISABLE);
				}else
				{
						RX_BUF[RXCUNT] = temp;
						RXCUNT++;
				}
		}
}

//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
extern void Delay_Ms(u32 nTime);
#endif

//IO.C//
#include "IO.h"
extern u16 LED_MODE;
u8 Set_Flag = 0;
u8 Threshold_Flag = 1;
extern u8 Threshold1;
extern u8 Threshold2;
extern u8 Threshold3;
///  24c02  ///
void _24c02_Write(u8 address,u8 data)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(data);
		I2CWaitAck();
		I2CStop();
}

u8 _24c02_Read(u8 address)
{
		u8 temp;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
	
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		temp = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return temp;
}
  ADC  ///
void ADC1_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		ADC_InitTypeDef ADC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOB, &GPIO_InitStructure);
	
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
		ADC_InitStructure.ADC_NbrOfChannel = 1;
		ADC_Init(ADC1,&ADC_InitStructure);
	
		ADC_Cmd( ADC1, ENABLE);
	
		ADC_ResetCalibration( ADC1);
		while(ADC_GetResetCalibrationStatus(ADC1));
		 
		ADC_StartCalibration(ADC1);
		while(ADC_GetCalibrationStatus(ADC1));
}

u16 Get_Adc(void)
{
		u16 temp;
		ADC_RegularChannelConfig( ADC1,ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
		ADC_SoftwareStartConvCmd( ADC1, ENABLE);
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
		temp = ADC_GetConversionValue( ADC1);
		ADC_SoftwareStartConvCmd( ADC1, DISABLE);
		return temp;
}


///  USART2  ///
void USART2_Init(u32 bound)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		USART_InitTypeDef USART_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOA, &GPIO_InitStructure);
	
		NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	
		USART_InitStructure.USART_BaudRate = bound;
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
		USART_InitStructure.USART_Parity = USART_Parity_No;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_Init(USART2, &USART_InitStructure);
		
		USART_Cmd(USART2, ENABLE);
		USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
}
void USART2_SendString(u8 *str)
{
		u8 index = 0;
		do
		{
				USART_SendData(USART2, str[index]);
				while(USART_GetFlagStatus( USART2,USART_FLAG_TXE) == 0);
				index++;
		}while(str[index] != 0);
}
   LED   /
void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOD, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = 0XFF00;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOC, &GPIO_InitStructure);
	
		GPIOC-> ODR = 0XFFFF;
		GPIOD-> ODR |= (1<<2);
		GPIOD-> ODR &=~(1<<2);
}
//   KEY   //
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init( GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init( GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
		static u16 key1_sum,key2_sum,key3_sum,key4_sum;
		// KEY1
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1)
				{
						Set_Flag ^= 1;
						LCD_ClearLine(Line0);
						LCD_ClearLine(Line1);	
						LCD_ClearLine(Line2);
						LCD_ClearLine(Line3);
						LCD_ClearLine(Line4);
						LCD_ClearLine(Line5);
						LCD_ClearLine(Line6);
						LCD_ClearLine(Line7);
						LCD_ClearLine(Line8);
						LCD_ClearLine(Line9);
				}
		}else
		{
				key1_sum = 0;
		}
		// KEY2
		if((KEY2 == 0) && Set_Flag)
		{
				key2_sum++;
				if(key2_sum == 1)
				{
						Threshold_Flag++;
						if(Threshold_Flag >= 4) Threshold_Flag = 1;
				}
		}else
		{
				key2_sum = 0;
		}
		// KEY3
		if((KEY3 == 0) && Set_Flag)
		{
				key3_sum++;
				if(key3_sum == 1)
				{
						if(Threshold_Flag == 1)
						{
								Threshold1 += 5;
						}
						if(Threshold_Flag == 2)
						{
								Threshold2 += 5;
						}
						if(Threshold_Flag == 3)
						{
								Threshold3 += 5;
						}
						if(Threshold1 > 95) Threshold1 = 95;
						if(Threshold2 > 95) Threshold2 = 95;
						if(Threshold3 > 95) Threshold3 = 95;
						_24c02_Write(0x00,Threshold1);
						Delay_Ms(5);
						_24c02_Write(0x01,Threshold2);
						Delay_Ms(5);
						_24c02_Write(0x02,Threshold3);
						Delay_Ms(5);
				}
		}else
		{
				key3_sum = 0;
		}
		// KEY4
		if((KEY4 == 0) && Set_Flag)
		{
				key4_sum++;
				if(key4_sum == 1)
				{
						if(Threshold_Flag == 1)
						{
								Threshold1 -= 5;
						}
						if(Threshold_Flag == 2)
						{
								Threshold2 -= 5;
						}
						if(Threshold_Flag == 3)
						{
								Threshold3 -= 5;
						}
						if(Threshold1 < 5) Threshold1 = 5;
						if(Threshold2 < 5) Threshold2 = 5;
						if(Threshold3 < 5) Threshold3 = 5;
						_24c02_Write(0x00,Threshold1);
						Delay_Ms(5);
						_24c02_Write(0x01,Threshold2);
						Delay_Ms(5);
						_24c02_Write(0x02,Threshold3);
						Delay_Ms(5);
				}
		}else
		{
				key4_sum = 0;
		}
}

//SIXTH//
shuang tong dao fang bo pin lv jian ce yu bei pin shu chu  

//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "stdio.h"
#include "i2c.h"
u32 TimingDelay = 0;
extern u16 TIM3_Ch1_Val;
extern u16 TIM3_Ch2_Val;
extern u16 LED_MODE;
extern u8 Channal_1_N;
extern u8 Channal_2_N;
extern u8 Channal_Flag;
extern u8 Set_Flag;
u16 capture;
u32 TIM2_CH2_CAPTURE_HL = 0;
u8 TIM2_CH2_CAPTURE_MODE = 0;
u32 TIM2_CH3_CAPTURE_HL = 0;
u8 TIM2_CH3_CAPTURE_MODE = 0;
u8 Channal_1_Enable = 1;
u8 Channal_2_Enable = 1;
u32 Channal_1_Frequency;
u32 Channal_2_Frequency;
u8 CAPTURE_Flag = 0;
u8 KEY_Flag = 0;
u8 OUTPUT_Flag = 0;
u8 Display_Flag = 0;
u8 string[20];
u8 LED_Flag = 0;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
u8 i;
void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	Channal_1_N = _24c02_Read(0x01);
	Delay_Ms(10);
	Channal_2_N = _24c02_Read(0x11);
	TIM3_OUTPUT_Init(5000,10000,1,1,1);
	TIM2_CAPTURE_Init();
	KEY_Init();
	LED_Init();
	TIM1_PWM_Init();
	USART2_Init(9600);
	while(1)
	{
			
			/// 按键
			if(KEY_Flag)   
			{
					KEY_Read();
					KEY_Flag = 0;
			}
			/// 捕获读取
			if(TIM2_CH2_CAPTURE_MODE == 2)
			{
					Channal_1_Frequency = 1000000 / TIM2_CH2_CAPTURE_HL;
					if((Channal_1_Frequency < 50) || (Channal_1_Frequency > 50000))
					{
							Channal_1_Enable = 0;
					}else
					{
							Channal_1_Enable = 1;
					}
					TIM2_CH2_CAPTURE_MODE = 0;
			}
			if(TIM2_CH3_CAPTURE_MODE == 2)
			{
					Channal_2_Frequency = 1000000 / TIM2_CH3_CAPTURE_HL;
					if((Channal_2_Frequency < 50) || (Channal_2_Frequency > 50000))
					{
							Channal_2_Enable = 0;
					}else
					{
							Channal_2_Enable = 1;
					}
					TIM2_CH3_CAPTURE_MODE = 0;
			}
			/// 输出改变
			if(OUTPUT_Flag)
			{
					TIM3_OUTPUT_Init(Channal_1_Frequency * Channal_1_N,Channal_2_Frequency * Channal_2_N,0,Channal_1_Enable,Channal_2_Enable);
					OUTPUT_Flag = 0;
			}
			///  LCD显示
			if(Display_Flag)
			{
					sprintf((char*)string," Channel(1):%dHZ        ",Channal_1_Frequency);
					LCD_DisplayStringLine(Line2, string);
					sprintf((char*)string," N(1):%d                ",Channal_1_N);
					LCD_DisplayStringLine(Line3, string);
					sprintf((char*)string," Channel(2):%dHZ        ",Channal_2_Frequency);
					LCD_DisplayStringLine(Line4, string);
					sprintf((char*)string," N(2):%d                ",Channal_2_N);
					LCD_DisplayStringLine(Line5, string);
					sprintf((char*)string,"                %d ",Channal_Flag + 1);
					LCD_DisplayStringLine(Line8, string);
					Display_Flag = 0;
			}
			///  LED 显示
			if(LED_Flag)
			{
					if(Set_Flag)
					{
							LED_MODE &=~(1<<10);
					}else
					{
							LED_MODE |= (1<<10);
					}
					
					if(Channal_1_Frequency)
					{
							LED_MODE &=~(1<<8);
					}else
					{
							LED_MODE |= (1<<8);
					}
					
					if(Channal_2_Frequency)
					{
							LED_MODE &=~(1<<9);
					}else
					{
							LED_MODE |= (1<<9);
					}
					GPIOC->ODR = LED_MODE;
					GPIOD->ODR |= (1<<2);
					GPIOD->ODR &=~(1<<2);
					LED_Flag = 0;	
			}
			///  USART2  RX
			if(RXOVER)
			{
				//	USART2_SendString(RX_BUF);
					if(Set_Flag == 1)
					{
							if((RX_BUF[4] - 0X30) == 1)
							{
									Channal_1_N = (RX_BUF[6] - 0X30) * 10 + (RX_BUF[7] - 0X30);
							}
							if((RX_BUF[4] - 0X30) == 2)
							{
									Channal_2_N = (RX_BUF[6] - 0X30) * 10 + (RX_BUF[7] - 0X30);
							}
					}
					for(i=0;i<20;i++)
					{
							RX_BUF[i] = 0;
					}
					USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
					RXOVER = 0;
			}
	}
}


//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//IT.C//
void TIM3_IRQHandler(void)
{
		if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == 1)
		{
				TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
				capture = TIM_GetCapture1(TIM3);
				TIM_SetCompare1(TIM3,capture + TIM3_Ch1_Val * 0.5);
		}
		
		if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == 1)
		{
				TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
				capture = TIM_GetCapture2(TIM3);
				TIM_SetCompare2(TIM3,capture + TIM3_Ch2_Val * 0.5);
		}
}

void TIM2_IRQHandler(void)
{
		if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == 1)
		{
				TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
				if(!CAPTURE_Flag)
				{
						switch(TIM2_CH2_CAPTURE_MODE)
						{
							case 0: TIM2_CH2_CAPTURE_HL = 0;
											TIM2_CH2_CAPTURE_MODE = 1;
											TIM_SetCounter(TIM2,0x0);
											break;
							case 1: TIM2_CH2_CAPTURE_HL = TIM_GetCounter(TIM2);
											TIM2_CH2_CAPTURE_MODE = 2;
											break;
							default:break;
						}
				}else
				{
						TIM2_CH2_CAPTURE_MODE = 0;
				}
		}
		
		
		if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
		{
				TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
				if(CAPTURE_Flag)
				{
						switch(TIM2_CH3_CAPTURE_MODE)
						{
							case 0: TIM2_CH3_CAPTURE_HL = 0;
											TIM2_CH3_CAPTURE_MODE = 1;
											TIM_SetCounter(TIM2,0x0);
											break;
							case 1: TIM2_CH3_CAPTURE_HL = TIM_GetCounter(TIM2);
											TIM2_CH3_CAPTURE_MODE = 2;
											break;
							default:break;
						}
				}else
				{
						TIM2_CH3_CAPTURE_MODE = 0;
				}
		}
}
void USART2_IRQHandler(void)
{
		u8 temp;
		if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)
		{
				USART_ClearITPendingBit(USART2,USART_IT_RXNE);
				temp = USART_ReceiveData(USART2);
				if(temp == '\n')
				{
						RXCUNT = 0;
						RXOVER = 1;
						USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
				}else
				{
						RX_BUF[RXCUNT] = temp;	
						RXCUNT++;
				}
		}	
}

void SysTick_Handler(void)
{
		static u8 CAPTURE_sum = 0;
		static u8 KEY_sum = 0;
		static u16 OUTPUT_sum = 0;
		static u8 Display_sum = 0;
		static u8 LED_sum = 0;
		TimingDelay--;
		if(++CAPTURE_sum == 200)  // 200ms
		{
				CAPTURE_sum = 0;
				CAPTURE_Flag ^= 1;
		}
		if(++KEY_sum == 50)  //50ms
		{
				KEY_sum = 0;
				KEY_Flag = 1;
		}
		if(++OUTPUT_sum == 1000)// 1s
		{
				OUTPUT_sum = 0;
				OUTPUT_Flag = 1;
		}
		if(++Display_sum == 100) // 100ms
		{
				Display_sum = 0;
				Display_Flag = 1;
		}
		if(++LED_sum == 50) //50ms
		{
				LED_sum = 0;
				LED_Flag = 1;
		}
}

//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
u8 _24c02_Read(u8 address);
void _24c02_Write(u8 address,u8 data);
void TIM3_OUTPUT_Init(u16 ch2_fre,u16 ch3_fre,u8 status,u8 Ch1_Enable,u8 Ch2_Enable);
void TIM2_CAPTURE_Init(void);
void KEY_Init(void);
void KEY_Read(void);
void LED_Init(void);
void TIM1_PWM_Init(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
extern void Delay_Ms(u32 nTime);
#endif

//IO.C//
#include "IO.h"
u16 TIM3_Ch1_Val;
u16 TIM3_Ch2_Val;
u16 LED_MODE = 0XFFFF;
u8 Set_Flag = 0;
u8 Channal_Flag = 0;
u8 Channal_1_N = 1;
u8 Channal_2_N = 1;
   24c02    /
u8 _24c02_Read(u8 address)
{
		u8 data;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
	
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		data = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return data;
}

void _24c02_Write(u8 address,u8 data)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(data);
		I2CWaitAck();
		I2CStop();
}

   TIM3  倍频输出部分  /
void TIM3_OUTPUT_Init(u16 ch2_fre,u16 ch3_fre,u8 status,u8 Ch1_Enable,u8 Ch2_Enable)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		TIM_OCInitTypeDef TIM_OCInitStructure;
		if(status)
		{
				RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
				RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
			
				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
				GPIO_Init(GPIOA, &GPIO_InitStructure);
			
				TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
				TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
				TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
				TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
				TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
			
				NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
				NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
				NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
				NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
				NVIC_Init(&NVIC_InitStructure);
		}
		TIM3_Ch1_Val = 1000000 / ch2_fre;
		TIM3_Ch2_Val = 1000000 / ch3_fre;
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		if(Ch1_Enable)
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		}else
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
		}
		TIM_OCInitStructure.TIM_Pulse = TIM3_Ch2_Val;
		TIM_OC1Init(TIM3,&TIM_OCInitStructure);
		
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		if(Ch2_Enable)
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		}else
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
		}
		TIM_OCInitStructure.TIM_Pulse = TIM3_Ch2_Val;
		TIM_OC2Init(TIM3,&TIM_OCInitStructure);
		
		TIM_SetCompare1(TIM3, 0x0);
		TIM_SetCompare2(TIM3, 0x0);
		TIM_Cmd(TIM3, ENABLE);
		TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
}
/   测试方波    
void TIM1_PWM_Init(void)
{
		u16 fre;
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		TIM_OCInitTypeDef TIM_OCInitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		
		fre = 1000000 / 2000;
		TIM_TimeBaseInitStructure.TIM_Period = fre - 1;
		TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
		TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
		TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
	
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		TIM_OCInitStructure.TIM_Pulse = (fre - 2) * 0.5;
		TIM_OC2Init(TIM1,&TIM_OCInitStructure);
		
		TIM_CtrlPWMOutputs( TIM1,ENABLE);
		TIM_Cmd(TIM1, ENABLE);
}
//  TIM2 捕获部分  
void TIM2_CAPTURE_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		TIM_ICInitTypeDef TIM_ICInitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
		TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
		TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
		TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
		NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
		
		TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
		TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
		TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
		TIM_ICInitStructure.TIM_ICFilter = 0x0;
		TIM_ICInit(TIM2, &TIM_ICInitStructure);
		
		TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
		TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
		TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
		TIM_ICInitStructure.TIM_ICFilter = 0x0;
		TIM_ICInit(TIM2, &TIM_ICInitStructure);
		
		TIM_Cmd(TIM2, ENABLE);
		TIM_ITConfig(TIM2, TIM_IT_CC3 | TIM_IT_CC2, ENABLE);
}
/    按键部分   ///
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void KEY_Read(void)
{
		static u16 key1_sum,key2_sum,key3_sum,key4_sum;
		//KEY1
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1)
				{
						Set_Flag ^= 1;
				}
		}else
		{
				key1_sum = 0;
		}
		//KEY2
		if(KEY2 == 0)
		{
				key2_sum++;
				if((key2_sum == 1) && (Set_Flag == 0))
				{
						Channal_Flag ^= 1;
				}
		}else
		{
				key2_sum = 0;
		}
		//KEY3
		if(KEY3 == 0)
		{
				key3_sum++;
				if((key3_sum == 1) && (Set_Flag == 0))
				{
						if(!Channal_Flag)
						{
								Channal_1_N++;
						}else
						{
								Channal_2_N++;
						}
						_24c02_Write(0x01,Channal_1_N);
						Delay_Ms(10);
						_24c02_Write(0x11,Channal_2_N);
				}
		}else
		{
				key3_sum = 0;
		}
		//KEY4
		if(KEY4 == 0)
		{
				key4_sum++;
				if((key4_sum == 1) && (Set_Flag == 0))
				{
						if(!Channal_Flag)
						{
								Channal_1_N--;
						}else
						{
								Channal_2_N--;
						}
						if(Channal_1_N < 1) Channal_1_N = 1;
						if(Channal_2_N < 1) Channal_2_N = 1;
						_24c02_Write(0x01,Channal_1_N);
						Delay_Ms(10);
						_24c02_Write(0x11,Channal_2_N);
				}
		}else
		{
				key4_sum = 0;
		}
}
//  LED 部分  ///
void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
		GPIO_InitStructure.GPIO_Pin = 0XFF00;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOC, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOD, &GPIO_InitStructure);
	
		GPIOC-> ODR = 0XFFFF;
		GPIOD-> ODR |= (1<<2);
		GPIOD-> ODR &=~(1<<2);
}
// 串口部分  /
void USART2_Init(u32 bound)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		USART_InitTypeDef USART_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
//		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		USART_InitStructure.USART_BaudRate = bound;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_InitStructure.USART_Mode = USART_Mode_Rx ;
		USART_InitStructure.USART_Parity = USART_Parity_No;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_Init(USART2, &USART_InitStructure);
		
		NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
		
		USART_Cmd(USART2, ENABLE);
		USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
void USART2_SendString(u8 *str)
{
		u8 index = 0;
		do
		{
				USART_SendData(USART2, str[index]);
				while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == 0);
				index++;
		}while(str[index] != 0);
}

//SIXTH-LATE//
(jue sai) dian ya ce liang yu hu pu PWM xin hao shu chu 

/main.c//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "i2c.h"
#include "stdio.h"

u32 TimingDelay = 0;
u8 string[20];
float ADCVal;
u8 KEY_Flag = 0;
u8 ADC_Flag = 0;
u8 Display_Flag = 0;
u8 PWM_Enable = 1;
u16 PWM_Frequency = 1000;
float P;
float ADC_Val;
extern u8 Set_Flag;

void Delay_Ms(u32 nTime);
extern u16 LED_MODE;
//Main Body
int main(void)
{

	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	i2c_init();
	LED_Init();
	KEY_Init();
	ADC1_Init();
	PWM_Frequency = _24c02_Read(0xaa) * 1000;
	TIM1_PWM_Init(PWM_Frequency,P,1,PWM_Enable);
	while(1)
	{
//			ADCVal = Get_Adc() * 3.3 / 4096;
//			sprintf(string,"%.2f         ",ADCVal);
//			LCD_DisplayStringLine(Line3, string);
		
			   KEY   //
			if(KEY_Flag)
			{
					KEY_Read();
					KEY_Flag = 0;
			}
			///  ADC  /
			if(ADC_Flag)
			{
					ADC_Flag = 0;
					ADC_Val = Get_Adc() * 3.3 / 4096;
					P = ADC_Val * 100 / 3.3;
					TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
			}
			//   Display   //
			if(Display_Flag)
			{
					Display_Flag = 0;
					if(!Set_Flag)
					{
							LCD_DisplayStringLine(Line1, (u8*)"        totle     ");
							sprintf((char*)string,"ADC_Val:%.2fV         ",ADC_Val);
							LCD_DisplayStringLine(Line3, string);
							if(PWM_Enable)
							{
									LCD_DisplayStringLine(Line4, (u8*)"OutPut:Open         ");
							}else
							{
									LCD_DisplayStringLine(Line4, (u8*)"OutPut:Off          ");
							}
							sprintf((char*)string,"Signal_Val:PA9: %d            ",(u8)P);
							LCD_DisplayStringLine(Line5, string);
							sprintf((char*)string,"           PB14:%d            ",(u8)(100-P));
							LCD_DisplayStringLine(Line6, string);
							sprintf((char*)string,"           %dkHZ            ",PWM_Frequency / 1000);
							LCD_DisplayStringLine(Line7, string);
							LCD_DisplayStringLine(Line9, (u8*)"                  1");
					}else
					{
							LCD_DisplayStringLine(Line1, (u8*)"      Set_Mode       ");
							sprintf((char*)string,"  Signal_Fre:%dkHZ            ",PWM_Frequency / 1000);
							LCD_DisplayStringLine(Line5, string);
							LCD_DisplayStringLine(Line9, (u8*)"                  2");
					}
			}
	}
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//IT.C//
extern u8 KEY_Flag;
extern u8 ADC_Flag;
extern u8 Display_Flag;
void SysTick_Handler(void)
{
		static u8 key_sum = 0;
		static u8 adc_sum = 0;
		static u8 display_sum = 0;
		TimingDelay--;
		if(++key_sum == 50) // 50ms
		{
				key_sum = 0;
				KEY_Flag = 1;
		}
		if(++adc_sum == 250)
		{
				adc_sum = 0;
				ADC_Flag = 1;
		}
		if(++display_sum == 200)
		{
				display_sum = 0;
				Display_Flag = 1;
		}
}

//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void TIM1_PWM_Init(u16 fre,u8 duty,u8 status,u8 enable);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif

//IO.C//
#include "IO.h"
u16 LED_MODE = 0XFFFF;
extern u8 PWM_Enable;
extern u16 PWM_Frequency;
u8 Set_Flag = 0;
extern float P;
/   24c02   ///
void _24c02_Write(u8 address,u8 data)
{
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
		I2CSendByte(data);
		I2CWaitAck();
		I2CStop();
}

u8 _24c02_Read(u8 address)
{
		u8 data;
		I2CStart();
		I2CSendByte(0xa0);
		I2CWaitAck();
		I2CSendByte(address);
		I2CWaitAck();
	
		I2CStart();
		I2CSendByte(0xa1);
		I2CWaitAck();
		data = I2CReceiveByte();
		I2CWaitAck();
		I2CStop();
		return data;
}
/   ADC   ///
void ADC1_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		ADC_InitTypeDef ADC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
		ADC_InitStructure.ADC_NbrOfChannel = 1;
		ADC_Init( ADC1, &ADC_InitStructure);
	
		ADC_Cmd(ADC1, ENABLE);
	
		ADC_ResetCalibration(ADC1);
		while(ADC_GetResetCalibrationStatus( ADC1));
		
		ADC_StartCalibration(ADC1);
		while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_Adc(void)
{
		u16 temp;
		ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
		ADC_SoftwareStartConvCmd(ADC1,ENABLE);
		temp = ADC_GetConversionValue(ADC1);
		ADC_SoftwareStartConvCmd(ADC1,DISABLE);
		return temp;
}
   TIM1_PWM   
void TIM1_PWM_Init(u16 fre,u8 duty,u8 status,u8 enable)
{
		u16 frequency;
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
		TIM_OCInitTypeDef TIM_OCInitStructure;
		if(status)
		{
				RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
				RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
			
				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
				GPIO_Init(GPIOA, &GPIO_InitStructure);
				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
				GPIO_Init(GPIOB, &GPIO_InitStructure);
		}
		frequency = 1000000 / fre;
		TIM_TimeBaseInitStructure.TIM_Period = frequency - 1;
		TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
		TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
		TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
		
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
		if(enable)
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
				TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
		}else
		{
				TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
				TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
		}
		TIM_OCInitStructure.TIM_Pulse = (frequency - 1) * duty / 100;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
		TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
		TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
		TIM_OC2Init(TIM1,&TIM_OCInitStructure);
		
		TIM_CtrlPWMOutputs(TIM1, ENABLE);
		
		TIM_Cmd(TIM1, ENABLE);
}

///   LED   ///
void LED_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOD, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = 0XFF00;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOC, &GPIO_InitStructure);
	
		GPIOC->ODR = 0XFFFF;
		GPIOD->ODR |= (1<<2);
		GPIOD->ODR &=~(1<<2);
}

///  KEY  //
void KEY_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
		static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
		//KEY1
		if(KEY1 == 0)
		{
				key1_sum++;
				if(key1_sum == 1)
				{
						PWM_Enable ^= 1;
						TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
				}
		}else
		{
				key1_sum = 0;
		}
		
		//KEY2
		if(KEY2 == 0)
		{
				key2_sum++;
				if(key2_sum == 1)
				{
						Set_Flag ^= 1;
						LCD_ClearLine(Line0);
						LCD_ClearLine(Line1);
						LCD_ClearLine(Line2);
						LCD_ClearLine(Line3);
						LCD_ClearLine(Line4);
						LCD_ClearLine(Line5);
						LCD_ClearLine(Line6);
						LCD_ClearLine(Line7);
						LCD_ClearLine(Line8);
						LCD_ClearLine(Line9);
						if(!Set_Flag)
						{
								_24c02_Write(0xaa,PWM_Frequency / 1000);
						}
				}
		}else
		{
				key2_sum = 0;
		}
		
		//KEY3
		if((KEY3 == 0) && Set_Flag)
		{
				key3_sum++;
				if(key3_sum == 1)
				{
						PWM_Frequency += 1000;
						if(PWM_Frequency > 10000) PWM_Frequency = 10000;
						TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
				}
		}else
		{
				key3_sum = 0;
		}
		
		//KEY4
		if((KEY4 == 0) && Set_Flag)
		{
				key4_sum++;
				if(key4_sum == 1)
				{
						PWM_Frequency -= 1000;
						if(PWM_Frequency < 1000) PWM_Frequency = 1000;
						TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
				}
		}else
		{
				key4_sum = 0;
		}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值