51单片机 汇编程序 44矩阵按键的中断控制。
时间:10-02
整理:3721RD
点击:
ORG 00H
MOV R3, #0
JMP START
ORG 13H
JMP KEY
ORG 23H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
CORD_H EQU 30H
CORD_L EQU 31H
CORD_HL EQU 32H
CORD_B EQU R3
MOV IE, #84H ;使能外部中断1
MOV R0, #3FH
MOV R1, #00H
MAIN:
CJNE CORD_B, #1H, C1
JMP C2
C1:
CALL initial_condition
JMP MAIN
C2:
MOV R1, #0EFH
CALL KEY
CALL DISPLAY
JMP MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
initial_condition:
MOV DPTR, #LABTE0
I1:
CLR A
MOVC A,@A+DPTR
CJNE A,#88H, I2
RET
I2:
MOV R0, A
CALL DISPLAY
CALL DELAY
INC DPTR
JMP I1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: /*显示按键对应信息*/
WEI_LATCH:
MOV P0, R1
SETB P2.3
CLR P2.3
DUAN_LATCH:
MOV P0, R0
SETB P2.2
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:
MOV P1, #0F0H
MOV A, P1
ANL A, #0F0H
CJNE A,#0F0H,KEEPKEY /*不相等说明有按键按下,*/
RET
KEEPKEY:
CALL FILTER
MOV P1, #0F0H
MOV A, P1
ANL A, #0F0H
MOV CORD_H, A
MOV P1, #0FH
MOV A, P1
ANL A, #0FH
ORL A, CORD_H
MOV CORD_HL, A
SETKEY: /*判断按下按键是哪个对应的数字或字母*/
MOV DPTR, #LABTE1
MOV R2, #00H
S1:
MOV A, R2
MOVC A, @A+DPTR
CJNE A, CORD_HL, S2 /*CORD_HL能否用B代替?*/ /*将按键获得的代码,与表1中的代码对比,不相等跳入S2*/
MOV 33H, R2
JMP S3 /*相等跳入S3去值*/
S2: /*不相等时DPTR向下移1为,并计数*/
INC R2
CJNE A,#88H,S1
RET
S3: /*载入按键对应的值*/
MOV DPTR, #LABTE2
MOV A, R2
MOVC A,@A+DPTR
MOV R0, A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: /*中断子程序*/
MOV CORD_B, #1
POP DPL
POP DPH
MOV DPTR, #0023H /*返回从新的地址开始(START)*/
PUSH DPL
PUSH DPH
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FILTER: /*防抖动延迟*/
MOV R4, #60
E1:
MOV R5, #248
DJNZ R5, $
DJNZ R4, E1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: /*流水效果延迟*/
MOV R4, #5
D1:
MOV R5, #60
D2:
MOV R6, 248
DJNZ R6,$
DJNZ R5,D2
DJNZ R4,D1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LABTE1: ;按键扫描码
DB 7EH, 0BEH, 0DEH, 0EEH
DB 7DH, 0BDH, 0DDH, 0EDH
DB 7BH, 0BBH, 0DBH, 0EBH
DB 77H, 0B7H, 0D7H, 0E7H
DB 88H
LABTE2: ;扫描后显示对应的数字和字母(段选)
DB 3FH, 06H, 5BH, 4FH
DB 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH
DB 58H, 5EH, 79H, 71H
DB 88H
LABTE0: ;数码管流水效果
DB 01H, 02H, 04H, 08H, 10H, 20H
DB 88H
END
————————————————————————————————
为什么initial_condition,KEY,DISPLAY子程序都正常,就是不能复位开始数码管流水效果时,按下按键产生中断?
MOV R3, #0
JMP START
ORG 13H
JMP KEY
ORG 23H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
CORD_H EQU 30H
CORD_L EQU 31H
CORD_HL EQU 32H
CORD_B EQU R3
MOV IE, #84H ;使能外部中断1
MOV R0, #3FH
MOV R1, #00H
MAIN:
CJNE CORD_B, #1H, C1
JMP C2
C1:
CALL initial_condition
JMP MAIN
C2:
MOV R1, #0EFH
CALL KEY
CALL DISPLAY
JMP MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
initial_condition:
MOV DPTR, #LABTE0
I1:
CLR A
MOVC A,@A+DPTR
CJNE A,#88H, I2
RET
I2:
MOV R0, A
CALL DISPLAY
CALL DELAY
INC DPTR
JMP I1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: /*显示按键对应信息*/
WEI_LATCH:
MOV P0, R1
SETB P2.3
CLR P2.3
DUAN_LATCH:
MOV P0, R0
SETB P2.2
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:
MOV P1, #0F0H
MOV A, P1
ANL A, #0F0H
CJNE A,#0F0H,KEEPKEY /*不相等说明有按键按下,*/
RET
KEEPKEY:
CALL FILTER
MOV P1, #0F0H
MOV A, P1
ANL A, #0F0H
MOV CORD_H, A
MOV P1, #0FH
MOV A, P1
ANL A, #0FH
ORL A, CORD_H
MOV CORD_HL, A
SETKEY: /*判断按下按键是哪个对应的数字或字母*/
MOV DPTR, #LABTE1
MOV R2, #00H
S1:
MOV A, R2
MOVC A, @A+DPTR
CJNE A, CORD_HL, S2 /*CORD_HL能否用B代替?*/ /*将按键获得的代码,与表1中的代码对比,不相等跳入S2*/
MOV 33H, R2
JMP S3 /*相等跳入S3去值*/
S2: /*不相等时DPTR向下移1为,并计数*/
INC R2
CJNE A,#88H,S1
RET
S3: /*载入按键对应的值*/
MOV DPTR, #LABTE2
MOV A, R2
MOVC A,@A+DPTR
MOV R0, A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: /*中断子程序*/
MOV CORD_B, #1
POP DPL
POP DPH
MOV DPTR, #0023H /*返回从新的地址开始(START)*/
PUSH DPL
PUSH DPH
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FILTER: /*防抖动延迟*/
MOV R4, #60
E1:
MOV R5, #248
DJNZ R5, $
DJNZ R4, E1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: /*流水效果延迟*/
MOV R4, #5
D1:
MOV R5, #60
D2:
MOV R6, 248
DJNZ R6,$
DJNZ R5,D2
DJNZ R4,D1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LABTE1: ;按键扫描码
DB 7EH, 0BEH, 0DEH, 0EEH
DB 7DH, 0BDH, 0DDH, 0EDH
DB 7BH, 0BBH, 0DBH, 0EBH
DB 77H, 0B7H, 0D7H, 0E7H
DB 88H
LABTE2: ;扫描后显示对应的数字和字母(段选)
DB 3FH, 06H, 5BH, 4FH
DB 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH
DB 58H, 5EH, 79H, 71H
DB 88H
LABTE0: ;数码管流水效果
DB 01H, 02H, 04H, 08H, 10H, 20H
DB 88H
END
————————————————————————————————
为什么initial_condition,KEY,DISPLAY子程序都正常,就是不能复位开始数码管流水效果时,按下按键产生中断?
这是开始是8位数码管产生流水效果,直到按键中断型号产生后,44矩阵按键按下对应的0到F的键后显示出来的汇编程序。
这前写出了一个地方,
ORG 13H
JMP KEY
把这里的KEY改成TIM0,
可是还不没有产生效果,如果把中断1口接到独立按键就会使流水灯效果暂停
你是不是中断没有开完,外部中断涉及到两个寄存器,TCON和IE,外部中断应该要开EA,EX1,IT1吧。
我开了MOV IE, #84H ;使能外部中断1
IT1复位不是0电平使用低电平触发吗?难道这个要用边沿触发才行?
电平触发方式是按照电平的高或者低来触发,所以用的时候,必须在发生触发事件后立即将电平拉到非触发电平上,如果不这样做的话,会导致程序一直在触发事件程序入口处,而不会执行其他地方的程序
你做的是不是相当于这个,按下按键显示按键上的数。
恩,差不多,我已经解决了,是在中断触发前我没把矩阵接口低位置低电平。我又改成边沿触发,效果达成了