devbox
繁依Fanyi0
这个屌丝很懒,什么也没留下!
热门文章
  • 1Elon Musk学习方法研究_elon musk and stanford
  • 2Spring Cloud 学习笔记:Eureka 服务注册与发现_ //KEY1 界面切换 if(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET) { HAL_Delay(10); if(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET) { while(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET); page=2;//LCD页改变 LCD_fresh();//LCD更新 Setting_Mode();//进入设置模式 led_change=1;//LED更新标志,使新用新设定的LED } } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.设置模式

    相比于之前,本次设置模式函数的编写降低了程序耦合度,将数据的增加,减小和保存都写成一个独立的函数来调用。

    void Setting_Mode()//设置模式
    {
    	uint8_t i;
    	line_now=line_old;//当前行更新
    	uint8_t lcd_change=0;//LCD更新标志位
    	Color_change();//当前行颜色翻转,上一行颜色恢复
    	while(1)
    	{
    		if(lcd_change)
    		{
    			lcd_change=0;
    			Color_change();//当前行颜色翻转,上一行颜色恢复
    		}
    		//KEY1 界面切换
    		if(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET)
    		{
    			HAL_Delay(10);
    			if(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET)
    			{
    				while(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==GPIO_PIN_RESET);
    				Data_save();//将数据存储至EEPROM
    				for(i=1;i<9;i++)//LED关闭数组重置
    				{
    					led_close[i]=1;
    				}
    				led_close[led_up]=0;//将新设定的Upper LED对应下标改为0
    				led_close[led_low]=0;//将新设定的Lower LED对应下标改为0
    				page=1;//LCD显示页改变
    				LCD_fresh();//LCD更新
    				break;//退出循环
    			}
    		}
    		
    		//KEY2 选择按键
    		else if(HAL_GPIO_ReadPin(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==GPIO_PIN_RESET)
    		{
    			HAL_Delay(10);
    			if(HAL_GPIO_ReadPin(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==GPIO_PIN_RESET)
    			{
    				while(HAL_GPIO_ReadPin(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==GPIO_PIN_RESET);	
    				line_now+=line_setp;//行增加
    				if(line_now>line_end)//如果当前行大于末尾行则回到初始行
    					line_now=line_old;
    				lcd_change=1;//LCD改变标志位置1
    			}
    		}
    		
    		//KEY3 ++
    		else if(HAL_GPIO_ReadPin(KEY3_GPIO_PORT,KEY3_GPIO_PIN)==GPIO_PIN_RESET)
    		{
    			HAL_Delay(10);
    			if(HAL_GPIO_ReadPin(KEY3_GPIO_PORT,KEY3_GPIO_PIN)==GPIO_PIN_RESET)
    			{
    				while(HAL_GPIO_ReadPin(KEY3_GPIO_PORT,KEY3_GPIO_PIN)==GPIO_PIN_RESET);
    				Data_change(add);//当前数据以增模式改变
    				lcd_change=1;//LCD改变标志位置1
    			}
    		}
    		
    		//KEY4 --
    		else if(HAL_GPIO_ReadPin(KEY4_GPIO_PORT,KEY4_GPIO_PIN)==GPIO_PIN_RESET)
    		{
    			HAL_Delay(10);
    			if(HAL_GPIO_ReadPin(KEY4_GPIO_PORT,KEY4_GPIO_PIN)==GPIO_PIN_RESET)
    			{
    				while(HAL_GPIO_ReadPin(KEY4_GPIO_PORT,KEY4_GPIO_PIN)==GPIO_PIN_RESET);
    				Data_change(sub);//当前行数据以减模式改变
    				lcd_change=1;//LCD改变标志位置1
    			}
    		}
    	v_now=ADC_GetValue();//获取R37的电压值
    	LED_refresh();//LED动态更新
    	}//while
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    3.获取R37电压值

    使用ADC时需注意,每次GetValue之前都要调用一次Start函数。

    double ADC_GetValue()
    {
    	double	count;
    	HAL_ADC_Start(&hadc2);
    	count=HAL_ADC_GetValue(&hadc2);
    	return count*3.3/4096;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.选中行高亮

    函数中str保存当前行显示字符串,str2保存上一行显示字符串,首行数据的上一行是末尾行。

    void Color_change()
    {
    	char str2[30];
    	if(line_now==line_old+line_setp*0)
    	{
    		sprintf(str,"   Max Volt:%.2fV       ",v_max);
    		sprintf(str2,"   Lower:LD%d           ",led_low);
    	}
    	else if(line_now==line_old+line_setp*1)
    	{
    		sprintf(str,"   Min Volt:%.2fV       ",v_min);
    		sprintf(str2,"   Max Volt:%.2fV       ",v_max);
    	}
    	else if(line_now==line_old+line_setp*2)
    	{
    		sprintf(str,"   Upper:LD%d       ",led_up);
    		sprintf(str2,"   Min Volt:%.2fV       ",v_min);
    	}
    	else if(line_now==line_old+line_setp*3)
    	{
    		sprintf(str,"   Lower:LD%d           ",led_low);
    		sprintf(str2,"   Upper:LD%d       ",led_up);
    	}
    	
    	LCD_SetTextColor(Blue);//上一行颜色恢复
    	LCD_SetBackColor(White);
    	if(line_now==line_old)
    		LCD_DisplayStringLine(line_end,(unsigned char*)str2);
    	else
    		LCD_DisplayStringLine(line_now-line_setp,(unsigned char*)str2);
    	
    	LCD_SetTextColor(White);//当前颜色翻转
    	LCD_SetBackColor(Blue);
    	LCD_DisplayStringLine(line_now,(unsigned char*)str);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    5.LED灯关闭

    LED关闭数组中,若值为1,则下标对应LED灯关闭。

    void LED_AllClose()//LED关闭数组中,若值为1,则下标对应LED灯关闭
    {
    	uint8_t i;
    	for(i=1;i<9;i++)
    	{
    		if(led_close[i]==1)
    		{
    			switch(i)
    			{
    				case 1:
    					LED1(OFF);
    					break;
    				
    				case 2:
    					LED2(OFF);
    					break;
    				
    				case 3:
    					LED3(OFF);
    					break;
    				
    				case 4:
    					LED4(OFF);
    					break;
    				
    				case 5:
    					LED5(OFF);
    					break;
    				
    				case 6:
    					LED6(OFF);
    					break;
    				
    				case 7:
    					LED7(OFF);
    					break;
    				
    				case 8:
    					LED8(OFF);
    					break;
    			}
    		}
    	}
    	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    6.Main函数

    int main(void)
    {
    	uint8_t i;
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_ADC2_Init();
      I2CInit();
      MX_TIM6_Init();
      /* USER CODE BEGIN 2 */
    	LCD_Init();
    	HAL_ADC_Start(&hadc2);//开启ADC2
    	LCD_Init_Show();//LCD开机界面显示
    	TIM6->SR=0;//中断标志位置0
    	Data_read();//从EEPROM中读取数据
    	
    	for(i=1;i<9;i++)//初始化LED关闭数组
    	{
    		led_close[i]=1;
    	}
    	led_close[led_up]=0;//开启Upper LED
    	led_close[led_low]=0;//开启Lower LED
    	LED_AllClose();//其余灯全部关闭
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
        /* USER CODE BEGIN 3 */
    		KEY_Scan();//按键扫描
    		v_now=ADC_GetValue();//获取ADC的值
    		if(led_statue==2 ||led_statue==0)//LED状态为闪烁(Upper/Lower)
    		{
    			if(lcd_fresh_num>1)//每0.4s刷新一次LCD
    			{
    				lcd_fresh_num=0;
    				LCD_fresh();
    			}
    		}
    		else//LED为常亮
    		{
    			LCD_fresh();
    		}
    		LED_refresh();//LED更新
      }
      /* USER CODE END 3 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    四、实验结果


    Max==Min bug已修复

    五、源码(转载请注明出处)

    在这里插入图片描述


    总结

    以上就是全部内容,如有错误请批评指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/419536?site
推荐阅读
相关标签
  

闽ICP备14008679号