久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
按鍵翻頁程序無法實現翻頁功能
[打印本頁]
作者:
yyypp
時間:
2025-7-16 11:03
標題:
按鍵翻頁程序無法實現翻頁功能
為什么我的按鍵翻頁的程序他好像卡死了,翻不了頁?
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Key_TurnPage.h"
#include "OLED.h"
#include <stdio.h>
uint32_t HAL_Init(void); //定義用于接收按鍵鍵碼的變量
// 系統初始化
void System_Init(void) {
OLED_Init(); // 初始化OLED
Key_Init(); // 初始化按鍵
OLED_Clear(); // 清屏
}
const char* pageContent[] = {
"Page 1: Main",
"Page 2: Temp",
"Page 3: Humi"
};
// 顯示當前頁
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: // 執行向上翻頁操作
printf("Page Up: %d\n", currentPage);
break;
case PAGE_DOWN: // 執行向下翻頁操作
printf("Page Down: %d\n", currentPage);
break;
case PAGE_NONE: // 無按鍵動作
break;
}
// 其他任務...
// 按鍵掃描(假設在按鍵驅動中實現)
Key_Scan();
// 處理向上翻頁
if (keyUpState == KEY_STATE_PRESSED) {
keyUpState = KEY_STATE_RELEASED; // 清除按鍵狀態
if (currentPage > 0) {
currentPage--;
ShowCurrentPage();
}
}
// 處理向下翻頁
if (keyDownState == KEY_STATE_PRESSED) {
keyDownState = KEY_STATE_RELEASED; // 清除按鍵狀態
if (currentPage < totalPages - 1) {
currentPage++;
ShowCurrentPage();
}
}
// 處理按鍵連發(長按快速翻頁)
if (keyUpState == KEY_STATE_REPEAT) {
if (currentPage > 0) {
currentPage--;
ShowCurrentPage();
Delay_ms(100); // 連發速度控制
}
}
if (keyDownState == KEY_STATE_REPEAT) {
if (currentPage < totalPages - 1) {
currentPage++;
ShowCurrentPage();
Delay_ms(100); // 連發速度控制
}
}
Delay_ms(10); // 主循環延時
}
}
#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
// 按鍵狀態
typedef enum {
KEY_STATE_RELEASED, //按鍵釋放/未按下狀態
KEY_STATE_PRESS_DETECTED, //檢測到按鍵按下(初始按下狀態)
KEY_STATE_PRESSED, //按鍵持續按下狀態
KEY_STATE_REPEAT //按鍵保持觸發連發狀態
} KeyState;
// 翻頁控制
typedef enum {
PAGE_UP, //向上翻頁
PAGE_DOWN, //向下翻頁
PAGE_NONE //無翻頁動作
} PageAction;
// 全局變量
static KeyState keyUpState = KEY_STATE_RELEASED; //向上按鍵的當前狀態
static KeyState keyDownState = KEY_STATE_RELEASED; //向下按鍵的當前狀態
static uint32_t keyPressTimer = 0; //按鍵按下計時器(用于長按檢測)
static uint8_t currentPage = 0; //當前顯示頁面的索引(從0開始)
static uint8_t totalPages = 10; // 假設總共有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; // 返回當前滴答值
}
// 按鍵掃描函數(非阻塞式)
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后開始自動重復
keyUpState = KEY_STATE_REPEAT;
keyPressTimer = currentTime;
}
break;
case KEY_STATE_REPEAT:
if (currentTime - keyPressTimer > 100) { // 每100ms重復一次
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后開始自動重復
keyDownState = KEY_STATE_REPEAT;
keyPressTimer = currentTime;
}
break;
case KEY_STATE_REPEAT:
if (currentTime - keyPressTimer > 100) { // 每100ms重復一次
keyPressTimer = currentTime;
currentPage = (currentPage + 1) % totalPages;
return PAGE_DOWN;
}
break;
}
} else {
keyDownState = KEY_STATE_RELEASED;
}
return PAGE_NONE;
}
作者:
rundstedt
時間:
2025-7-17 16:07
這需要你自己打斷點觀察死在哪里,別人又沒有你的板子。
作者:
yyypp
時間:
2025-7-18 20:16
rundstedt 發表于 2025-7-17 16:07
這需要你自己打斷點觀察死在哪里,別人又沒有你的板子。
你好,請問你能說的再詳細一些嗎?我有點不能理解
作者:
lqb781101
時間:
2025-7-19 18:55
你的按鍵部分程序好像有問題,卡住了。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产区一区二区
|
俺去俺来也在线www色官网
|
日韩欧美一区二区在线观看
|
国产成人在线播放
|
国产精品偷乱一区二区三区
|
免费观看的黄色网址
|
日韩a级片
|
日本大尺度吃奶做爰久久久绯色
|
黄色大片视频
|
久草福利在线
|
精品一区二区国产
|
免费av一区
|
国产三级一区
|
久久精品一区二区三区四区
|
在线免费观看av网站
|
国产青青操
|
中文字幕在线免费观看视频
|
久久久久久久久久久久久久久久久久久
|
婷婷久久综合
|
久草福利在线
|
综合婷婷
|
黄色大片av
|
国产一区高清
|
国产在线一区二区三区
|
神马久久影院
|
久久网av
|
亚洲一区免费观看
|
日韩一区二区免费视频
|
国产一区二区网站
|
亚洲性天堂
|
亚洲免费高清
|
日韩精品一区在线
|
欧美成人精品一区二区三区
|
久久草av
|
9l蝌蚪porny中文自拍
|
伊人色播
|
亚洲福利片
|
久艹视频在线观看
|
日韩一区精品
|
欧美日韩成人在线观看
|
国产精品自在线
|