导航:首页 > 操作系统 > 单片机判断键位

单片机判断键位

发布时间:2022-11-18 01:47:21

㈠ 51单片机,矩阵按键,长按短按判断

/*网友反映长键结束后会送出短键值,特作更改2019.03.29*/

//1,再写一个长短键判断函数,调用那个按键扫描函数
unsignedcharKEY_process(void)
{
staticunsignedcharOld_key=0;//上次按键值
staticunsignedcharKey_buf=0;//按键有效保存
staticunsignedcharPress_CNT=0;//按键按下时间,根据调用时间间隔确定
=0;//长键有效标记变量
unsignedcharNew_key=0;//当前按键值
unsignedcharKEY=0;//待返回的按键值

New_key=keyscan();

if(New_key==Old_key)
{
if(New_key!=0)//建议keyscan返回0的那个值改为其他值,方便这里判断
{
Key_buf=New_key;
if(Press_CNT<0xff)
{
Press_CNT++;
}
if(Press_CNT>=100)//调用时间间隔确定*100为长按时间,
{
KEY=Key_buf+100;//将短键+100作长键区分
Press_CNT=0;//按键时间清0
Key_buf=0;//按键缓冲清0
bPreKeyIsLong=1;//长键有效标记
}

}
else//按键弹起
{
if(Key_buf&&(bPreKeyIsLong==0))//仅在长键无效时
{
KEY=Key_buf;//将缓冲值送将返回的值
Key_buf=0;//清按键缓冲
}
Press_CNT=0;//按键弹起或按其他按键,将长按时间清0
bPreKeyIsLong=0;//长键有效标记清0
}
}
Old_key=New_key;//将新按键赋给下一次的旧按键值

returnKEY;//0代表无按键
}
//2,弹起不返回已确定的值,则在keyscan最后加一句判断
if((P3&0X0F)==0X0F)//按键已经弹起
{
keyvalue=MY_key;//使按键等于一个自定义的值
}

㈡ 如何用单片机判断按键是单击还是双击

假设有键按下时 key = 0 。

if(key == 0) { //发现按下按键
Delay(10) //延时约10ms
if(key == 0) { //确认第一次按下
while(!key); //等待释放

//-------------------以上是常规的按键判别步骤

Delay(100) //多延时一会,约100ms
if(key == 0) {//确认第二次按下
//执行双击程序
}
else {
//执行单击程序
}
}
}

㈢ 单片机如何检测多个按键按下情况

用查询的办法

中断+查询的办法
如果有键按下(中断)
则依次查询所有按键
或直接每几十或几百ms判断所有按键的状态
这样就一个都不漏掉了

㈣ 51单片机双键同时识别(长按)判断程序怎么编

假设“1”表示键按下,那么双键同时按,肯定端口有两个“1”,只有一个键按则只有一个“1”,当然“0”表示按下的话,取反就是了。
这样就好办了,将这个有效键位值赋值给累加器A,根据奇偶标志“P"的值就可以判断是单键还是双键了。

㈤ 单片机中判断按键是否按下为防止误判断需要做什么

一般需要增加消抖,也就是采集到“按下”时还需要过几十毫秒再采集一次,如果仍然为“按下”状态才视为有效的按下。
上面只是最粗糙的一种判断方法,一般仅用于可靠性要求不高的场合。对于商业级的产品则至少需要添加软件滤波的方式来准确判断按键的真实状态。

㈥ 单片机矩阵键盘键号的判别

PA口接列线,PC口接行线
扫面列线,读取行线状态....行线默认都为高电平,当行线和列线相交时,某一列线为低电平,那么如果这一列没有键按下,行线的状态依然为高电平,如果有键按下,那么行线被短路,变为低电平,哪条行线输出低电平,那么就是这一行的键被按下,又知道是在哪一列,也就完全确定按下的是哪一键了...也就是行首号加列号就是键号(行号和列号都是从0开始的)
应该是第一行的首键号为8,列号为1,所以闭合键号为9吧(你自己前面说的也是:闭合键的键号等于为低电平的列好加上行线为低电平的行的首键号)
扫描的意思就是没开始扫描时,列线全部为高电平,开始扫描时,先第0列变为低电平,其他列仍然是高电平,然后第1列变为低电平,其他列仍然为高电平(包括前面变低电平的0列,现在也恢复高电平了),然后是第2列变为低电平,其他列为高电平,直到第7列为低电平,其他列为高电平,完成一次扫描...
还有“PA口输出为11111101时,就是第1列输出为低电平,其他列为高电平,列为输入口,不读取它的状态,行口为输出口,读取行状态,若pc0~pc3输出1101,如果pc0~pc3依次对应行0~3的话,那么第2行为低电平(你说:则1行1列相交键处于闭合,是pc0~pc3依次对应行3~0的情况),则1列2行相交的键闭合,每行有8列,第2行的行首号(因为行号从0开始,所以行号为2的行,按照习惯是第3行)为16,列号为1,那么键号就为16+1=17
下面有扫描2*4键盘的汇编程序(你的是4*8,即4行8列的键盘),仅供参考
看不懂不强求,希望对你有所帮助
DATA SEGMENT
TABLE DB ‘A’ ,‘B’ ,‘C’ ,‘D’ ,‘E’ ,‘F’ ,‘G’ ,‘H’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,81H;使8255的A口和C口,并初始化
OUT 63H,AL
START1:
CALL EXAM;判断是否有键按下的子程序
JZ START1
CALL DELAY;延时程序,判断键是否误按
CALL EXAM
JZ START1;如果是误按,返回开始处,如果为否,顺序执行
MOV CL,00H ;开始键号判断
MOV CH,0FEH
CHECK:
MOV AL,CH
OUT 60H,AL
IN AL,62H ;从c口读数据,也就是读取行的状态...
TEST AL,01H;判断是否为第0行
JNZ OTHER ;不是,则转OTHER处
MOV AL,00H ;是的话,行首号置0
JMP KCODE;确定键号
OTHER: ;判断是否第1行
TEST AL,02H
JNZ NEXT ;不是则跳到NEXT处,进行下一列的判断
MOV AL,04H ;第1行行首号置4
KCODE: ;确定键号
ADD AL,CL
MOV BX,OFFSET TABLE
AND AX,0FFH
ADD BX,AX
MOV AL,[BX]
MOV [DI],AL
MOV AH,01H
MOV AL,[DI]
INT 10H
NEXT: ;进行下一列的判断
INC CL
MOV AL,CH
TEST AL,08H
JZ START1
ROL AL,1
MOV CH,AL
JMP CHECK
EXAM PROC
MOV AL,00H
OUT 60H,AL
IN AL,62H
NOT AL
TEST AL,03H
RET
EXAM ENDP
DELAY PROC
PUSH CX
MOV CX,0010H
T1:
MOV AX,1000H
T2:DEC AX
JNZ T2
LOOP T1
POP CX
RET
DELAY ENDP
CODE ENDS
END START

㈦ 如何用单片机判断按键单击双击

这个一般是经验值,可这样判断:连续两次击键间隔时间超过500ms,则视为单击,否则视为双击按键。去抖动时间一般使用30ms。如果按键质量不太好,时间可以加倍。可以选择几组参数
然后实践一下看看手感。

㈧ 单片机按键按下的先后顺序判断

看看如下图片:

㈨ 单片机如何判断4个按键正反依次按下后状态

计数啊。如果是先按1或是4 就进入去。中间注意循环等待时间。
if(key1 == 0x00)
{
if(key2 == 0x00)
{
顺向。

}
else
{
不是顺向,单独动作。
}
}

㈩ 单片机怎样识别按键是单机,双击还是长按,算法应该是怎样

按键的处理进行时间判断.在一定的时间内如果按下按键,当时间小于这个时间,那么为单次按键,当时间超过一定时间为为长按,当两次按的中间有高电平时,为双击.你可以参考参考.

阅读全文

与单片机判断键位相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:672
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:486
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:382
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:350
风翼app为什么进不去了 浏览:779
im4java压缩图片 浏览:362
数据查询网站源码 浏览:151
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163