#include "led.h" #include "delay.h" #include "sys.h" #include "stm32f10x.h" #include "stdio.h" #include "key.h" #include "usart.h" #include "drive_dht11.h" #include "bh1750.h" #include "drive_lcd1602.h" #define KEY_GPIO_PROT GPIOA #define KEY1_GPIO_PIN GPIO_Pin_0 #define KEY2_GPIO_PIN GPIO_Pin_1 #define KEY3_GPIO_PIN GPIO_Pin_2 //#define KEY4_GPIO_PIN GPIO_Pin_3 //#define KEY5_GPIO_PIN GPIO_Pin_4 #define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN) #define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN) #define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN) //#define KEY4_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY4_GPIO_PIN) //#define KEY5_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY5_GPIO_PIN) void key_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } u8 humi=0;//湿度值 u8 temp=0;//温度值 u8 buffer[10]={0}; u16 GzVal=0; //实际光照值 char ShowBuf[16]={0}; u8 set_flag=0; u8 set_temp=0;//设置值 u8 set_humi=0; u16 set_gz=0; int key_Task(void) { static char key_flag=0; if(KEY1_IN==0|KEY2_IN==0|KEY3_IN==0) { if(key_flag==0) { key_flag=1; if(KEY1_IN==0) { if(++set_flag>3)set_flag=0; } else if(KEY2_IN==0) { switch(set_flag) { case 1: if(++set_temp>50)set_temp=0; break; case 2: if(++set_humi>95)set_humi=0; break; case 3: set_gz+=10; if(set_gz>5000)set_gz=0; break; } } else if(KEY3_IN==0) { switch(set_flag) { case 1: if(--set_temp==0)set_temp=50; break; case 2: if(--set_humi==0)set_humi=95; break; case 3: if(set_gz>10)set_gz-=10; break; } } } }else { key_flag=0; } return 20; } void TIMER3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitStrue.TIM_Period=arr; TIM_TimeBaseInitStrue.TIM_Prescaler=psc; TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CounterMode_Up; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } u16 GetTimer=0;//采集时间计数器 void TIM3_IRQHandler(void)//中断服务程序 { if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//SET为1 { GetTimer++;//采集计数器 TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的更新中断标志 key_Task();//扫描按键 } } u8 GetFlag=0; uint8_t RecBuff[16]={0}; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 delay_init(); //延时函数初始化 LED_Init(); //初始化与连接的硬件接口 uart_init(115200); delay_ms(1000); TIMER3_Int_Init(10000,71);//定时器初始化 //10ms进一次中断 key_gpio_init(); Init_Lcd1602(); while(1) { if(GetTimer>50)//500ms显示一次 { GetTimer=0;//清零 if(set_flag==0) { L1602_printf(0,0,"T:%2d H:%2d L:%4d",temp,humi,GzVal);//打印显示实际数据 L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据 if(temp>set_temp||humi>set_humi||GzVal>set_gz) { BUZZ_LED0^=1;//报警嘀嘀嘀 }else { BUZZ_LED0=0; } }else { L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据 } } } }