Sumador/restador 4 bits
El circuito suma o resta (según una entrada de selección) dos números de 4 bits y muestra el resultado en dos displays, para ello se utilizan dos microcontroladores, el primero lee los números, realiza la operación y da el resultado de 5 bits como salida. El segundo microcontrolador lee un dato de 5 bits y lo decodifica a los displays.
El circuito
(Colocado como adjunto).
El programa
Sumador
/**************************************************
* José Jorge Enríquez Rodríguez
**************************************************
* Sumador / restador.
* Suma o resta un par de datos de 4 bits.
* El resultado de la operación es de 5 bits.
**************************************************
* Entradas
* --------
* PTB7 a PTB4 - Dato A, MSB a LSB.
* PTB3 a PTB0 - Dato B, MSB a LSB.
* PTA2 - Cin, selector suma/resta.
*
* Salidas
* -------
* PTA5, PTA4, PTA3, PTA1, PTA0 - Resultado.
**************************************************
*/
#include <MC68HC908QY4.h> // Se definen los registros de I/O y sus direcciones.
#include <hidef.h> // Contiene instrucciones en ensamblador.
#include <startup.h>
/***************************
* Declaración de funciones
***************************/
void inicializacion( void );
void delay( int );
/* cin : Selector 0 - suma, 1 - resta.
* dato_a, dato_b: números de 4 bits a sumar/restar
* resultado: resultado de la operación.
*/
int cin, dato_a, dato_b, resultado;
/**********************
* Programa principal
**********************/
void main ( void ){
inicializacion();
while (1){
// El dato A es la parte alta (4 bits) del puerto B.
dato_a = ( PTB >> 4 );
// El dato B es la parte baja (4 bits) del puerto B.
dato_b = ( PTB & 0x0F );
// Selector suma/resta.
cin = PTA_PTA2;
// Si el selector es 0, suma; si no, resta.
if ( cin == 0 )
resultado = dato_a + dato_b;
else
resultado = dato_a - dato_b;
// Si el resultado es negativo, lo complementa a 2
// (Esto da un resultado correcto, aunque el signo no se indica
// y debe tomarse en cuenta al realizar la operación).
if ( resultado < 0 ) {
resultado = ( ~resultado ) + 1;
}
// El resultado (5 bits), se muestra en los pines
// 5, 4, 3, 1 y 0 del puerto A.
PTA_PTA5 = ( resultado & 0x10 ) >> 4;
PTA_PTA4 = ( resultado & 0x08 ) >> 3;
PTA_PTA3 = ( resultado & 0x04 ) >> 2;
PTA_PTA1 = ( resultado & 0x02 ) >> 1;
PTA_PTA0 = ( resultado & 0x01 );
delay( 10000 );
}
}
/* Configura el microcontrolador, puertos de entrada y salida.
*/
void inicializacion() {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Registro de ajuste de oscilador interno
PTBPUE = 0xFF; // Resistencias de pull-up para el puerto B (todos los pines).
PTAPUE = 0x04; // Resistencia de pull-up para el puerto A (solamente el pin PTA2).
DDRA = 0x3B; // Puerto A salidas (excepto el pin PTA2).
DDRB = 0x00; // Puerto B entradas
}
/* Retardo de n ciclos de reloj.
*/
void delay (int ciclos){
int cuenta;
for ( cuenta = 0; cuenta < ciclos; cuenta++ );
}
Decodificador
/**************************************************
* José Jorge Enríquez Rodríguez
**************************************************
* Decodificador 5 bits a dos displays de 7 segmentos.
* Recibe un dato binario de 5 bits y lo muestra en decimal
* en un par de displays de 7 segmentos (se usaron de cátodo común).
**************************************************
* Entradas
* --------
* PTA0 a PTA4 - Dato de 5 bits.
*
* Salidas
* -------
* PTA0 a PTA6 - Segmentos de los displays.
* PTB7 - Cátodo display decenas.
* PTA5 - Cátodo display unidades.
**************************************************
*/
#include <MC68HC908QY4.h> // Se definen los registros de I/O y sus direcciones.
#include <hidef.h> // Contiene instrucciones en ensamblador.
#include <startup.h>
// Patrones numéricos a mandar al display de 7 segmentos,
// dígitos del 0 al 9.
const unsigned char numeros[ 10 ] = {
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
/****************************
* Declaración de funciones.
****************************/
void inicializacion( void );
void delay( int );
// Dato binario a mostrar.
int dato;
/***********************
* Programa principal.
***********************/
void main( void ) {
// Auxiliares para separar el dato en dos dígitos:
// unidades y decenas.
int unidades, decenas;
inicializacion();
while( 1 ) {
// Leemos el dato en el puerto A (5 bits).
dato = PTA & 0x1f;
// Separa el número en dos dígitos.
decenas = dato / 10;
unidades = dato % 10;
// Habilita el primer display y envía el número
// correspondiente a las unidades.
PTB_PTB7 = 0;
PTA_PTA5 = 1;
PTB = numeros[ unidades ];
delay( 1000 );
// Habilita el segundo display en envía el número
// correspondiente a las decenas.
PTB_PTB7 = 1;
PTA_PTA5 = 0;
// Nota: se emplea una operación | 0x80 ya que el pin 7
// del puerto B también se utiliza para deshabilitar el
// display de unidades, por lo que se debe asegurar que
// esté en 1.
PTB = numeros[ decenas ] | 0x80;
delay( 1000 );
}
}
/* Configura el microcontrolador, puertos de entrada y salida.
*/
void inicializacion() {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Registro de ajuste de oscilador interno
DDRA = 0x20; // Pin 5 - salida, Pines 4 a 0 entradas
DDRB = 0xff; // Puerto B salidas
}
/* Retardo de n ciclos de reloj.
*/
void delay (int ciclos){
int cuenta;
for (cuenta=0; cuenta < ciclos; cuenta++);
}
Por cierto, ¿por qué quitaron GeSHi de las opciones para agregar temas?