1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| data segment mes db 'you can play a key on the keyboard!',0dh,0ah,24h data ends
code segment
assume cs:code,ds:data out1 proc near ;向外发送一个字节的子程序 out dx,al ;把al中的额数据送往dx push cx mov cx,40h gg: loop gg pop cx ret out1 endp
start: mov ax,data mov ds,ax mov dx,283h ;设置8253计数器0的工作方式 mov al,16h ;00010110 计数器0,只读/写低8位,模式3,二进制格式 out dx,al mov dx,280h mov al,52 ;给8253计数器0送初值 out dx,al mov dx,2b9h ;初始化8251A xor al,al mov cx,03 delay: call out1 loop delay mov al,40h ;向8251A控制端口发送40H,使其复位 01000000(IR位) call out1 mov al,4eh ;01001110 一个停止位,八个数据位,波特率因子16 call out1 mov al,27h ;00100111 接收允许,数据终端准备好,发送允许 call out1 1ds dx,offset ms1 ;显示提示信息 mov ah,09 int 21h waiti: mov dx,2b9h in al,dx ;读取8251A状态字 test al,01 ;测试是否准备好 jz waiti mov ah,01 ;准备好,则从键盘上读一个字符 int 21h cmp al,27 ;输入的是ESC则结束 jz exit mov dx,2b8h ;向8251A数据口发送数据 inc al out dx,al mov cx,40h s51: loop s51 ;延时 next: mov dx,2b9h in al,dx test al,02 ;检查接收是否准备好 jz next ;没有则继续循环等待 mov dx,2b8h ;准备好了则接收 in al,dx mov dl,al mov ah,02 ;将接收到的字符显示在屏幕上 int 21h jmp waiti exit: mov ah,4ch ;退出 int 21h code ends end start
|