按键扫描键值获取原理是啥??
本帖最后由 zhange 于 2024-6-5 13:47 编辑看了试验箱的程序和冲哥讲的不一样,看得不是很懂
各位大佬u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};为啥要设置为这几个数字
主要是这几个数字的由来不懂 其他都懂了
u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
void IO_KeyScan(void) //50ms call
{
u8j;
j = IO_KeyState1; //保存上一次状态
P0 = 0xf0;//X低,读Y
IO_KeyDelay();
IO_KeyState1 = P0 & 0xf0;
P0 = 0x0f;//Y低,读X
IO_KeyDelay();
IO_KeyState1 |= (P0 & 0x0f);
IO_KeyState1 ^= 0xff; //取反
if(j == IO_KeyState1) //连续两次读相等
{
j = IO_KeyState;
IO_KeyState = IO_KeyState1;
if(IO_KeyState != 0) //有键按下
{
F0 = 0;
if(j == 0)F0 = 1; //第一次按下
else if(j == IO_KeyState)
{
if(++IO_KeyHoldCnt >= 20) //1秒后重键
{
IO_KeyHoldCnt = 18;
F0 = 1;
}
}
if(F0)
{
j = T_KeyTable;
if((j != 0) && (T_KeyTable != 0))
KeyCode = (j - 1) * 4 + T_KeyTable + 16; //计算键码,17~32
}
}
else IO_KeyHoldCnt = 0;
}
P0 = 0xff;
}
这俩一结合如何算的键值呀
上边那个数组为啥要取那几个值??????
有没有讲解视频???
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键,可以先学习
【新提醒】视频教学:《STC32位8051单片机原理及应用》,200万大奖, 送实验箱; 冲哥版 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323&extra=page%3D1
STCAI-32位8051 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...
冲哥的代码和这个不一样 他那个我看懂了试验箱带的这个看不懂试验箱这个按键判断有点绕 STCAI-32位8051 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...
大佬u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};为啥要设置为这几个数字 来人{:4_200:}{:4_200:} IO_KeyState1 ^= 0xff; //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两路连接的按键被按下。
一堆判断后到这里:
j = T_KeyTable;
右移4为,就是取IO_KeyState1 的高4为,4个位置的1分别对应1、2、4、8
再判断后到这里:
KeyCode = (j - 1) * 4 + T_KeyTable + 16; //计算键码,17~32
T_KeyTable 这个同理是取低4位,同样对应1、2、4、8
最后就是一些算法,你需要返回的值是多少,这个数组里边对应的1 、2、4、8位置取出来的数值是1、2、3、4。做一些运算返回你需要的键码值;
u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
我看了半天才大概理解,不知道正确不正确。
IO_KeyState1 ^= 0xff; //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两路连接的按键被按下。
一堆判断后到这里:
j = T_KeyTable;
右移4为,就是取IO_KeyState1 的高4为,4个位置的1分别对应1、2、4、8
再判断后到这里:
KeyCode = (j - 1) * 4 + T_KeyTable + 16; //计算键码,17~32
T_KeyTable 这个同理是取低4位,同样对应1、2、4、8
最后就是一些算法,你需要返回的值是多少,这个数组里边对应的1 、2、4、8位置取出来的数值是1、2、3、4。做一些运算返回你需要的键码值;
u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
我看了半天才大概理解,不知道正确不正确。
lezjin 发表于 2024-6-5 16:57
IO_KeyState1 ^= 0xff; //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两 ...
我就想知道这个数组咋来的 u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; 高4位和低4位,每一个1对应的10进制是8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值,相当与第几行,第几列,运算后返回键码 lezjin 发表于 2024-6-5 18:15
高4位和低4位,每一个1对应的10进制是8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值 ...
{:5_272:}6666
页:
[1]