⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 键盘输入中断.txt

📁 一个可以实现的键盘输入中断
💻 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 + -