Codigo:
Puerto = 0x93;
parte_baja=Puerto & 0x0F; /*resultado parte_baja 0x03 */
parte_alta=(Puerto >> 4) & 0x0F; /*resultado parte_alta 0x09 */
y si los unimos otra vez
Puerto = ((parte_alta << 4) & 0xF0) | parte_baja; /*resultado 0x93 */
Tambien se podria probar lo que comenta pendexgabo .
HOLA A TODOS:
he realizado un pequeño programa pero no realiza ninguna accion,



¿Alguien podria decirme que estoy haciendo mal?:
Codigo:
#include <16F84A.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000) // XTAL OSCILADOR EXTERNO
#byte porta=5 // DIRECION DE DE PORTA
#byte portb=6 // DIRECION DE DE PORTB
char a,b,c;
void main(void)
{
port_b_pullups(false);
set_tris_b(0b11111111); // puertob como entradas
set_tris_a(0b00000000); // puertoa como salidas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
while (true)
{
a=portb & 0xF0;
b=portb & 0x0F;
c=a-b;
porta=c;
}
}
GRACIAS A TODOS..
EXITOS..
HOLA A TODOS:
muchachos tienen razon...



lo realice con un 16f877 y con las resistencias pull-up de portb activadas,...mostrando el resultado el portc..y funciona pero el resultado de la resta no es binario.....
en realidad, lo que quiero es restar en un formato de 4 bits dos numeros de una cifra y que la resta de el resultado en un formato de 4 bits ya sea en bcd o en base 8 (octal)..ya sea para visualizar el numero en 4 leds o un display de 7 segmentos.....
¿como podria hacer que el resultado de la resta sea de 3 bits y uno para el signo si el resultado es negativo? ..
¿o transformar el resultado a codigo bcd?
he aqui el codigo:
Codigo:
#include <16F877A.h> // DISPOSITIVO A PROGRAMAR
/////////////////declaracion de variables y configuracion///////////////////////
#fuses HS,NOWDT,NOPROTECT // FUSIBLES DE CONFIGURACION
#use delay(clock=4000000) // XTAL OSCILADOR EXTERNO 4MHZ
#byte portc=7 // DIRECION DE DE PORTA
#byte portb=6 // DIRECION DE DE PORTB
signed char a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
{
port_b_pullups(true); // HABILITAMOS RESISTENCIAS PULL-UP //
set_tris_b(0b11111111); // puertob como entradas
set_tris_c(0b00000000); // puertoa como salidas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
while (true)
{
a=portb & 0b11110000; //parte alta de portb es el numero a de 4bits
b=portb & 0b00001111; // parte baja de portb es el numero b de 4bits
c=a-b; // resto parte alta y parte baja de portb
portc=c; // muestro el resultado en portc
}
}
GRACIAS A TODOS POR SU AYUDA
EXITOS!!!
HOLA A TODOS :
la resta es entre dos numeros de 4 bits, pero debo visualizar el resultado negativo tambien, intente lo que dices con abs() y no funcionó:
Codigo:
#include <16F877A.h> // DISPOSITIVO A PROGRAMAR
#include <stdlib.h>
/////////////////declaracion de variables y configuracion///////////////////////
#fuses HS,NOWDT,NOPROTECT // FUSIBLES DE CONFIGURACION
#use delay(clock=4000000) // XTAL OSCILADOR EXTERNO 4MHZ // DIRECION DE DE PORTC
#byte portb=6
#byte portc=7
#byte portd=8
signed int a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
{
port_b_pullups(true); // HABILITAMOS RESISTENCIAS PULL-UP //
set_tris_b(0b00001111); // 4pines de portb como entradas
set_tris_c(0b00000000); // portc todo salidas
set_tris_d(0b00001111); // 4pines de portd como entradas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
while (true)
{
a=portb; // a= valor de portb
b=portd; // b=valor de portd
c=a-b; // c= a la resta de ay b
if (c<0) // si c es negativo
portc=abs(c); // obtenga su val abs
else
portc=c; // si no es negativo muestre el num
}
}
deberia visualizarse el numero negativo como positivo ,en 4leds pero no lo hace....
GRACIAS
EXITOS...
Hola, mira, he estado simulando tu programa en el proteus y funciona perfectamente....no entiendo si es esto lo que tu realmente quieres.... si no es así, hazlo saber ....
Ahora mismo tu programa está bien, solo tienes que hacer unos pequeños cambios....
Codigo:
#include <16F877A.h> // DISPOSITIVO A PROGRAMAR
#include <stdlib.h>
/////////////////declaracion de variables y configuracion///////////////////////
#fuses HS,NOWDT,NOPROTECT // FUSIBLES DE CONFIGURACION
#use delay(clock=4000000) // XTAL OSCILADOR EXTERNO 4MHZ // DIRECION DE DE PORTC
#byte portb=6
#byte portc=7
#byte portd=8
signed int a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
{
//port_b_pullups(true); // HABILITAMOS RESISTENCIAS PULL-UP //
set_tris_b(0b00001111); // 4pines de portb como entradas
set_tris_c(0b00000000); // portc todo salidas
set_tris_d(0b00001111); // 4pines de portd como entradas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
while (true)
{
a=portb & 0x0F; // a= valor de portb
b=portd & 0x0F; // b=valor de portd
c=a-b; // c= a la resta de ay b
if (c<0) // si c es negativo
portc=abs(c);
//aqui podrias poner una asignacion a un pin libre
//para marcar el signo...
else
portc=c; // si no es negativo muestre el num
}
}
Ahora mismo este codigo hace una resta de la parte baja del puerto B con la parte baja del puerto d y lo representa en la parte baja del puerto C, lo único que te queda es hacer una asignación a un bit cualquiera de los que te sobren, para representar el signo.
Porque ahora mismo tanto si restas 9-6 ó 6-9 te representará el numero 3 (por poner un ejemplo de resta cualquiera).
Ayer lo lei mal y te pido disculpas por ello, yo pense que ibas a restar un numero del uno al 15 pero veo que solo quieres restar una cifra de un digito....se me fue la pelota....
pero mejor,así es más fácil...
Usas el proteus?, si quieres te envío la simulación..... para que lo compruebes..... (yo tengo la version 6.5)
Repito, si no es esto lo que quieres, o ves que todavia no te convence el programa, nos lo dices, a ver si podemos hacer algo...
Un saludo.