📄 键盘输入中断.txt
字号:
1
这个程序能接受256个字符,如果你还想输入更多的字符,只需要把空间留的更多一点就行
data segment
keyboard db 256 dup (?) ;为输入的字符串预留空间
data ends
code segment
assume cs:code,ds:data
main proc far
mov ax,data
mov ds,ax
lea dx,keyboard ;这个中断能使你在输入时就能看见输入的字符
mov ah,9
int 21h
mov ah,1 ;这个中断是为了使程序暂停一下,不然你按回车键就立刻结束
int 21h
mov ah,4ch
int 21h
main endp
code ends
end main
TC 下调试通过
注意键盘中断每按一次键中断两次(按下一次,松开一次)
所以只按5次键,程序就会退出
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define AAA 0x09 /* 键盘I/O中断的中断号 */
int TimerCounter=0;
/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */
void interrupt ( *oldhandler )();
/* 新的键盘中断处理函数 */
void interrupt newhandler()
{
TimerCounter++;
(*oldhandler)();
}
void main(void)
{
int key;
oldhandler = getvect( AAA );
disable();
setvect( AAA, newhandler );
enable();
while(1)
{
if ( TimerCounter >= 10 )
{
break;
}
}
disable();
setvect( AAA, oldhandler );
enable();
}
3
键盘输入汇编程序-中断
0
推荐键盘输入汇编程序
;----------------------------------------------------------------------;
;功 能:显示部分默认显示"- - - - - - - -",有按键按下就显示相应的键值。
; 如KL1键按下显示"- - - - - - - 1",在没有新的按键按下之前保持该
; 显示状态,其他按键依次类推 。
;备 注:
;----------------------------------------------------------------------;
;-----------------------------------------------------------------------
;位定义
A138 BIT P2.0 ;74HC138的C、B、A和CS信号输入
B138 BIT P2.1
C138 BIT P2.2
CS138 BIT P2.3
INT1IN BIT P3.3 ;INT1中断输入口
;变量定义
DELAYT EQU 30H ;控制延时程序中的时间
KEYVAL EQU 31H ;保存按键的键值
LEDVAL1 EQU 40H ;保存8个数码管要显示的值
LEDVAL2 EQU 41H
LEDVAL3 EQU 42H
LEDVAL4 EQU 43H
LEDVAL5 EQU 44H
LEDVAL6 EQU 45H
LEDVAL7 EQU 46H
LEDVAL8 EQU 47H
;-----------------------------------------------------------------------
;主程序
ORG 0000H
SJMP START
ORG 0013H
LJMP KEYINT1 ;转到外部中断1服务程序,取出按键键值
ORG 0080H
START: MOV SP,#60H
MOV P2,#0FFH ;初始状态
SETB IT1 ;下降延触发
SETB EX1 ;允许外部中断1
SETB EA ;开总中断允许
MOV LEDVAL1,#0CH ;0Bh为“-”在表格中的偏移位置
MOV LEDVAL2,#0CH
MOV LEDVAL3,#0CH
MOV LEDVAL4,#0CH
MOV LEDVAL5,#0CH
MOV LEDVAL6,#0CH
MOV LEDVAL7,#0CH
MOV LEDVAL8,#0CH
MOV R0,#0F7H ;显示用74138译码使用,P23为0选通138
; P22、P21和P20为111
MOV R1,#LEDVAL1 ;R1指向数码管显示值缓存区的首地址
MOV R2,#08H ;循环扫描次数,有8个数码管要显示
MOV DPTR,#DISPTAB ;段码值存放的表格
;控制8个数码管依次显示“---- ---X”
DISPF: MOV A,@R1 ;查数字对应的实际段码值
MOVC A,@A+DPTR
MOV P0,A ;送段码
MOV P2,R0 ;选显示的位
DEC R0 ;修改位选,指向下一个数目管
INC R1 ;修改段选指针
LCALL DELAYDISP ;延时子程序
DJNZ R2,DISPF
MOV R0,#0F7H ;8位循环扫描一次完,重新置初值
MOV R1,#LEDVAL1
MOV R2,#08H
SJMP DISPF
;-----------------------------------------------------------------------
;子程序
;----------------------------------------------------------------------;
;函 数 名:DELAYFUNC
;功 能:延时子程序,其中一个嵌套的小循环约延时10ms,总的延时时间由大
; 循环决定为DELAYT× 05ms
;入 口:DELAYT
;出 口:无
;调用模块:无
;备 注:系统使用的晶振为11.0592MHz
; 使用了R5、R6和R7(第1组)
;----------------------------------------------------------------------;
DELAYFUNC: PUSH PSW ;暂存RS0和RS1的状态
SETB RS0 ;切换到寄存器组1
CLR RS1
MOV R5,DELAYT ;设置有多少个10ms的循环
DELAYLP0: MOV R6,#12H ;一个嵌套小循环,10ms
DELAYLP1: MOV R7,#0FFH
DELAYLP2: DJNZ R7,DELAYLP2
DJNZ R6,DELAYLP1
DJNZ R5,DELAYLP0
POP PSW ;切换回过去的寄存器组
RET
;----------------------------------------------------------------------;
;函 数 名:DELAYDISP
;功 能:延时子程序,供动态扫描延时用
;入 口:DELAYT
;出 口:无
;调用模块:无
;备 注:系统使用的晶振为11.0592MHz
; 使用了R5、R6和R7(第0组)
;----------------------------------------------------------------------;
DELAYDISP: MOV R5,#01H ;设置有多少个4ms的循环
DELAYSP0: MOV R6,#04H ;一个嵌套小循环4ms
DELAYSP1: MOV R7,#0F0H
DELAYSP2: DJNZ R7,DELAYSP2
DJNZ R6,DELAYSP1
DJNZ R5,DELAYSP0
RET
;-----------------------------------------------------------------------
;中断服务程序
;----------------------------------------------------------------------;
;函 数 名:KEYINT1
;功 能:外部中断1入口,查询输入按键的键值,并赋值给LED8的缓存
;入 口:INT1IN
;出 口:KEYVAL、LED8VAL
;调用模块:DELAYFUNC
;备 注:去键抖动的时间为15ms左右
; 使用了R5、R6和R7(第2组)
;----------------------------------------------------------------------;
KEYINT1: CLR EA ;关总中断
PUSH ACC
MOV DELAYT,#01H ;去键抖动,15ms左右
LCALL DELAYFUNC
JB INT1IN,INT1RET ;是键抖引起中断,则返回
MOV A,P2 ;读入P27、P26和P25状态,得到键值
SWAP A ;保存到KEYVAL
RR A
ANL A,#07H
MOV KEYVAL,A
MOV LEDVAL1,KEYVAL ;把按下的键值赋值给LEDVAL
INT1RET: POP ACC
SETB EA
RETI
;-----------------------------------------------------------------------
;表格
;-----------------------------------------------------------------------
;数码管显示表格
;-----------------------------------------------------------------------
;显示数据 0 1 2 3 4 5 6 7 8 9 P H -
DISPTAB: DB 9FH,06H,5BH,4FH,0C6H,0CDH,0DDH,07H,0DFH,0CFH,0D3H,0D6H,40H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -