请教关于单片机按键扫描的汇编语言 50

如图电路,逐行置0,扫描列,如何防抖和避免两个按键同时按下键值异常呢?最好能用汇编语言指导一下谢谢各位老师... 如图电路,逐行置0,扫描列,如何防抖和避免两个按键同时按下键值异常呢?
最好能用汇编语言指导一下
谢谢各位老师
展开
 我来答
Small_tiny
2013-12-03 · 超过28用户采纳过TA的回答
知道答主
回答量:54
采纳率:0%
帮助的人:76.4万
展开全部
这是一个典型的T扫电路,具体代码我就不说了,我现在来说一下它的原理
扫描是一次把一个IO置0,其它的IO均为输入状态(51是准双向IO,没有输入输出概念,把输出高当输入即可)。比如说,现在是扫描P00,那么把P00写0,其它的IO写1,然后把所有的IO读取回来,把值赋给一个临时变量用来判断,eg key_buffer_temp =P0; 把扫描(写0的相应)位强制性写上1, 即
key_buffer_temp=key_buffer_temp|0x01;这时看这个key_buffer_temp的值,有没有位是0的,即这个值是不是0xff,如果是0xff,则和P00接的按键都没有按键。如果不是0xff,则有几位是0就有几个按键。这样循环下去,一直扫到P06(不用扫P07)。
程序的注意点:
1扫描P00时,只看读回来key_buffer_temp的位1--位7,扫描P01时,只看读回来key_buffer_temp的位2--位7,……扫描P06时,只看读回来key_buffer_temp的位7,不用扫描P07
2每扫描一个就判断一次key_buffer_temp的值,一个个位来判断,同时把计数加1,如果有按键则把计数的值赋给key_value0,key_value1……
3扫描结束后看key_value0,key_value1……里面的值,有几个就几个按键
4比如说key_value0为1,key_value为10,那么就是S1,和S10有按键

至于消抖,这一般的做法就是多采样几次
做而论道
高能答主

2013-12-03 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
逐行置0,扫描列,如何防抖和避免两个按键同时按下键值异常呢?
----
什么是:避免两个按键同时按下键值异常?

两个按键同时按下,能扫描出来吗?

扫描到一个零,即返回了,而并不理会其他键是否同时按下。

使用扫描法,是不会得出多个按键按下的键值的。

防抖:一般就是延时约 10ms,再次读出,两者不相同,就不予理会,这就是防抖。
----
针对这个电路,和 4*4 矩阵键盘的编程思路相同,用汇编语言来编写,十几行即可。
更多追问追答
追问
谢谢您的回答,不过我觉得一次读入整个端口的数据,若当同一行同时按下两个按键,应该是能识别的吧;这个和4*4键盘还是有点区别的,十几行真的可以写出来吗?望赐教
追答
你是打算识别两个以上的按键吗?

那就不要用扫描法。

这个和4*4键盘还是有点区别的,确实是的,只要把行、列改成变量,就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2013-12-03 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
SCANCODE EQU 30H
SCANCNT EQU 31H
KEYVAL EQU 32H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000) ;10毫秒扫描一次键盘
MOV TL0,#LOW(65536-10000)
SETB TR0
SETB ET0
SETB EA
MOV SCANCODE,#0FEH ;扫描码
MOV SCANCNT,#3 ;扫描次数,当3次键值相同时,确认该键值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
T000:
MOV P0,SCANCODE ;扫描码送P0口
NOP
MOV A,P0 ;读入P0口值
CJNE A,SCANCODE,T001 ;如果与扫描码不同则有键按下
RL A ;否则下一行
MOV SCANCODE,A
SJMP T000
T001:
CJNE A,KEYVAL,T002 ;如果本次和上次值不一致转
DJNZ SCANCNT,T0E ;一致则看是否3次一致
MOV SCANCNT,#3 ;重赋初值
LCALL KEYDEAL ;处理键值
MOV P1,KEYVAL ;键值送显示,这里假设是P1.0口
SJMP T0E
T002:
MOV KEYVAL,A
MOV SCANCNT,#3
T0E:
RETI
KEYDEAL:
MOV R2,#0
MOV A,SCANCODE
KLP:
CLR C
RRC A
INC R2
JNC KLP
MOV R3,#0
MOV A,KEYVAL
KLP1
CLR C
RRC A
INC R3
JNC KLP1
MOV DPTR,#KTAB
MOV A,R2
DEC A
MOVC A,@A+DPTR
MOV B,A
MOV A,R3
CLR C
SUBB A,R2
ADD A,B
MOV KEYVAL,A
RET
KTAB:
DB 0,7,13,18,22,27
END
追问
谢谢,整体思路明白了,但是有死循环吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生活如歌_
2013-12-03 · TA获得超过1.5万个赞
知道大有可为答主
回答量:7398
采纳率:78%
帮助的人:2200万
展开全部
1防抖是在一开始判断有没有键按下时就软件延时去抖了,在逐列扫描时不用去抖了。
2多键按下时,由于逐列判断,先判断出来的那个键有效。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式