#include <18f252.h>:mrgreen:
#fuses XT, nowdt
#use delay(clock= 4000000)
#use RS232(baud= 9600, xmit= pin_b0, rcv= pin_b1)
#define data(n) (output_bit(pin_c0, bit_test(n, 0)),output_bit(pin_c1, bit_test(n, 1)),output_bit(pin_c2, bit_test(n, 2)))
void main()
{
int i;
output_c(0xef);
delay_ms(1000);
for(i=0; i< 16; i++)
{
data(i);
delay_ms(500);
}
while(true);
}
struct MyPort
{
unsigned pepito:2;
unsigned jaimito:3;
unsigned bits_del_puerto:3;
};
struct MyPort a;
a.jaimito = 7; //Esto no me modifica el puerto,
a.pepito = 0; // Esto tampoco
a.bits_del_puerto = 4; // Esto six = PORTx & 7;Pero lo que entendio primero Killer también se puede hacer, pero por ser zonas diferentes de memoria yo lo haría agregando el puntero al puerto a la estrutura de la siguiente manera.
struct Digitos
{
unsigned HIGH:5;
unsigned dig3:1;
unsigned dig2:1;
unsigned dig1:1;
};
struct Digitos *pDigitos = (struct Digitos *) &(PORTD); // se inicializa el puntero con la direccion del puerto D
void main() {
TRISB=0xFF;
TRISD=0x00;
PORTD = 0x00;
ADCON1 = 0x0F;
do {
pDigitos->dig1 = 1;
pDigitos->dig2 = 0;
pDigitos->dig3 = 1;
Delay10KTCYx(250); // delay
pDigitos->dig1 = 0;
pDigitos->dig2 = 1;
pDigitos->dig3 = 0;
Delay10KTCYx(250); // delay
} while(1);
}
LATAbits.LATA0=1; // bit 0
LATAbits.LATA1=0; // bit 1
LATAbits.LATA2=1; // bit 2
Lo puedes hacer asi:Citar#include <18f252.h>:mrgreen:
#fuses XT, nowdt
#use delay(clock= 4000000)
#use RS232(baud= 9600, xmit= pin_b0, rcv= pin_b1)
#define data(n) (output_bit(pin_c0, bit_test(n, 0)),output_bit(pin_c1, bit_test(n, 1)),output_bit(pin_c2, bit_test(n, 2)))
void main()
{
int i;
output_c(0xef);
delay_ms(1000);
for(i=0; i< 16; i++)
{
data(i);
delay_ms(500);
}
while(true);
}
Saludos
//Selecciona el Display de 7Segmentos activo e imprime el digito.
//_numero a imprimir, _power = 1 display on
Void _Display(Int16 _numero, int1 _power) {
#define data(n) (output_bit(pin_A0, bit_test(n, 0)),output_bit(pin_A1, bit_test(n, 1)),output_bit(pin_A2, bit_test(n, 2)))
Static Int8 n = 0;
Int8 i = 1;
Int8 _digito = 0;
If (_numero > 999) _numero = 999; //Acota superior el numero
//Descompone en digitos para numero >= 100
If (_numero >= 100) {
If (n == 2) _digito = _numero / 100;
else If (n == 1) _digito = ((_numero / 10) % 10);
else If (n == 0) _digito = _numero % 10;
}
else If (_numero >= 10) { //Descompone en digitos para numero >= 10
If (n == 1) _digito = _numero / 10;
else If (n == 0) _digito = _numero % 10;
}
else If (n == 0) _digito = _numero; //Extrae el digito para numero < 10
If (n == 1) PORTB = _get7seg1(_digito); //Asigna la mascara del digito con punto decimal
else PORTB = _get7seg(_digito); //Asigna la mascara del digito sin punto decimal
If (_power == 0) i = 0; //Apaga el display
data(i << n);
//PORTA = (PORTA & 0b11111000) | (i << n); //Selecciona el digito a iluminar.
if (n < 2) n++; //Proximo digito a iluminar (digitos 0 to 2)
else n = 0; //Reinicia el ciclo de refresco
}
ya veo que todos comprendimos cosas diferentes. Pero lo que entendio primero Killer también se puede hacer, pero por ser zonas diferentes de memoria yo lo haría agregando el puntero al puerto a la estrutura de la siguiente manera.Código: C
struct MyPort { unsigned HIGH:5; unsigned LOW:3; }; struct Registro { unsigned char pepito; unsigned char jaimito; struct MyPort *pMyPortD; // puntero del tipo estructura MyPort }RegA; //Se crea la instancia de la estructura Registro void main() { TRISB=0xFF; TRISD=0x00; PORTD = 0x00; ADCON1 = 0x0F; RegA.pMyPortD = (struct MyPort *) &(PORTD); // se inicializa el puntero con la direccion del puerto D do { RegA.pepito = 'a'; RegA.jaimito = 'b'; RegA.pMyPortD->HIGH = 0x0; // Turn OFF LEDs on PORTD RegA.pMyPortD->LOW = 0xFF; // Turn ON LEDs on PORTD Delay10KTCYx(250); // delay RegA.pepito = 'c'; RegA.jaimito = 'd'; RegA.pMyPortD->HIGH = 0xFF; // Turn ON LEDs on PORTD RegA.pMyPortD->LOW = 0x0; // Turn OFF LEDs on PORTD Delay10KTCYx(250); // delay } while(1); }
PD: Observen que a pesar de que se asigna 0xFF intencionalmente a los bits, solo toma los que se definieron en la estructura.
//Selecciona el Display de 7Segmentos activo e imprime el digito.
//_numero a imprimir, _power = 1 display on
Void _Display(Int16 _numero, int1 _power) {
struct MyPort {
unsigned BIT3 : 3;
}Port = 1;
struct Registro {
struct MyPort *pMyPortA;
} RegA;
RegA.pMyPortA = (struct MyPort *) &(PORTA);
Static Int8 n = 0;
//Int8 i = 1;
Int8 _digito = 0;
If (_numero > 999) _numero = 999; //Acota superior el numero
//Descompone en digitos para numero >= 100
If (_numero >= 100) {
If (n == 2) _digito = _numero / 100;
else If (n == 1) _digito = ((_numero / 10) % 10);
else If (n == 0) _digito = _numero % 10;
}
else If (_numero >= 10) { //Descompone en digitos para numero >= 10
If (n == 1) _digito = _numero / 10;
else If (n == 0) _digito = _numero % 10;
}
else If (n == 0) _digito = _numero; //Extrae el digito para numero < 10
If (n == 1) PORTB = _get7seg1(_digito); //Asigna la mascara del digito con punto decimal
else PORTB = _get7seg(_digito); //Asigna la mascara del digito sin punto decimal
//If (_power == 0) i = 0; //Apaga el display
If (_power == 0) Port.BIT3 = 0;
RegA.pMyPortA -> BIT3 = Port.BIT3 << n;
//PORTA = (PORTA & 0b11111000) | (i << n); //Selecciona el digito a iluminar.
if (n < 2) n++; //Proximo digito a iluminar (digitos 0 to 2)
else n = 0; //Reinicia el ciclo de refresco
}Hola, de que si se puede, claro que si se puede, pero no se si vale el esfuerzo. :lol: El codigo esta en C18.Código: C
struct MyPort // Se define la estructura { unsigned HIGH:5; unsigned LOW:3; }; struct MyPort *pMyPortD; // se crea un puntero para el tipo de estructura void main() { TRISB=0xFF; TRISD=0x00; ADCON1 = 0x0F; pMyPortD = (struct MyPort *) &(PORTD); // se inicializa el puntero con la direccion del puerto D do { pMyPortD->HIGH = 0x0; // Turn OFF HIGH LEDs on PORTD pMyPortD->LOW = 0x7; // Turn ON LOW LEDs on PORTD Delay10KTCYx(250); // delay pMyPortD->HIGH = 0x1F; // Turn ON HIGH LEDs on PORTD pMyPortD->LOW = 0x0; // Turn OFF LOW LEDs on PORTD Delay10KTCYx(250); // delay } while(1); }
//Selecciona el Display de 7Segmentos activo e imprime el digito.
//_numero a imprimir, _power = 1 display on
Void _Display(Int16 _numero, int1 _power) {
struct MyPort {
unsigned BIT3 : 3;
}Port = 1;
struct MyPort *pMyPortA;
pMyPortA = (struct MyPort *) &(PORTA);
Static Int8 n = 0;
//Int8 i = 1;
Int8 _digito = 0;
If (_numero > 999) _numero = 999; //Acota superior el numero
//Descompone en digitos para numero >= 100
If (_numero >= 100) {
If (n == 2) _digito = _numero / 100;
else If (n == 1) _digito = ((_numero / 10) % 10);
else If (n == 0) _digito = _numero % 10;
}
else If (_numero >= 10) { //Descompone en digitos para numero >= 10
If (n == 1) _digito = _numero / 10;
else If (n == 0) _digito = _numero % 10;
}
else If (n == 0) _digito = _numero; //Extrae el digito para numero < 10
If (n == 1) PORTB = _get7seg1(_digito); //Asigna la mascara del digito con punto decimal
else PORTB = _get7seg(_digito); //Asigna la mascara del digito sin punto decimal
//If (_power == 0) i = 0; //Apaga el display
If (_power == 0) Port.BIT3 = 0;
pMyPortA -> BIT3 = Port.BIT3 << n;
//PORTA = (PORTA & 0b11111000) | (i << n); //Selecciona el digito a iluminar.
if (n < 2) n++; //Proximo digito a iluminar (digitos 0 to 2)
else n = 0; //Reinicia el ciclo de refresco
}
#define display(n) LATAbits.LATA0 =(n & 1); LATAbits.LATA1 = (n & 2)>>1; LATAbits.LATA2 = (n & 4)>>2;
display(0); // Apaga todos
display(1); // Enciende el 1
display(2); // Enciende el 2
display(3); // Enciende el 1 y el 2
Solo para verificar el codigo que produce genere el asm, pero no se cuantos ciclos dura cada instruccion
Interesante, entonces esa seria una buena conclusion, tratar de no modificar bit a bit sino todo el puerto.
#define data(n) (output_bit(pin_c0, bit_test(n, 0)),output_bit(pin_c1, bit_test(n, 1)),output_bit(pin_c2, bit_test(n, 2)))