proteus仿真矩阵键盘,为什么中断无法返回

采用动态显示,当有按键按下时进入中断,是下降沿触发的,中断后设置防抖,然后扫描键值。设置有8个字节的显示存储区,每当有新的按键被按下,所有的数字依次向右移动。仿真和实物上... 采用动态显示,当有按键按下时进入中断,是下降沿触发的,中断后设置防抖,然后扫描键值。设置有8个字节的显示存储区,每当有新的按键被按下,所有的数字依次向右移动。仿真和实物上都进行了测试,遇到的问题都是:键盘第一行没问题,按下以后中断,一直按着也是改变一个值。如果按2,3,4行,那么按下去不放开,中断就没法返回,显示存储区里的所有值都变成了那个键,也就是反复在进入中断,只有松开后,才返回到显示。我的程序到底出了什么问题?
汇编代码如下
ORG 0000HLJMP MAINORG 0003HLJMP SCAN
KEYVALUE EQU 50H
ORG 0100HMAIN:SETB EASETB EX0SETB IT0 ;下降沿触发MOV R0, #51HMOV R1, #8INITIAL:MOV @R0, #10HINC R0DJNZ R1, INITIAL
DISPLAY:MOV R1, #51HMOV R2, #0FEHMOV R3, #08HMOV P1, #0F0HLOOP1:MOV A, @R1MOV DPTR, #DISPTABMOVC A, @A+DPTRMOV P0, A ;输入字形码MOV A, R2MOV P2, A ;输入锁存码SETB CRLC AMOV R2, ALCALL D1MSINC R1DJNZ R3, LOOP1SJMP DISPLAY
D1MS: ;延迟1msMOV R5, #217LL1:MOV R6, #255LL2:DJNZ R6, LL2DJNZ R5, LL1RET
ORG 0200HSCAN://LCALL D20MS ;延迟20ms,防抖动MOV A, #0FEH ;初始化行线MOV R5, #4BACK2:MOV R1, A ;暂存行状态MOV P1, A ;输出行状态MOV A, P1 ANL A, #0F0H ;读入列状态CJNE A, #0F0H, KEY ;找到键,跳转至keyMOV A, R1SETB CRLC ADJNZ R5, BACK2 ;没有找到键,改变行状态,继续扫描RETIKEY:XCH A, R1ANL A, #0FHORL A, R1 ;将行、列状态写入一个字节,作为键特征值MOV KEYVALUE, AMOV DPTR, #KEYTABMOV R3, #0FFHBACK4:INC R3MOV A, R3MOVC A, @A+DPTRCJNE A, KEYVALUE, BACK4 ;在特征表中寻找对应的键代号,存入KEYNUM中LCALL ADJUSTRETI
D20MS: ;延迟程序MOV R6, #2L1:MOV R7, #255L2:DJNZ R7, L2DJNZ R6, L1RET
ADJUST:MOV A, #51HADD A, #7MOV R7, #7MOV R0, ADEC AMOV R1, ALOOP:MOV A, @R1MOV @R0, AMOV A, R0DEC AMOV R0, ADEC AMOV R1, ADJNZ R7, LOOPMOV A, R3MOV @R0, ARET
KEYTAB: 字数超过,省略了
DISPTAB: 字数超过,省略了
END
展开
 我来答
做而论道
高能答主

2015-05-31 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
中断程序中,不要使用延时函数。

另外,你在中断程序中,使用了主程序所使用的寄存器。
都没有进行保护和恢复。
更多追问追答
追问
谢谢指出,的确没有保护寄存器。如果不在中断里面使用延时,那怎么进行键盘的防抖呢?
追答
有抖动的键盘,就不要使用外部中断。

外部中断,适用于输入,不出现抖动的设备信息。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式