• TOC
    {:toc}

消息队列实现按键控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
uint8_t sta = 0x01; // 流水灯初始状态(L1亮)
uint8_t dir = 1; // 流水灯初始方向(1:右行,0:左行)
uint8_t brun = 1;
for(;;) {
uint8_t key;
if (osMessageQueueGet(RX1_QUEUEHandle,&key,0,10) == osOK && K3_Pin == key) {
brun = !brun; // 翻转流水灯工作状怿
}
if(brun){
SetLeds(sta); // 流水灯亮灿
// 等待按键消息
//int key = osThreadFlagsWait(KEY_MASK, osFlagsWaitAny, 0);
if (osMessageQueueGet(RX2_QUEUEHandle,&key,0,10) == osOK && key == K1_Pin) // K1按下
dir = !dir; // 流水灯反吿
if (dir) sta = (sta < 0x80) ? (sta << 1) : 0x01;// 右行流水灯变匿
else sta = (sta > 0x01) ? (sta >> 1) : 0x80; // 左行流水灯变匿
osDelay(100); // 流水灯变化时间间隿0.1秿
}
else{
SetLeds(sta); // 流水灯亮灿
}
}
/* USER CODE END StartDefaultTask */
}
void StartTaskKey(void *argument)
{
/* USER CODE BEGIN StartTaskKey */
/* Infinite loop */
uint8_t brun = 1; // 流水灯工使
for(;;) {
uint8_t key = ScanKey(); // 扫描按键键码
if (key > 0) { // 有按键按丿
//osThreadFlagsSet(defaultTaskHandle, key); // 向默认任务发送key通知
while (ScanKey() > 0); // 等待按键放开,防止按键连挿
osMessageQueuePut(RX1_QUEUEHandle,&key,0,0);
osMessageQueuePut(RX2_QUEUEHandle,&key,0,0);
}
osDelay(10);
}
/* USER CODE END StartTaskKey */
}