2201_75314879 2024-08-23 21:09 采纳率: 0%
浏览 5
已结题

蓝桥杯stm322016年省赛试题中遇到的问题


#include "main.h"
#include "bsp\bsp_led_key.h"
#include "bsp\bsp_rcc.h"
#include "bsp\bsp_lcd.h"
#include "stdio.h"
#include "bsp\bsp_adc.h"
#include "bsp\bsp_i2c.h"
//延迟
__IO uint32_t uwtick_key_point = 0;
__IO uint32_t uwtick_led_point = 0;
__IO uint32_t uwtick_lcd_point = 0;
//led
uint8_t ucled = 0;
//key
uint8_t key_value = 0;
uint8_t key_down = 0;
uint8_t key_old = 0;
uint8_t key_up = 0;
//lcd
uint8_t lcd_disp_string[20];
//user
uint8_t disp_state = 0x00;
unsigned char threshold_ctrl[3] = {30,50,70};
unsigned char threshold_set[3] = {30,50,70};
uint8_t usercmdate = 0;
float uservdata = 0;
uint8_t nmsl = 0;

void SystemClock_Config(void);
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    LED_KEY_Init();
    LCD_Init();
    LCD_Clear(White);
    LCD_SetBackColor(White);
    LCD_SetTextColor(Blue);
    ADC2_Init();
    I2CInit();
    eeprom_read(threshold_ctrl,0,3);
    threshold_set[0] = threshold_ctrl[0];
    threshold_set[1] = threshold_ctrl[1];
    threshold_set[2] = threshold_ctrl[2];
  while (1)
  {
    Key_Proc();
    Led_Proc();
    Lcd_Proc();
    
  }

}
void Lcd_Proc(void)
{
    if((uwTick - uwtick_lcd_point)< 100)
        return;
    uwtick_lcd_point = uwTick;
    if(disp_state == 0x00)
    {sprintf((char*)lcd_disp_string,"   Liquid  Level");
        LCD_SetTextColor(Blue);
    LCD_DisplayStringLine(Line2,lcd_disp_string);
        uservdata = (getADC2()/4096.0*3.3);
        usercmdate =(uint8_t)(uservdata*(100.0/3.3));
    sprintf((char*)lcd_disp_string,"  Height:%2d",usercmdate);
    LCD_DisplayStringLine(Line3,lcd_disp_string);
    sprintf((char*)lcd_disp_string,"  ADC:%4.2f",uservdata);
    LCD_DisplayStringLine(Line4,lcd_disp_string);
        if(usercmdate<=threshold_set[0])
    sprintf((char*)lcd_disp_string,"  Level:0");
        else if((usercmdate>threshold_ctrl[0])&&(usercmdate<=threshold_ctrl[1]))
            sprintf((char*)lcd_disp_string,"  Level:1");
        else if((usercmdate>threshold_ctrl[1])&&(usercmdate<=threshold_ctrl[2]))
            sprintf((char*)lcd_disp_string,"  Level:2");
        else if(usercmdate>threshold_ctrl[2])
            sprintf((char*)lcd_disp_string,"  Level:3");
    LCD_DisplayStringLine(Line5,lcd_disp_string);}
    else if((disp_state>>4) == 0x01)
    {
    sprintf((char*)lcd_disp_string,"   Parameter Setup");
            LCD_SetTextColor(Blue);
    LCD_DisplayStringLine(Line2,lcd_disp_string);
    sprintf((char*)lcd_disp_string,"   Threshold1:%2d",(unsigned int)threshold_set[0]);
        if(disp_state == 0x10)
            LCD_SetTextColor(Green);
        else
            LCD_SetTextColor(Blue);
    LCD_DisplayStringLine(Line4,lcd_disp_string);
    sprintf((char*)lcd_disp_string,"   Threshold2:%2d",(unsigned int)threshold_set[1]);
        if(disp_state == 0x11)
            LCD_SetTextColor(Green);
        else
            LCD_SetTextColor(Blue);
    LCD_DisplayStringLine(Line5,lcd_disp_string);
    sprintf((char*)lcd_disp_string,"   Threshold3:%2d",(unsigned int)threshold_set[2]);
        if(disp_state == 0x12)
            LCD_SetTextColor(Green);
        else
            LCD_SetTextColor(Blue);
    LCD_DisplayStringLine(Line6,lcd_disp_string);
    }

}

void Key_Proc(void)
{
    if((uwTick - uwtick_key_point)< 100)
        return;
    uwtick_key_point = uwTick;    
    key_value = key_scan();
    key_down = key_value&(key_value^key_old);
    key_up = ~key_value&(key_value^key_old);
    key_old = key_value;
    
    
    if(key_down == 1)
    {if(disp_state == 0x00)
        {LCD_Clear(White);
    disp_state = 0x10;}
    else if((disp_state >> 4) == 0x01)
    {
    LCD_Clear(White);
        threshold_ctrl[0] = threshold_set[0];
        threshold_ctrl[1] = threshold_set[1];
        threshold_ctrl[2] = threshold_set[2];
        eeprom_write(threshold_ctrl,0,3);
    disp_state = 0x00;}
    }
    if(key_down == 2)
    {
    if((disp_state >> 4) == 0x01)
    {
        
    if(++disp_state == 0x13)
    {
    disp_state = 0x10;    
    }
    if(disp_state == 0x12)
    {
    nmsl = 1;
    }
    else if((disp_state == 0x10)||(disp_state == 0x11))
        nmsl = 0;
}}
    if(key_down == 3)
    {
        switch(disp_state)
        {
            case 0x10:
            {if(threshold_set[0] < 95)
    threshold_set[0] += 5;
        break;    }
        
            case 0x11:
            {if(threshold_set[1] < 95)
    threshold_set[1] += 5;
            break;}

        case 0x12:
            {if(threshold_set[2] < 95)
    threshold_set[2] += 5;
            break;}
        default:
            break;
        }
    }
    if(key_down == 4)
    {
    
    switch(disp_state)
        {
            case 0x10:
            {if(threshold_set[0] > 5)
    threshold_set[0] -= 5;
            break;}

            case 0x11:
            {if(threshold_set[1] > 5)
    threshold_set[1] -= 5;
            break;}
//            case 0x12:
//            {threshold_set[2]-= 5;
//                if(threshold_set[2] == 0)
//                    threshold_set[2] = 5;
            //            break;}莫名其妙的一加上括号里的东西就会切换不了界面只能再加一个标志位了
default:
            break;
        }
        if(nmsl == 1)
            {threshold_set[2]-= 5;
                if(threshold_set[2] == 0)
                    threshold_set[2] = 5;}

    }

}

蓝桥杯2016年省赛的题目,还没写完,遇到了一个奇怪的问题,只要把取消注释就会导致界面切换不了,一直在第一个界面正常显示,我试了好久,只要有0x12和这段代码就会出这个问题,给我搞得很恼火。找不到和界面切换的标志位有什么联系,我想知道为什么会这样。

  • 写回答

7条回答 默认 最新

  • 阿齐Archie 嵌入式领域优质创作者 2024-08-23 21:26
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    您遇到的问题可能由几个原因引起。首先,我们需要确保代码逻辑是正确的,并且没有错误地修改了标志位或状态变量。让我们逐步检查代码并找出问题。

    1. 确保key_downkey_up变量正确更新: 您的Key_Proc函数中,key_downkey_up的逻辑看起来是正确的。确保key_scan()函数返回的值是正确的,并且按键事件被正确检测。

    2. 检查key_value是否正确: 如果key_value的值没有正确更新,那么key_downkey_up的逻辑可能不会按预期工作。确保按键扫描逻辑没有问题。

    3. 检查disp_state的更新逻辑: 在Key_Proc函数中,disp_state的更新逻辑似乎依赖于key_down。如果key_down的值为4时,disp_state的更新逻辑可能有问题。特别是在case 0x12:的注释中,您提到如果取消注释会导致问题,这表明可能在更新disp_state时有逻辑错误。

    4. 检查eeprom_write函数: 当您保存阈值到EEPROM时,如果eeprom_write函数没有正确执行,可能会导致程序逻辑混乱或状态不一致。

    5. 检查LCD_Clear函数: 当您切换显示状态时,调用LCD_Clear(White);可能会影响显示。确保这个函数调用不会影响其他显示逻辑。

    6. 检查nmsl变量: 您在代码中提到nmsl变量,但没有看到它的初始化和使用。如果nmsl变量的值在程序中被错误地修改,可能会影响disp_state的逻辑。

    7. 检查注释掉的代码: 如果取消注释会导致问题,可能是因为那部分代码影响了disp_state或其他相关变量的状态。检查那部分代码的逻辑,确保它不会与现有的状态管理逻辑冲突。

    8. 使用调试工具: 如果可能的话,使用调试工具逐步执行代码,观察disp_state和其他相关变量的值。这有助于找到问题的根源。

    9. 代码审查: 仔细检查代码,特别是涉及到状态切换和按键处理的部分。查找可能导致逻辑冲突或状态不一致的地方。

    10. 简化问题: 尝试简化代码,逐步添加功能,每次添加后都进行测试,以确定是哪部分代码导致了问题。

    通过以上步骤,您应该能够逐步缩小问题的范围,并找到导致界面切换失败的原因。如果需要更具体的帮助,请提供更多的上下文信息或详细描述问题出现的条件。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月24日
  • 创建了问题 8月23日

悬赏问题

  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并