鱼C论坛

 找回密码
 立即注册
查看: 165|回复: 3

[已解决]stm32 退出循环求助

[复制链接]
发表于 2024-7-23 11:00:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
while(1)
                {
                LCD_SetFont(&Font24x32);
                       
                LCD_SetColors(CL_WHITE,CL_WHITE);
                ILI9341_DrawRectangle(0,67,96,32,1);

                delay_ms(1000);
                LCD_SetColors(CL_RED,CL_WHITE);
                sprintf((char *)str,"%d",tm.tm_year);
                ILI9341_DispString_EN_CH( 0,67,(char*)str);       

                if(XPT2046_PENIRQ_Read() == XPT2046_PENIRQ_ActiveLevel)
                        {
                                break;
                        }
                delay_ms(1000);
        }

这个代码是让一串数字在LCD屏幕上显示并不断闪烁,然后通过检测是否触摸屏幕来退出循环,但是需要触摸一秒左右才能退出,不灵敏,求助有没有更好的方法来设置数字显示不断闪烁并通过触摸屏幕来退出循环。
最佳答案
2024-7-23 11:07:04
yyyyy. 发表于 2024-07-23 11:05
如何灵敏的同时让显示的数字闪烁


好的,我们来让数字不仅闪烁,同时也能灵敏地响应触摸事件。为了实现这个需求,我们可以在每个循环中动态地更新显示内容,并在一定的时间间隔内切换显示状态。

下面是一个改进的示例代码,其中我们使用一个变量来控制数字的显示与隐藏,从而实现闪烁效果:
#include <stdbool.h>

bool showNumber = true;  // 控制数字显示的布尔变量

while (1)
{
    LCD_SetFont(&Font24x32);
    
    // 清除之前的矩形区域
    LCD_SetColors(CL_WHITE, CL_WHITE);
    ILI9341_DrawRectangle(0, 67, 96, 32, 1);
    
    // 每200毫秒切换一次数字的显示状态
    if (showNumber)
    {
        LCD_SetColors(CL_RED, CL_WHITE);
        sprintf((char *)str, "%d", tm.tm_year);
        ILI9341_DispString_EN_CH(0, 67, (char *)str);
    }
    else
    {
        LCD_SetColors(CL_WHITE, CL_WHITE);
        ILI9341_DispString_EN_CH(0, 67, "    ");  // 清空显示
    }
    
    // 检查触摸屏幕是否被按下
    if (XPT2046_PENIRQ_Read() == XPT2046_PENIRQ_ActiveLevel)
    {
        break;  // 如果有触摸事件,退出循环
    }

    // 切换数字显示状态
    showNumber = !showNumber;

    // 使用更短的延迟,例如 200 毫秒
    delay_ms(200);
}

### 代码解析:
1. **控制变量 `showNumber`**:这是一个布尔值,用于决定当前是否显示数字。
2. **闪烁逻辑**:在每次循环中,我们检查 `showNumber`。如果为 `true`,就显示年份;如果为 `false`,则清空显示区域,实现闪烁效果。
3. **触摸检查**:在绘制数字前检查触摸事件,如果触摸到了屏幕,就立即退出循环。
4. **延迟与状态切换**:使用 `delay_ms(200)` 控制循环频率,并每次循环结束时反转 `showNumber` 的值,使得数字每 200 毫秒闪烁一次。

这样,你的数字应该能够闪烁着,同时还能灵敏地响应触摸。这就像是让你的 LCD 屏幕举办一场“闪光派对”,又能随时接待“宾客”!希望这能帮助到你,如果还有其他问题或者想法,随时向我提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-23 11:01:54 | 显示全部楼层
哈哈,你的代码看起来像是在跟 LCD 屏幕打“闪烁”游戏呢!但是如果你希望能够更灵敏地检测触摸事件并退出循环,我们可以来做一些优化。

首先,你现在是在每次循环中等待 1 秒,这样就算是有触摸输入,程序也需要等到这段延迟结束才能处理。我们可以让循环变得更灵活一些,使用一个更短的延迟,这样在每次循环之间就能更快地检查触摸状态。

这里有个简单的改进:
while(1)
{
    LCD_SetFont(&Font24x32);
    
    // 清除之前的矩形区域
    LCD_SetColors(CL_WHITE, CL_WHITE);
    ILI9341_DrawRectangle(0, 67, 96, 32, 1);

    // 显示当前年份
    sprintf((char *)str, "%d", tm.tm_year);
    LCD_SetColors(CL_RED, CL_WHITE);
    ILI9341_DispString_EN_CH(0, 67, (char *)str);
    
    // 检查触摸屏幕是否被按下
    if(XPT2046_PENIRQ_Read() == XPT2046_PENIRQ_ActiveLevel)
    {
        break;  // 如果有触摸事件,退出循环
    }

    // 使用更短的延迟,例如 200 毫秒
    delay_ms(200);
}

这样做后,程序每 200 毫秒就会检查一次触摸情况。这意味着,你只需要触摸屏幕大约 200 毫秒(而不是 1000 毫秒)就能成功退出循环。现在应该更灵敏了吧?

当然,如果你觉得 200 毫秒仍然不够快,甚至可以把它设得更短,但要小心不要让 CPU 占用率飙升哦。如果你的设备支持中断,使用中断也是一个很好的选择,那样只需要在触摸发生时才处理,而不是不断轮询。

加油,继续享受编程的乐趣!如果你还需要更多帮助,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-23 11:05:49 | 显示全部楼层
FishC 发表于 2024-7-23 11:01
哈哈,你的代码看起来像是在跟 LCD 屏幕打“闪烁”游戏呢!但是如果你希望能够更灵敏地检测触摸事件并退出 ...

如何灵敏的同时让显示的数字闪烁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-23 11:07:04 | 显示全部楼层    本楼为最佳答案   
yyyyy. 发表于 2024-07-23 11:05
如何灵敏的同时让显示的数字闪烁


好的,我们来让数字不仅闪烁,同时也能灵敏地响应触摸事件。为了实现这个需求,我们可以在每个循环中动态地更新显示内容,并在一定的时间间隔内切换显示状态。

下面是一个改进的示例代码,其中我们使用一个变量来控制数字的显示与隐藏,从而实现闪烁效果:
#include <stdbool.h>

bool showNumber = true;  // 控制数字显示的布尔变量

while (1)
{
    LCD_SetFont(&Font24x32);
    
    // 清除之前的矩形区域
    LCD_SetColors(CL_WHITE, CL_WHITE);
    ILI9341_DrawRectangle(0, 67, 96, 32, 1);
    
    // 每200毫秒切换一次数字的显示状态
    if (showNumber)
    {
        LCD_SetColors(CL_RED, CL_WHITE);
        sprintf((char *)str, "%d", tm.tm_year);
        ILI9341_DispString_EN_CH(0, 67, (char *)str);
    }
    else
    {
        LCD_SetColors(CL_WHITE, CL_WHITE);
        ILI9341_DispString_EN_CH(0, 67, "    ");  // 清空显示
    }
    
    // 检查触摸屏幕是否被按下
    if (XPT2046_PENIRQ_Read() == XPT2046_PENIRQ_ActiveLevel)
    {
        break;  // 如果有触摸事件,退出循环
    }

    // 切换数字显示状态
    showNumber = !showNumber;

    // 使用更短的延迟,例如 200 毫秒
    delay_ms(200);
}

### 代码解析:
1. **控制变量 `showNumber`**:这是一个布尔值,用于决定当前是否显示数字。
2. **闪烁逻辑**:在每次循环中,我们检查 `showNumber`。如果为 `true`,就显示年份;如果为 `false`,则清空显示区域,实现闪烁效果。
3. **触摸检查**:在绘制数字前检查触摸事件,如果触摸到了屏幕,就立即退出循环。
4. **延迟与状态切换**:使用 `delay_ms(200)` 控制循环频率,并每次循环结束时反转 `showNumber` 的值,使得数字每 200 毫秒闪烁一次。

这样,你的数字应该能够闪烁着,同时还能灵敏地响应触摸。这就像是让你的 LCD 屏幕举办一场“闪光派对”,又能随时接待“宾客”!希望这能帮助到你,如果还有其他问题或者想法,随时向我提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 14:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表