Se pueden distinguir dos tipos de interrupciones: interrupciones software e interrupciones hardware

Metodología de Programación, Programación en C, Aplicaciones electrónicas 1 / 10 INTERRUPCIONES Las interrupciones son un metodo del que disponen los dispositivos e incluso los procesos para hacer notar a la CPU la aparición de alguna circunstancia que requiera su intervención. De este modo, los dispositivos pueden provocar que la CPU deje por el momento la tarea que estaba realizando y atienda la interrupción. Una vez atendida, seguira con su labor anterior. Cuando no existían interrupciones, era el procesador el que tenía que estar continuamente comprobando el estado del dispositivo cuando lo necesitaba. Todo ese tiempo que el procesador estaba sondeando el estado de los dispositivos era tiempo que no se podía dedicar a otros procesos, con lo que significa esto en cuanto a rendimiento. Por todo ello se. pensó que lo mejor era que existiera una línea especial entre el procesador y los dispositivos, por la que los dispositivos indicaban al procesador que ya estaban listos. Cuando al procesador le llega una interrupción, la atiende inmediatamente dejando de hacer lo que estuviera haciendo. Para poder atenderla de la forma correcta, debe saber con anterioridad cómo tratarla. Por ello, las computadoras tienen en un sitio. conocido de memoria las distintas rutinas de tratamiento para las diferentes interrupciones. El procesador reconoce la interrupción de la que se trata y busca en memoria la rutina correspondiente. Una vez terminado el tratamiento de la interrupción, es muy importante que el procesador siga con lo que estaba haciendo. Por eso es muy importante que antes de tratar la interrupción se guarde de alguna forma el estado del computador, y al terminar la rutina de tratamiento se restaure el estado. Se pueden distinguir dos tipos de interrupciones: interrupciones software e interrupciones hardware. Interrupciones software Las interrupciones software son provocadas por los programas usando una función especial del lenguaje. Tienen como objetivo el que la CPU ejecute algún tipo de función. Al terminar de ejecutarse esta función, se seguirá ejecutando el programa que provocó la interrupción. Este tipo de interrupciones es la forma mas importante que tendrán los programas de ejecutar funciones especiales del DOS (Disk Operating System) o del BIOS (Basic Input Output System). Estas funciones tienen un número de interrupción software asociada. Cuando un programa lanza una interrupción de este tipo, la CPU ejecuta su función de tratamiento asociada. Por debemos saber que es lo que hace cada interrupción para conseguir el efecto deseado. Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 2 / 10 Las funciones que se ejecutan con cada interrupción software son un estandar en el mundo PC. En nuestro caso, algunas de las interrupciones que nos van a ser mas utiles seran: • Interrupción 14h: Acceso al puerto serie por la BIOS. • Interrupción 21h: Funciones del DOS. • Interrupción 17h: Servicios de acceso a la impresora de la BIOS. Cada interrupción tiene asociadas varias funciones. Para usar cada una de las funciones de la interrupción que nos interese se debe: - Escribir en un registro el numero de interrupción. - Escribir en otro registro en numero de función deseada. - Escribir en otro/s registro/s los parametros asociados con la función. - Lanzar la interrupción. El lenguaje C nos proporciona una serie de estructuras en la librería dos.h que nos permiten escribir en los registros de la CPU. Estas son: struct WORDREGS { unsigned int ax; unsigned int bx; unsigned int cx; unsigned int dx; unsigned int si; unsigned int di; unsigned int cflag; unsigned int flags; } struct BYTEREGS { unsigned char al; unsigned char ah; unsigned char bl; unsigned char bh; unsigned char cl; unsigned char ch; unsigned cha.r d1; unsigned cha.r dh; Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 3 / 10 union REGS { struct WORDREGS x; struct BYTEREGS h; } Los registros WORDREGS son registros de 16 bits. Los registros BYTEREGS son registros de 8 bits, que además coinciden con la parte alta y baja de los WORDREGS. Por ejemplo, escribir OxFF11 en el registro ax es 10 mismo que escribir en el registro ah OxFF y en el al Ox11. Una unión es un tipo de dato definible por el programador, como las estructuras, en la que se pueden almacenar datos de diferentes tipos en cada ocasión, es decir, en cada instante solo podra hacerse referencia a uno de los datos componentes de la unión. La palabra clave para definir y para declarar variables de tipo unión es union y, tanto las variables de tipo unión como sus miembros, o elementos, son tratados de igual forma que en el caso de las estructuras. Cuando se declara una variable de tipo unión, se asigna una porción de memoria que es compartida por variables diferentes en distintos momentos. Union Nombre_Union { tipo1 elemento1; tipo2 elemento2; tipo3 elemento3; ..... ....... } variables; donde Nombre_Union es el identificador del nuevo tipo de unión.La cantidad de memoria ocupada por una unión sera la ncccsaria para almacenar el miembro de la unión que mas memoria neccsite (en definitiva , el tipo de dato que más ocupe) Ejemplo: union talla{ int numero; char letra; char siglas[4]; }camisetas; // 42,46,50 // p, m, g // L, XL, XXL En la variable camisetas se puede almacenar la talla en cualquiera de los formatos mostrados en el ejemplo y, segun el que se haya elegido, así habrá de ser considerado tanto en las lecturas de la variable como en las escrituras, debiendo ser el programador quien se encargue de conocer , en todo momento, el modo en el que ha almacenado la talla. Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 4 / 10 Ese ejemplo se completaría si la variable camisetas perteneciese a un tipo de estructura de una base de datos de control de stocks de un almacen o tienda de confección. Las uniones son, en todo, similares a las estructuras, con la salvedad de que en cada instante solo uno de los elementos puede estar presente, debe ser el propio programa el que decida el tipo de dato que hay en cada momento. Igual que en las estructuras, el acceso a los elementos de una unión se realiza tambien con el operador punto «.», Por ejemplo, con la unión declarada anteriormente, cualquiera de las siguientes lineas sera valida para almacenar un valor en las posiciones de memoria asignadas a la variable camisetas: scanf("%d", &camisetas.numero); camisetas.letra = getchar() ; gets(camisetas.siglas); Retomando la composición e implementacion de los diferentes registros del procesador, para escribir un dato en la union de los registros (REGS) : Ejemplo: Escribir en el registro ax el valor OxFF11. Solución: Definimos una variable de tipo union REGS union REGS registros; Y escribimos en ella: registros.x.ax=0xFF11; Para lanzar la interrupción, usaremos la función de la librería dos.h int86, que se define en Turbo C como: int int86 (int numero_interrupcion, union REGS *registros_entrada, union REGS *registros_salida); Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 5 / 10 MANEJO DEL RATON Uno de los dispositivos mas utiles y populares del PC es el ratón. Los ratones Ilevan existiendo mucho tiempo, pero su popularidad masiva surgió a partir del uso de entornos gráficos tipo Windows, cuyo manejo requiere el uso de un ratón. La posición que ocupa el ratón en la pantalla se define siempre en coordenadas graficas, aunque se este trabajando en modo texto, considerando tantos puntos en la pantalla como permita la tarjeta grafica (actualmente, en VGA la resolución de la pantalla suele ser de 640 x 480 pixels). La interrupción 33 h Como ocurre casi siempre que se quiere acceder directamente al hardware, la forma mas cómoda de hacerlo es usar las funciones que nos proporcionan las interrupciones software. En este caso, la interrupción que se encarga de controlar el ratón es la numero 33h. Esta interrupción nos proporciona nada menos que 53 funciones distintas, que seleccionaremos poniendo su numero en el registro ax. Si la función requiriera parametros extra, usaríamos otros registros del procesador.De entre todas las funciones que se nos ofrecen, usaremos las siguientes: Función 00h Tarea Reset del ratón Llamada ax=0 01h Mostrar el cursor del ratón Apagar el cursor del ratón Leer el estado de los botones y la posición del cursor ax=1 Retorno ax>0 si hay raton ax=0 si no hay ...... ax=2 ...... ax=3 bx=0 si no pulso boton bx=1 boton Izqdo bx=2 boton Dcho bx=4 boton Centro cx=posición columna (H) dx=posición fila (V) 04h Establecer la posición del cursor 07h Rango desplaz Horiz. 08h Rango desplaz Vert. ax=4 cx= columna dx= fila ax=7 cx=H minima dx=H máxima ax=8 cx=V minima dx=V máxima 02h 03h Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 6 / 10 Antes de pasar a mostrar cómo trabajar con estas funciones, es importante destacar que la zona sobre la que trabaja el ratón no coincide con la pantalla real. EI ratón se mueve sobre una pantalla virtual, que depende del modo de vídeo en el que se este trabajando, es decir, de la resolución. En las funciones basicas de manejo de1 ratón, referidas a pantalla de texto se hace necesario traducir estas coordenadas virtuales a coordenadas de texto. Esto se consigue dividiendo entre ocho las coordenadas graficas, pues cada caracter ocupa ocho pixels de pantalla, labor que realizaremos antes de llamar a las funciones. Reset del ratón: función 00h Lo primero que debe hacer cualquier programa antes de usar el ratón es prepararlo reinicializarlo o resetearlo. Con esto conseguimos dejar al ratón en el centro de la pantalla con el cursor apagado. Para seleccionar esa función, ponemos su numero en el registro ax y lanzamos la interrupción 33h. Como resultado de la operación, la función nos devuelve el estado del ratón, es decir, si hay o no ratón instalado. Ese resu1tado lo deja de nuevo en el registro ax. Un -1 en dicho registro nos indica que no hay ratón instalado. Ejemplo: /* Reinicializar el ratón. Devuelve -1 si no hay ratón instalado * / int ResetRaton (void) { union REGS registros; registros.x.ax = 0; /* elegimos la función correspondiente * / int86 (0x33, ®istros, ®istros); if ((int) registros.x.ax = = -1) {printf ( " No hay un ratón instalado” ); return -1 ; } return 1; } Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 7 / 10 Mostrar y ocultar el ratón: funciones 01h y 02h Como ya hemos dicho, al reinicializar el ratón, su cursor queda en el centro de la pantalla y apagado, es decir, aunque esta ahí, no podemos verlo. La forma de hacerlo visible es usar la función 01h. Esta función no tiene valores de retorno. Ejemplo: /* Mostrar el cursor del ratón */ void MostrarCursor (void) { union REGS registros; registros.x.ax = 1; int86 (0x33, ®istros, ®istros); } /* Apagar el cursor del ratón * / void ApagarCursor (void) { union REGS registros; registros.x.ax = 2; int86 (0x33, ®istros, ®istros); } Leer el estado de los botones y la posición del cursor, función 03h La función 03h nos permite conocer el estado de los botones del ratón, información que almacena en el registro bx de la siguiente forma: Bit 1: Botón derecho ( 1 = presionado ). Bit 0: Botón izquierdo ( 1 = presionado ). Ademas, esta función deja en el registro cx la coordenada X registro dx la coordenada Y. Técnicas de Programación y en el 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 8 / 10 Ejemplo: /* Botón derecho del ratón presionado * / int BotonDerecho (void) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); return (registros.x.bx & 2); /* Devuelve 1 si esta presionado */ /* Botón izquierdo del ratón presionado * / int BotonIzquierdo (void) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); return (registros.x.bx & 1); /* Devolver la posición del ratón * / int PosicionRraton (int *x, int *y) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); *x = registros.x.cx; *y = registros.x.dx; } Establecer la posición del ratón: función 04h Para colocar el cursor del ratón en una posición determinada, contamos con la función 04h. A esta función se le debe pasar la coordenada horizontal en el registro cx, y la vertical en el dx. Cuando se trabaja en modo texto hay que tener en cuenta, que las coordenadas hay que multiplicarlas por 8 antes de pasarlas a la función. Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 9 / 10 Ejemplo: /* Colocar el ratón en la posición deseada * / void ColocarRaton (int x, int y) { union REGS registros; registros.x.ax = 4; registros.x.cx = x; registros.x.dx = y; int86 (0x33, ®istros, ®istros); } Ratón en Modo Gráfico Recordemos que la posición que ocupa el ratón en la pantalla se define siempre en coordenadas graficas, aunque se este trabajando en modo texto, considerando tantos puntos en la pantalla como permita la tarjeta grafica (actualmente, en VGA la resolución de la pantalla suele ser de 640x480 pixels). El desplazamiento del cursor se realiza mediante una unidad de movimiento del ratón que recibe el nombre de mickey y equivale a 1/200 pulgadas. Cuando se mueve el ratón, el controlador del ratón ( el programa driver) mueve el cursor horizontal y verticalmente un numero de pixels que depende de la sensibilidad del ratón. Por defecto, cuando se instala el controlador del ratón, para conseguir un desplazamiento de 8 pixels se precisan 8 mickeys en horizontal y 16 en vertical. EI control del ratón se realizaba mediante la interrupción int 0x33. A continuación se muestra, como ejemplo, un programa que activa el ratón y muestra las coordenadas del cursor : #include #include #include #include #include void main() { union REGS estado ; int driver = DETECT, mode; /* para seleccionar el modo grafico */ clrscr() ; Técnicas de Programación 3ª Parte: Programación de interrupciones y del Ratón Metodología de Programación, Programación en C, Aplicaciones electrónicas 10 / 10 //Inicializa el modo grafico en la pantalla. initgraph(&driver, &mode, "C:\\TC\\BGI") ; // Ruta de los drivers graficos // Mira si hay ratóninstalado estado.x.ax = 0; int86 (0x33, &estado, &estado) ; if ( !estado.x.ax) printf ("\n ERROR: no hay ratón.") ; exit (1) ; //si ax=0 → no hay raton estado.x.ax = 1; /* Muestra el ratón */ int86 (0x33, &estado, &estado) ; printf("Coordenadas del ratón: "); printf("\npulsa tecla para terminar ") ; while (!kbhit()) { gotoxy(24,1)

2 downloads 162 Views 24KB Size

Recommend Stories


INTERRUPCIONES VOLUNTARIAS
OSASUN SAILA DEPARTAMENTO DE SANIDAD Osasun Sailburuordetza Osasun Plangintza eta Antolamenduko Zuzendaritza Viceconsejería de Sanidad Dirección de

Faltas, interrupciones y sustituciones en voleibol
Deporte de equipo. Balonvolea. Reglamento. Reglas del juego

Controlador de Interrupciones (Versión programable) Manual de Usuario
Facultad de Ingeniería – Universidad de la República Controlador de Interrupciones (Versión programable) Manual de Usuario Índice de contenido 1. Ca

Interrupciones. Temporizadores y Contadores de eventos en microcontroladores
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO312 Laboratorio de Estructuras de Computadores Interrupciones. Temporizadores

Comunicaciones rurales en Cuba utilizando Redes Tolerantes al Retraso e Interrupciones
Comunicaciones rurales en Cuba utilizando Redes Tolerantes al Retraso e Interrupciones L. Romero1, A. Subert2 1 2 Universidad de Oriente, Departament

Interrupciones con el periférico EXTI en los microcontroladores STM32F4 de la arquitectura ARM Cortex-M
Interrupciones con el periférico EXTI en los microcontroladores STM32F4 de la arquitectura ARM Cortex-M Apellidos, nombre Departamento Centro Perles Ivars, Àngel ([email protected]) Informática de Sistemas y Computadores Escuela Técnica Superior

Story Transcript

Metodología de Programación, Programación en C, Aplicaciones electrónicas 1 / 10

INTERRUPCIONES Las interrupciones son un metodo del que disponen los dispositivos e incluso los procesos para hacer notar a la CPU la aparición de alguna circunstancia que requiera su intervención. De este modo, los dispositivos pueden provocar que la CPU deje por el momento la tarea que estaba realizando y atienda la interrupción. Una vez atendida, seguira con su labor anterior. Cuando no existían interrupciones, era el procesador el que tenía que estar continuamente comprobando el estado del dispositivo cuando lo necesitaba. Todo ese tiempo que el procesador estaba sondeando el estado de los dispositivos era tiempo que no se podía dedicar a otros procesos, con lo que significa esto en cuanto a rendimiento. Por todo ello se. pensó que lo mejor era que existiera una línea especial entre el procesador y los dispositivos, por la que los dispositivos indicaban al procesador que ya estaban listos. Cuando al procesador le llega una interrupción, la atiende inmediatamente dejando de hacer lo que estuviera haciendo. Para poder atenderla de la forma correcta, debe saber con anterioridad cómo tratarla. Por ello, las computadoras tienen en un sitio. conocido de memoria las distintas rutinas de tratamiento para las diferentes interrupciones. El procesador reconoce la interrupción de la que se trata y busca en memoria la rutina correspondiente. Una vez terminado el tratamiento de la interrupción, es muy importante que el procesador siga con lo que estaba haciendo. Por eso es muy importante que antes de tratar la interrupción se guarde de alguna forma el estado del computador, y al terminar la rutina de tratamiento se restaure el estado. Se pueden distinguir dos tipos de interrupciones: interrupciones software e interrupciones hardware. Interrupciones software Las interrupciones software son provocadas por los programas usando una función especial del lenguaje. Tienen como objetivo el que la CPU ejecute algún tipo de función. Al terminar de ejecutarse esta función, se seguirá ejecutando el programa que provocó la interrupción. Este tipo de interrupciones es la forma mas importante que tendrán los programas de ejecutar funciones especiales del DOS (Disk Operating System) o del BIOS (Basic Input Output System). Estas funciones tienen un número de interrupción software asociada. Cuando un programa lanza una interrupción de este tipo, la CPU ejecuta su función de tratamiento asociada. Por debemos saber que es lo que hace cada interrupción para conseguir el efecto deseado.

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 2 / 10

Las funciones que se ejecutan con cada interrupción software son un estandar en el mundo PC. En nuestro caso, algunas de las interrupciones que nos van a ser mas utiles seran: • Interrupción 14h: Acceso al puerto serie por la BIOS. • Interrupción 21h: Funciones del DOS. • Interrupción 17h: Servicios de acceso a la impresora de la BIOS.

Cada interrupción tiene asociadas varias funciones. Para usar cada una de las funciones de la interrupción que nos interese se debe: - Escribir en un registro el numero de interrupción. - Escribir en otro registro en numero de función deseada. - Escribir en otro/s registro/s los parametros asociados con la función. - Lanzar la interrupción.

El lenguaje C nos proporciona una serie de estructuras en la librería dos.h que nos permiten escribir en los registros de la CPU. Estas son: struct WORDREGS { unsigned int ax; unsigned int bx; unsigned int cx; unsigned int dx; unsigned int si; unsigned int di; unsigned int cflag; unsigned int flags; } struct BYTEREGS { unsigned char al; unsigned char ah; unsigned char bl; unsigned char bh; unsigned char cl; unsigned char ch; unsigned cha.r d1; unsigned cha.r dh;

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 3 / 10

union REGS { struct WORDREGS x; struct BYTEREGS h; } Los registros WORDREGS son registros de 16 bits. Los registros BYTEREGS son registros de 8 bits, que además coinciden con la parte alta y baja de los WORDREGS. Por ejemplo, escribir OxFF11 en el registro ax es 10 mismo que escribir en el registro ah OxFF y en el al Ox11. Una unión es un tipo de dato definible por el programador, como las estructuras, en la que se pueden almacenar datos de diferentes tipos en cada ocasión, es decir, en cada instante solo podra hacerse referencia a uno de los datos componentes de la unión. La palabra clave para definir y para declarar variables de tipo unión es union y, tanto las variables de tipo unión como sus miembros, o elementos, son tratados de igual forma que en el caso de las estructuras. Cuando se declara una variable de tipo unión, se asigna una porción de memoria que es compartida por variables diferentes en distintos momentos. Union Nombre_Union { tipo1 elemento1; tipo2 elemento2; tipo3 elemento3; ..... ....... } variables; donde Nombre_Union es el identificador del nuevo tipo de unión.La cantidad de memoria ocupada por una unión sera la ncccsaria para almacenar el miembro de la unión que mas memoria neccsite (en definitiva , el tipo de dato que más ocupe) Ejemplo: union talla{ int numero; char letra; char siglas[4]; }camisetas;

// 42,46,50 // p, m, g // L, XL, XXL

En la variable camisetas se puede almacenar la talla en cualquiera de los formatos mostrados en el ejemplo y, segun el que se haya elegido, así habrá de ser considerado tanto en las lecturas de la variable como en las escrituras, debiendo ser el programador quien se encargue de conocer , en todo momento, el modo en el que ha almacenado la talla. Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 4 / 10

Ese ejemplo se completaría si la variable camisetas perteneciese a un tipo de estructura de una base de datos de control de stocks de un almacen o tienda de confección. Las uniones son, en todo, similares a las estructuras, con la salvedad de que en cada instante solo uno de los elementos puede estar presente, debe ser el propio programa el que decida el tipo de dato que hay en cada momento. Igual que en las estructuras, el acceso a los elementos de una unión se realiza tambien con el operador punto «.», Por ejemplo, con la unión declarada anteriormente, cualquiera de las siguientes lineas sera valida para almacenar un valor en las posiciones de memoria asignadas a la variable camisetas: scanf("%d", &camisetas.numero); camisetas.letra = getchar() ; gets(camisetas.siglas);

Retomando la composición e implementacion de los diferentes registros del procesador, para escribir un dato en la union de los registros (REGS) : Ejemplo: Escribir en el registro ax el valor OxFF11. Solución: Definimos una variable de tipo union REGS union REGS registros; Y escribimos en ella: registros.x.ax=0xFF11;

Para lanzar la interrupción, usaremos la función de la librería dos.h int86, que se define en Turbo C como: int int86 (int numero_interrupcion, union REGS *registros_entrada, union REGS *registros_salida);

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 5 / 10

MANEJO DEL RATON Uno de los dispositivos mas utiles y populares del PC es el ratón. Los ratones Ilevan existiendo mucho tiempo, pero su popularidad masiva surgió a partir del uso de entornos gráficos tipo Windows, cuyo manejo requiere el uso de un ratón. La posición que ocupa el ratón en la pantalla se define siempre en coordenadas graficas, aunque se este trabajando en modo texto, considerando tantos puntos en la pantalla como permita la tarjeta grafica (actualmente, en VGA la resolución de la pantalla suele ser de 640 x 480 pixels). La interrupción 33 h Como ocurre casi siempre que se quiere acceder directamente al hardware, la forma mas cómoda de hacerlo es usar las funciones que nos proporcionan las interrupciones software. En este caso, la interrupción que se encarga de controlar el ratón es la numero 33h. Esta interrupción nos proporciona nada menos que 53 funciones distintas, que seleccionaremos poniendo su numero en el registro ax. Si la función requiriera parametros extra, usaríamos otros registros del procesador.De entre todas las funciones que se nos ofrecen, usaremos las siguientes: Función 00h

Tarea Reset del ratón

Llamada ax=0

01h

Mostrar el cursor del ratón Apagar el cursor del ratón Leer el estado de los botones y la posición del cursor

ax=1

Retorno ax>0 si hay raton ax=0 si no hay ......

ax=2

......

ax=3

bx=0 si no pulso boton bx=1 boton Izqdo bx=2 boton Dcho bx=4 boton Centro cx=posición columna (H) dx=posición fila (V)

04h

Establecer la posición del cursor

07h

Rango desplaz Horiz.

08h

Rango desplaz Vert.

ax=4 cx= columna dx= fila ax=7 cx=H minima dx=H máxima ax=8 cx=V minima dx=V máxima

02h 03h

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 6 / 10

Antes de pasar a mostrar cómo trabajar con estas funciones, es importante destacar que la zona sobre la que trabaja el ratón no coincide con la pantalla real. EI ratón se mueve sobre una pantalla virtual, que depende del modo de vídeo en el que se este trabajando, es decir, de la resolución. En las funciones basicas de manejo de1 ratón, referidas a pantalla de texto se hace necesario traducir estas coordenadas virtuales a coordenadas de texto. Esto se consigue dividiendo entre ocho las coordenadas graficas, pues cada caracter ocupa ocho pixels de pantalla, labor que realizaremos antes de llamar a las funciones.

Reset del ratón: función 00h Lo primero que debe hacer cualquier programa antes de usar el ratón es prepararlo reinicializarlo o resetearlo. Con esto conseguimos dejar al ratón en el centro de la pantalla con el cursor apagado. Para seleccionar esa función, ponemos su numero en el registro ax y lanzamos la interrupción 33h. Como resultado de la operación, la función nos devuelve el estado del ratón, es decir, si hay o no ratón instalado. Ese resu1tado lo deja de nuevo en el registro ax. Un -1 en dicho registro nos indica que no hay ratón instalado. Ejemplo: /* Reinicializar el ratón. Devuelve -1 si no hay ratón instalado * / int ResetRaton (void) { union REGS registros; registros.x.ax = 0; /* elegimos la función correspondiente * / int86 (0x33, ®istros, ®istros); if ((int) registros.x.ax = = -1) {printf ( " No hay un ratón instalado” ); return -1 ; } return 1; }

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 7 / 10

Mostrar y ocultar el ratón: funciones 01h y 02h Como ya hemos dicho, al reinicializar el ratón, su cursor queda en el centro de la pantalla y apagado, es decir, aunque esta ahí, no podemos verlo. La forma de hacerlo visible es usar la función 01h. Esta función no tiene valores de retorno. Ejemplo: /* Mostrar el cursor del ratón */ void MostrarCursor (void) { union REGS registros; registros.x.ax = 1; int86 (0x33, ®istros, ®istros); }

/* Apagar el cursor del ratón * / void ApagarCursor (void) { union REGS registros; registros.x.ax = 2; int86 (0x33, ®istros, ®istros); }

Leer el estado de los botones y la posición del cursor, función 03h La función 03h nos permite conocer el estado de los botones del ratón, información que almacena en el registro bx de la siguiente forma: Bit 1: Botón derecho ( 1 = presionado ). Bit 0: Botón izquierdo ( 1 = presionado ). Ademas, esta función deja en el registro cx la coordenada X registro dx la coordenada Y.

Técnicas de Programación

y en el

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 8 / 10

Ejemplo:

/* Botón derecho del ratón presionado * / int BotonDerecho (void) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); return (registros.x.bx & 2);

/* Devuelve 1 si esta presionado */

/* Botón izquierdo del ratón presionado * / int BotonIzquierdo (void) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); return (registros.x.bx & 1);

/* Devolver la posición del ratón * / int PosicionRraton (int *x, int *y) { union REGS registros; registros.x.ax = 3; int86 (0x33, ®istros, ®istros); *x = registros.x.cx; *y = registros.x.dx; }

Establecer la posición del ratón: función 04h Para colocar el cursor del ratón en una posición determinada, contamos con la función 04h. A esta función se le debe pasar la coordenada horizontal en el registro cx, y la vertical en el dx. Cuando se trabaja en modo texto hay que tener en cuenta, que las coordenadas hay que multiplicarlas por 8 antes de pasarlas a la función.

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas 9 / 10

Ejemplo:

/* Colocar el ratón en la posición deseada * / void ColocarRaton (int x, int y) { union REGS registros; registros.x.ax = 4; registros.x.cx = x; registros.x.dx = y; int86 (0x33, ®istros, ®istros); }

Ratón en Modo Gráfico Recordemos que la posición que ocupa el ratón en la pantalla se define siempre en coordenadas graficas, aunque se este trabajando en modo texto, considerando tantos puntos en la pantalla como permita la tarjeta grafica (actualmente, en VGA la resolución de la pantalla suele ser de 640x480 pixels). El desplazamiento del cursor se realiza mediante una unidad de movimiento del ratón que recibe el nombre de mickey y equivale a 1/200 pulgadas. Cuando se mueve el ratón, el controlador del ratón ( el programa driver) mueve el cursor horizontal y verticalmente un numero de pixels que depende de la sensibilidad del ratón. Por defecto, cuando se instala el controlador del ratón, para conseguir un desplazamiento de 8 pixels se precisan 8 mickeys en horizontal y 16 en vertical. EI control del ratón se realizaba mediante la interrupción int 0x33. A continuación se muestra, como ejemplo, un programa que activa el ratón y muestra las coordenadas del cursor : #include #include #include #include #include void main() { union REGS estado ; int driver = DETECT, mode; /* para seleccionar el modo grafico */ clrscr() ;

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Metodología de Programación, Programación en C, Aplicaciones electrónicas

10 / 10

//Inicializa el modo grafico en la pantalla. initgraph(&driver, &mode, "C:\\TC\\BGI") ; // Ruta de los drivers graficos // Mira si hay ratóninstalado estado.x.ax = 0; int86 (0x33, &estado, &estado) ; if ( !estado.x.ax) printf ("\n ERROR: no hay ratón.") ; exit (1) ;

//si ax=0 → no hay raton

estado.x.ax = 1; /* Muestra el ratón */ int86 (0x33, &estado, &estado) ; printf("Coordenadas del ratón: "); printf("\npulsa tecla para terminar ") ; while (!kbhit()) { gotoxy(24,1) ; estado.x.ax = 3; /* Obtiene las coordenadas del ratón */ int86 (0x33, &estado, &estado) ; printf ("%3d,%3d\n" , estado.x.cx, estado.x.dx) ; } closegraph() ; /* cierra el modo grafico */ estado.x.ax = 2; /* Quita el cursor del ratón */ int86 (0x33, &estado, &estado) ; }

Técnicas de Programación

3ª Parte: Programación de interrupciones y del Ratón

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.