大家好,我又回来了,今天给大家交流下按键的操作。按键的实现方法有很多。比如电平判断,中断,我们这里用的是操作系统。我们就可以有几个方法。我们可以建立两个线程,一个线程运行LED的程序,一个用来检测案件的状态。也可以把他们放到一个线程中去(我认为这样会更方便)。但是我们今天用的是第一个方法。😄😄😄😄
端口、变量定义
我们先定义一个LED和一个按键的引脚。因为现在还没有学习信号量所以我们同时定义一个全局变量来记录按键的状态。
#define LED0 GET_PIN(B,0) //LED 定义
#define KEY GET_PIN(A,0) //按键定义
rt_bool_t count=0; //按键标志
新建按键线程
先设置KEY的GPIO为上拉输入,在线程中不断读取KEY引脚的状态 ,通过全局变量count 传递给LED线程 (这里我们还没有学习信号量 下次我们使用信号量实现)
static void Key_entry(void*parameter)
{
rt_pin_mode(KEY,PIN_MODE_INPUT);
while(1)
{
if(rt_pin_read(KEY)==PIN_LOW)
{
rt_kprintf("key up");
while(rt_pin_read(KEY)==PIN_LOW);//松手检测
count=~count;
}
rt_thread_delay(10);
}
}
新建LED线程
在上面我们定义了 按键的标志 当按键的标志为真是,LED0电平拉低LED0点亮,否则LED0熄灭。
static void Blink_entry(void* parameter)
{
rt_pin_mode(LED0, PIN_MODE_OUTPUT);
while(1)
{
if (count) {
rt_pin_write(LED0, PIN_LOW);
// rt_kprintf("OPEN_LED\n");
} else {
rt_pin_write(LED0, PIN_HIGH);
// rt_kprintf("CLOSE_LED\n");
}
// count++;
rt_thread_delay(10);
}
}
编写主函数
使能线程,加入系统。
int main(void)
{
led_thread = rt_thread_create("led",
Blink_entry,
RT_NULL,
512,
15,
20);
if(led_thread!=RT_NULL)
rt_thread_startup(led_thread);
else
return -1;
key_thread = rt_thread_create("led",
Key_entry,
RT_NULL,
512,
10,
20);
if(key_thread!=RT_NULL)
rt_thread_startup(key_thread);
else
return -1;
}
今天的教程就到这里,我们下次再见。