u8 key = key_scan(0); if(key==KEY_UP){ led_lightn(0); }else if(key==KEY_DOWN){ led_lightn(1); }else if(key==KEY_LEFT){ led_lightn(2); }else if(key==KEY_RIGHT){ led_lightn(3); }else{ led_all_off(); } } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ...
KEY_Scan 函数,则是用来扫描这 4 个IO 口是否有按键按下。 KEY_Scan 函数, 支持两种扫描方式,通过 mode 参数来设置。当mode 为0 的时候, KEY_Scan 函数将不支持连续按, 扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在...
step1:硬件原理图(按键检测电路,有KEY1和KEY2两个按键,按键按下时对应引脚为高电平;按键松开时对应引脚为低电平) step2:初始化引脚 KEY1:PA0脚 KEY2:PC13脚 GPIO_KEY.h GPIO_KEY.c step3:自定义扫描函数,返回对应引脚状态 key_scan_operation.h key_scan_operation.c step4:主函数中循环扫描,根据引脚状态...
KEY_DOWN:K_DOWN键按下 KEY_LEFT:K_LEFT键按下 KEY_RIGHT:K_RIGHT键按下 ***/ u8KEY_Scan(u8mode) { staticu8key=1; if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))//任意一个按键按下 { delay_ms(10);//消抖 key=0; // 下面判断到底哪个按键被按下 if(K_UP==1...
这里KEY4按键长按LED闪烁是在按键检测函数里直接执行的,而短按是在键值处理函数里执行的。之所以这么做,是因为按键长按不松手,键值一直不变,按键处理函数只会被执行一次,请看前文的ScanKey函数。KEY1长按,短按都是在键值处理函数里执行的。 在按键处理函数中,首先分离出长按标志位,然后根据键值去匹配是哪个按键...
KEY_UP:K_UP键按下 KEY_DOWN:K_DOWN键按下 KEY_LEFT:K_LEFT键按下 KEY_RIGHT:K_RIGHT键按下***/u8 KEY_Scan(u8 mode){static u8 key=1;if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0)) //任意一个按键按下{delay_ms(10); //消抖key...
KEY_Init(); //初始化与按键连接的硬件接口 BEEP_Init(); //初始化蜂鸣器端口 LED0=0; //先点亮红灯 while(1) { t=KEY_Scan(0); //得到键值 if(t){ switch(t) { caseKEY_UP: //控制蜂鸣器 BEEP=!BEEP; break; caseKEY_LEFT: //控制LED0翻转 ...
"stdio.h" #include "key.h" #include "led.h" int main(void) { uint8_t key_value = 0; delay_init(168); uart_init(115200); led_init(); key_init(); while(1) { key_value = key_scan(0); //0不支持长按 1支持长按 switch(key_value) { case KEY0_PRES: printf("key1 pressed...
声明一个返回类型为八位无符号数的函数KEY_Scan,字面的意思是按键扫描函数,传入参数为八位无符号型变量mode,字面的意思是(扫描)模式。
轮询方式:main函数大循环中加入按键扫描函数key_scan(),相信大家最开始接触的也是这个 中断方式:在单片机中大多数都支持外部中断,但每一个(或几个)IO口占用一个中断向量,使用非常方便。 状态机方式:在我看来这种方式优于前两者任意一个,为什么呢?我们来来看看。