久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 182|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

按鍵翻頁程序無法實(shí)現(xiàn)翻頁功能

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1155631 發(fā)表于 2025-7-16 11:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
為什么我的按鍵翻頁的程序他好像卡死了,翻不了頁?

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Key_TurnPage.h"
#include "OLED.h"
#include <stdio.h>

uint32_t HAL_Init(void);                //定義用于接收按鍵鍵碼的變量

// 系統(tǒng)初始化
void System_Init(void) {
    OLED_Init();    // 初始化OLED
    Key_Init();     // 初始化按鍵
    OLED_Clear();   // 清屏
}

const char* pageContent[] = {
                        "Page 1: Main",
                        "Page 2: Temp",
                        "Page 3: Humi"                                                                               
};

// 顯示當(dāng)前頁
void ShowCurrentPage(void) {
        OLED_Clear();
        OLED_ShowString(0, 0, (char*)pageContent[currentPage]);       
    OLED_ShowString(0, 0, (char*)pageContent[currentPage]);
    // 添加頁碼顯示(例如:1/10)
    char pageStr[16];
    sprintf(pageStr, "Page:%d/%d", currentPage+1, totalPages);
    OLED_ShowString(0, 2, pageStr);
}

//主程序
int main(void)
{
        /*模塊初始化*/
    System_Init();
    ShowCurrentPage();  // 顯示初始頁
       
        while (1)
        {
        PageAction action = Key_Scan();

        switch (action)
                        {
            case PAGE_UP:                                                                                // 執(zhí)行向上翻頁操作
                printf("Page Up: %d\n", currentPage);
                break;

            case PAGE_DOWN:                                                                                // 執(zhí)行向下翻頁操作
                printf("Page Down: %d\n", currentPage);
                break;

            case PAGE_NONE:                                                                                // 無按鍵動作
                break;
                        }

        // 其他任務(wù)...


        // 按鍵掃描(假設(shè)在按鍵驅(qū)動中實(shí)現(xiàn))
        Key_Scan();

        // 處理向上翻頁
        if (keyUpState == KEY_STATE_PRESSED) {
            keyUpState = KEY_STATE_RELEASED;  // 清除按鍵狀態(tài)
            if (currentPage > 0) {
                currentPage--;
                ShowCurrentPage();
            }
        }

        // 處理向下翻頁
        if (keyDownState == KEY_STATE_PRESSED) {
            keyDownState = KEY_STATE_RELEASED;  // 清除按鍵狀態(tài)
            if (currentPage < totalPages - 1) {
                currentPage++;
                ShowCurrentPage();
            }
        }

        // 處理按鍵連發(fā)(長按快速翻頁)
        if (keyUpState == KEY_STATE_REPEAT) {
            if (currentPage > 0) {
                currentPage--;
                ShowCurrentPage();
                Delay_ms(100);  // 連發(fā)速度控制
            }
        }

        if (keyDownState == KEY_STATE_REPEAT) {
            if (currentPage < totalPages - 1) {
                currentPage++;
                ShowCurrentPage();
                Delay_ms(100);  // 連發(fā)速度控制
            }
        }

        Delay_ms(10);  // 主循環(huán)延時(shí)
        }
}

#include "stm32f10x.h"


// 按鍵定義
#define KEY_UP_PIN     GPIO_Pin_4
#define KEY_UP_PORT    GPIOA
#define KEY_DOWN_PIN   GPIO_Pin_6
#define KEY_DOWN_PORT  GPIOA

// 按鍵狀態(tài)
typedef enum {
    KEY_STATE_RELEASED,                                                                                                        //按鍵釋放/未按下狀態(tài)
    KEY_STATE_PRESS_DETECTED,                                                                                        //檢測到按鍵按下(初始按下狀態(tài))
    KEY_STATE_PRESSED,                                                                                                        //按鍵持續(xù)按下狀態(tài)
    KEY_STATE_REPEAT                                                                                                        //按鍵保持觸發(fā)連發(fā)狀態(tài)
} KeyState;

// 翻頁控制
typedef enum {                                                                               
    PAGE_UP,                                                                                                                        //向上翻頁
    PAGE_DOWN,                                                                                                                        //向下翻頁
    PAGE_NONE                                                                                                                        //無翻頁動作
} PageAction;

// 全局變量
static KeyState keyUpState = KEY_STATE_RELEASED;                                                //向上按鍵的當(dāng)前狀態(tài)
static KeyState keyDownState = KEY_STATE_RELEASED;                                                //向下按鍵的當(dāng)前狀態(tài)
static uint32_t keyPressTimer = 0;                                                                                //按鍵按下計(jì)時(shí)器(用于長按檢測)
static uint8_t currentPage = 0;                                                                                        //當(dāng)前顯示頁面的索引(從0開始)
static uint8_t totalPages = 10;                                                                                 // 假設(shè)總共有10頁

// 按鍵初始化
void Key_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN | KEY_DOWN_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                 // 上拉輸入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

volatile uint32_t sysTickCount = 0;

uint32_t GetTick(void)
{
    return sysTickCount;                                                                                                  // 返回當(dāng)前滴答值
}

// 按鍵掃描函數(shù)(非阻塞式)
PageAction Key_Scan(void) {
    static uint32_t lastScanTime = 0;
    //uint32_t currentTime = HAL_GetTick();       
    uint32_t currentTime = GetTick();
       
    // 每10ms掃描一次按鍵
    if (currentTime - lastScanTime < 10) {
        return PAGE_NONE;
    }
    lastScanTime = currentTime;

    // 檢測KEY_UP
    if (GPIO_ReadInputDataBit(KEY_UP_PORT, KEY_UP_PIN) == Bit_RESET) {         // 按鍵按下
        switch (keyUpState) {
            case KEY_STATE_RELEASED:
                keyUpState = KEY_STATE_PRESS_DETECTED;
                keyPressTimer = currentTime;
                break;

            case KEY_STATE_PRESS_DETECTED:
                if (currentTime - keyPressTimer > 20) {                                 // 消抖
                    keyUpState = KEY_STATE_PRESSED;
                    currentPage = (currentPage == 0) ? totalPages - 1 : currentPage - 1;
                    return PAGE_UP;
                }
                break;

            case KEY_STATE_PRESSED:
                if (currentTime - keyPressTimer > 500) {                                 // 長按500ms后開始自動重復(fù)
                    keyUpState = KEY_STATE_REPEAT;
                    keyPressTimer = currentTime;
                }
                break;

            case KEY_STATE_REPEAT:
                if (currentTime - keyPressTimer > 100) {                                 // 每100ms重復(fù)一次
                    keyPressTimer = currentTime;
                    currentPage = (currentPage == 0) ? totalPages - 1 : currentPage - 1;
                    return PAGE_UP;
                }
                break;
        }
    } else {                                                                                                                         // 按鍵釋放
        keyUpState = KEY_STATE_RELEASED;
    }

    // 檢測KEY_DOWN
    if (GPIO_ReadInputDataBit(KEY_DOWN_PORT, KEY_DOWN_PIN) == Bit_RESET) {
        switch (keyDownState) {
            case KEY_STATE_RELEASED:
                keyDownState = KEY_STATE_PRESS_DETECTED;
                keyPressTimer = currentTime;
                break;

            case KEY_STATE_PRESS_DETECTED:
                if (currentTime - keyPressTimer > 20) {                                 // 消抖
                    keyDownState = KEY_STATE_PRESSED;
                    currentPage = (currentPage + 1) % totalPages;
                    return PAGE_DOWN;
                }
                break;

            case KEY_STATE_PRESSED:
                if (currentTime - keyPressTimer > 500) {                                 // 長按500ms后開始自動重復(fù)
                    keyDownState = KEY_STATE_REPEAT;
                    keyPressTimer = currentTime;
                }
                break;

            case KEY_STATE_REPEAT:
                if (currentTime - keyPressTimer > 100) {                                 // 每100ms重復(fù)一次
                    keyPressTimer = currentTime;
                    currentPage = (currentPage + 1) % totalPages;
                    return PAGE_DOWN;
                }
                break;
        }
    } else {
        keyDownState = KEY_STATE_RELEASED;
    }

    return PAGE_NONE;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:879809 發(fā)表于 2025-7-17 16:07 | 只看該作者
這需要你自己打斷點(diǎn)觀察死在哪里,別人又沒有你的板子。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1155631 發(fā)表于 2025-7-18 20:16 | 只看該作者
rundstedt 發(fā)表于 2025-7-17 16:07
這需要你自己打斷點(diǎn)觀察死在哪里,別人又沒有你的板子。

你好,請問你能說的再詳細(xì)一些嗎?我有點(diǎn)不能理解
回復(fù)

使用道具 舉報(bào)

地板
ID:1156607 發(fā)表于 2025-7-19 18:55 | 只看該作者
你的按鍵部分程序好像有問題,卡住了。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精 | 国产精品国产精品国产专区不卡 | 蜜桃综合网 | 看免费毛片 | www.一级片| 国产高清视频 | h片免费观看 | 四虎在线免费观看视频 | 天天干在线观看 | 天天曰天天操 | 中文字幕亚洲一区 | 欧美亚洲国产日韩 | 国产www在线观看 | 婷婷色在线 | 黑人精品xxx一区一二区 | 久久18| 国产天堂网 | 国产九九九 | 黄色a一级片 | 综合久久99| 欧美日韩精品一区 | 欧美日韩一区二 | aaa成人| 国产一区免费 | av在线天堂 | 99久热 | 精品国产精品 | 欧美性精品 | 黄色片视频网站 | 精品国产91乱码一区二区三区 | 亚洲最大av网站 | 亚洲免费观看 | 国产九九九| 日韩精品| 男女在线视频 | av手机在线免费观看 | 成年人在线观看 | 亚洲天堂视频在线观看 | 99久久久国产精品免费蜜臀 | 成人在线播放视频 | 国产网址 |