首页 - 通讯 - stm32按键扫描函数(stm32按键扫描函数详解)

stm32按键扫描函数(stm32按键扫描函数详解)

2023-09-24 04:20

stm32按键扫描函数(stm32按键扫描函数详解)

stm32用一个按键控制两位数码管从00-99,代码怎么写

/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)
**************************************************************//
按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)//
#include
sbit P0_0=P0^0; //个位数字
sbit P0_1=P0^1; //十位数字
void delay(int k); //Tab为数码管显示值,存入一个数组内
void key_ccan(void); //声明按键扫描函数
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}unsigned char i,shi,ge,num,count=10; //num为被显示的数字
void main()
{
P2=Tab[0];P0_0=0;P0_1=0;//显示00
num=0; //被显示的数置0
while(1)
{
key_ccan(); //调用按键扫描程序
for(i=0;ishi=num/10; //取出十位数
ge=num%10; //取出个位数
P0_0=1;P0_1=1; //关闭显示
P2=Tab[shi]; //P2口送出十位数据显示代码
P0_0=0; //打开十位显示
delay(10); //延时
P0_0=1; //关闭显示
P2=Tab[ge]; //P2口送出个位数据显示代码
P0_1=0; //打开个位显示
delay(10); //延时
P0_1=1; //关闭个位显示
}
}
void key_ccan(void)
{
unsigned char ii;
P1=0xff;
ii=P1;
if(ii!=0xff)
{
P1=0xff;
delay(50);
ii=P1;
if(ii!=0xff)
{
switch(ii)
{
case 0xfe: num++;if(num==100) num=0; break;
case 0xfd: if(num==0) num=99;else num--;break;
default: break;
}
}
}
}
void delay(int k) //最简单的C延时程序
{ unsigned char i;
while(k--) //直至K减为0则跳出
{for(i=100;i>0;i--);}
}

5.9
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
单片机_两个数码管显示00~99
/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)
**************************************************************//
按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)//
#include
sbit P0_0=P0^0; //个位数字

stm32如何按下按键换到下一页

stm32按下按键换到下一页如下。STM32CubeIDE快捷键很多,可以通过 Help > Show Active Keybindings… 查看当前可用快捷键;也可以在 Window > Preferences > General > Keys 中查看修改快捷键。

stm32按键处理函数的逻辑关系是什么?

static是静态变量只会执行一次
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这句意思是如果keyup为1,同时key0123中有一个按键被按下,那么if为真,执行取值操作,作为返回值付给主函数的t,
else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;这个意思是如果上面的if为假,那么如果key0123没有一个被按下,那么keyup置1,
我们来分析如果不支持连按的情况,mode为0,
一开始你没按按键那么if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))为假不执行后面的语句执行elseif应为keyup没变过,所以没什么用。
假设你按的是key0,那么KEY0==0||KEY1==0||KEY2==0||KEY3==1为真,执行后面的语句,把keyup置0后,取出按键值,作为函数返回值送会给t,
如果你继续按着当下次按键扫描时到来时,static u8 key_up=1,这个只执行一次,同时mode又为0,那么keyup还是0,
然后执行到if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这句,由于keyup是0所以不会执行if语句,执行elseif,但是你此时有有一个按键是被按下的,所以elseif里的keyup=1也不会被执行,因为elseif也是假的。然后返回值还是0,这就达到了不支持连按的目的
如果你按过之后送手了那么再看,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这条语句为假应为keyup为0执行elseif,此时由于你没有按按钮,所以会执行keyup=1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。
同理可以分析出mode为1时的支持连按的情况

STM32 代码分析,请问这一语句是表示什么意思呢?u8 KEY_Scan(u8 mode)

声明一个返回类型为八位无符号数的函数KEY_Scan,字面的意思是按键扫描函数,传入参数为八位无符号型变量mode,字面的意思是(扫描)模式。

STM32按键扫描

1. u8 KEY_Scan(void) 里的u8是返回值。
2. key_up的作用是保证在按键全松开的情况下才开始检测,key_up==1表示在上次检测时按键是全部松开的,本次检测完毕后如果有按键按下则key_up==0,这样下次检测如果按键未松开则不会重复检测。
3. #ifndef __KEY_H是防止头文件重复引用,在多个.c文件中引用key.h时只会编译一次头文件。追问

感觉else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1; 中的key_up=1; 没什么作用,因为在每次进入函数时开头都定义了key_up=1;

追答

key_up是静态变量,表示只分配一次,且只在第一次分配内存时初始化。也就是说第一次调用KEY_Scan时分配该变量并且设置为1,再次调用KEY_Scan时该变量仍保持上次函数调用后的值。

追问

您的意思就因为它是静态变量,所以这个初始化只进行一次,那么只要不复位,下次无论在怎么执行,都不会进行第二次初始化?
那如果不是静态变量,只是普通的定义char key_up=1;呢?

追答

是的,可以把它看作作用域是当前函数的全局变量.
如果只是普通定义,自然是局部变量,每次进入函数要重新初始化...
在这个函数里,key_up的值是需要保存的,才能起到作用...

追问

假设现在是key0按下
if(KEY0==0)
{
JTAG_Set(SWD_ENABLE);
return 1;
}
执行完以后,返回一个1,但是程序还要继续执行啊,执行
JTAG_Set(SWD_ENABLE);
return 0;// 无按键按下
此时不就又返回一个0吗?(不知道哪理解错了求指教)
我认为这样是对的,但是调试后不对,不知道为什么。
else if(KEY0==1&&KEY1==1&&KEY2==0)
{ key_up=1;
JTAG_Set(SWD_ENABLE);
return 0;}

追答

按键0按下,返回1,KEY_Scan这个函数就跳出来,还继续执行什么?

追问

?return 不是break 怎么会不执行呢?我是按照我提问的整个程序说的

追答

不大明白你的意思.
我说的是KEY_Scan这个函数,当执行到return时就会跳出这个函数,函数内return后面的代码就不执行了.也就是说,KEY_Scan执行一次,只能有一个返回值.如果是对这个有异议的话可以查查return的用法.
你说的整个程序又指什么?如果是KEY_Scan这个函数反复调用的话,那么第二次调用确实会返回0,因为按键还没有松开(key_up=0)...

追问

哦 是这样 因为我买的是正点原子的开发板 我问的他 他说的就是返回2次 而您说一次 所以我就不知道谁对谁错了。
另外如果按您说的是对的,那么我将程序后面部分改为else if(KEY0==1&&KEY1==1&&KEY2==0)
{ key_up=1;
JTAG_Set(SWD_ENABLE);
return 0;} return 0放在括号内,为什么编译时就出现,warning: #940-D: missing return statement at end of non-void function "KEY_Scan"
而且调试后状态也不对呢?

追答

呵呵,八成他误解了你的意思,,一开始我也没想到你会在return这个地方有异议
或者你软件仿真一下,看看执行到return是否跳出函数...
警告是因为,KEY_Scan函数内,如果if else的条件都不满足,那么函数最后没有返回值,你在最后一个括号前加return 0就可以.不过你这样改动没有必要,这个函数本身是正确的.
根据这段代码,KEY_Scan是个扫描按键是否改变的函数,应该是每多少ms调用一次或者放在main函数的while里的. KEY0,KEY1,KEY2的值分别用来表示3个按键是否被按下(举例来说,KEY0应该对应一个外部的输入引脚,它的值是0表示按键1按下了,值是1表示按键1松开,KEY1也是,KEY2正好反着,值1表示按键3按下).并将哪个按键被按下的信息返回.但是,这个扫描间隔是很短的,比如按键1按下执行亮灯1s的操作,而你按下按键在松开之前,KEY_Scan不知执行多少次了,这就是key_up的作用,保证按一次只执行一次亮灯.
另外,先学习下基本的语法吧,磨刀不误砍柴工,

以上就是小编对于stm32按键扫描函数(stm32按键扫描函数详解)问题和相关问题的解答了,stm32按键扫描函数(stm32按键扫描函数详解)的问题希望对你有用!