相比于之前,本次设置模式函数的编写降低了程序耦合度,将数据的增加,减小和保存都写成一个独立的函数来调用。
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
}
使用ADC时需注意,每次GetValue之前都要调用一次Start函数。
double ADC_GetValue()
{
double count;
HAL_ADC_Start(&hadc2);
count=HAL_ADC_GetValue(&hadc2);
return count*3.3/4096;
}
函数中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);
}
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);
}
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 */
}
以上就是全部内容,如有错误请批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。