La Web del Programador: Comunidad de Programadores
 
    Pregunta:  51165 - TECLADO CON SONIDO
Autor:  Nely PC
Alguien m puede ayudar para la solución de un programa en ensamblador que consiste en que en el momento de pulsar un tecla emita un sonido segun la letra seleccionada.

El sonido tiene que ser distinto para varias letras. Procurando que el sonido sea emitido por medio de bocinas externas y no las que tiene la maquina. Pero el ultimo punto puede ser omitido.

  Respuesta:  Anny Campos Cosme
Mira, yo no soy una experta en el tema y la verdad es que estoy aprendiendo porque soy estudiante de segundo año de informática pero con distintos valores de frecuencia puedes lograr distintos sonidos para las teclas. Solo tienes que detectar que tecla es la que está pulsada y según la tecla mandar a ejecutar el segmento de codigo que hace sonar la bocina con una frecuencia determinada por ti.
Aquí te pongo un ejercicio con su solución que te puede servir de guía y si lo modificas puedes lograr lo que quieres. De todos modos creo que tengo la solución para lo que quieres solo que no la encuentro. Escríbeme luego a ver si te la puedo dar.

salu2 yo

Realice un programa en ensamblador que al apretar cualquiera de las teclas del 1 al 5 la bocina suene un número de veces igual al digito que se apretó. Ej: Si se oprime el 3 que la bocina suene 3 veces (Primero durante tres segundos, después durante dos segundos, y finalmente durante un segundo) y a una frecuencia de 2000 Hz. Si aprieta una tecla que no está entre el 1 y el 5 debe mostrar un cartel indicándole al usuario que se equivocó y para salir apretar la n.

DOSSEG
.MODEL SMALL
.DATA
CARTEL DB 13,10,'Oprima una tecla del 1 al 5 para sonar la bocina, n para salir.',13,10,'$'
CARTEL1 DB 13,10,'No oprimi',162,' el d',161,'gito correcto.',13,10,'$'
NVECES DB 0
CONTEO DB 0
VIEJOIP1CH DW ?
VIEJOCS1CH DW ?
ENTRAR MACRO
MOV AH,1
INT 21H
ENDM
MOSTRAR MACRO VAR
PUSH AX
PUSH DX
MOV AH,9
LEA DX,VAR
INT 21H
POP DX
POP AX
ENDM
LEER MACRO VECTOR,VAR,VAR1
MOV AL,VECTOR
MOV AH,35H
INT 21H
MOV VAR,BX
MOV VAR1,ES
ENDM
ESCRIBIR MACRO VECTOR,SUB
MOV AL,VECTOR
MOV AH,25H
PUSH DS
MOV DX,OFFSET SUB
PUSH CS
POP DS;DS=CS
INT 21H
POP DS
ENDM
.CODE
SONAR PROC NEAR
MOV AX,@DATA
MOV DS,AX
LEER 1CH,VIEJOIP1CH,VIEJOCS1CH
ESCRIBIR 1CH,NUEVA1CH
VOLVER: MOSTRAR CARTEL
ENTRAR
CMP AL,'n'
JE SALIR
CMP AL,'N'
JE SALIR
SUB AL,30H
; A partir de aquí se comprueba que dígito se apretó, el registro BL comienza con valor 5
; y se ira comparando con AL y decrementando hasta llegar al valor 1.
CMP AL,1
JB ERROR
CMP AL,5
JBE SEGUIR
ERROR: MOSTRAR CARTEL1 ;Muestro este cartel si equivoca el dígito.
JMP VOLVER
;Sonar bocina y cargo la base de conteo correspondiente a la frecuencia 2000 Hz.
SEGUIR: MOV NVECES,AL ;Porque se usa AL posteriormente.
MOV AX,596
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
REPETIR: IN AL,61H ;Encender Bocina.
OR AL,00000011B
OUT 61H,AL
MOV AL,18 ;Multiplicando NVECES*18 obtengo los segundos que debo esperar.
MOV BL,NVECES
MUL BL
MOV CONTEO,AL
LAZO: CMP CONTEO,0 ;Lazo de espera por las conteo igual a NVECES*18 ITs,
JNE LAZO ;se decrementa CONTEO en la subrutina de IT.
IN AL,61H ;Apagar Bocina.
AND AL,11111100B
OUT 61H,AL
MOV CONTEO,18
LAZO1: CMP CONTEO,0 ;Lazo de espera para 1 segundo entre intervalos de sonido.
JNE LAZO1
DEC NVECES
JNZ REPETIR
JMP VOLVER
;Restaurar el vector viejo de la INT 1Ch.
SALIR: MOV DX,VIEJOIP1CH
MOV AX,VIEJOCS1CH
MOV DS,AX
MOV AH,25H
MOV AL,1CH
INT 21H
MOV AX,4C00H
INT 21H
SONAR ENDP
NUEVA1CH PROC FAR
MOV AX,@DATA ;Esta rutina la llama la IT 8 mediante INT 1Ch.
MOV DS,AX
DEC CONTEO
IRET
NUEVA1CH
ENDP
END