//Por el Puerto B se obtinene el dato de las cinco lineas
//del Puerto A, al que esta conectado a un array de interruptores,
//sumandole el valor de una constante, por ejemplo 74 decimal.
//Es decir PORTC = PORTA +74
[/font]#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOLVP
#use delay (clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA = 5
#byte PORTC = 7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=PORTA+74;
delay_us(100);
}
}
//Por el Puerto C se obtiene el dato del Puerto A
//multiplicado por 2.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=PORTA*2;
delay_us(100);
}
}
//Por el Puerto C se obtiene el dato introducido
//por el Puerto A, pero los bits pares de la salida se fijan siempre en 1.
//El orden de los
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=PORTA|0b01010101;
delay_ms(1);
}
}
habría que ver que tipo de código assembler genera cada forma como para saber cual es más eficiente.
//Por el Puerto B se obtiene el contenido del Puerto A
//pero los bits impares de la salida se fijan a 0.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=PORTA&0x15;
delay_ms(1);
}
}
//Por el Puerto B se obtiene el dato del Puerto A
//invertidos los unos y los ceros.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
while(true)
{
PORTC = ~PORTA;
delay_ms(1);
}
}
//Por el Puerto C se obtiene el dato del puerto A
//intercambiando los nibbles alto y bajo.
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
int dato;
while(true)
{
dato=PORTA;
#asm
swapf dato,1 //ayuda aki!!!! :5] :5] :5]
#endasm
PORTC=dato;
delay_ms(1);
}
}
Creo que debería de funcionar:Código: C
#define SwapByte(a) {#asm swapf a,1 #endasm}
Saludos!
//Por el Puerto B se obtiene el dato del Puerto A
//desplazando un bit hacia la derecha, por la izquierda
//entrara un 1.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
#byte STATUS=3
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=(PORTA<<1)+1;
delay_ms(1);
}
}
//Por el Puerto B se obtiene el dato del Puerto A
//desplazando un bit hacia la derecha, por la izquierda
//entrara un 0.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
PORTC=PORTA>>1;
delay_ms(1);
}
}
//Por el Puerto C se obtiene el dato del Puerto A
//invirtiendo los bit pares. Los impares se dejan como en la entrada.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
int impares;
int pares;
while(true)
{
impares=PORTA&0b10101010; //me quedo con los impares
pares=(~PORTA)&0b01010101; //Complemento
PORTC=pares | impares; //los muestro
delay_ms(1);
}
}
//El Puerto C,que acuta como salida es controlado
//por el bit 0 del Puerto A,que actua como entrada
//De tal manera que:
//Si el bit 0 del PORTA = 1, se encienden todos los leds.
//Sie el bit 0 del PORTA = 0, solo se encienden los leds del nible alto.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
output_c(0x00);
while(true)
{
delay_ms(1);
output_c(0xF0);
if(input(pin_A0)==1)
output_c(0xFF);
}
}
//Compara el dato del puerto de entrada PORTA con un numero
//por ejm 13. Puede darse dos posibilidades:
//Si PORTA = numero, se encienden todos los leds.
//Si PORTA diferente al numero se encienden los leds pares.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7
void main()
{
set_tris_a(0x3F);
set_tris_c(0x00);
PORTC=0x00;
while(true)
{
if(PORTA==0x0D) PORTC=0xFF;
else PORTC=0b01010101;
}
}
Es igual de eficiente, mira cómo lo compila:
.................... byte dato;
....................
.................... swap(dato);
012E: BCF 03.6
012F: SWAPF 27,F