Busca la funcion que necesitas!

lunes, 21 de febrero de 2011

ASM PIC 16F84A - Controlar una pantalla de 7 segmentos

Bueno para los que no conozcan de electrónica este ASM es un poco diferente al que conocemos común mente como FASM, NASM, MASM y TASM, este ASM esta hecho para procesadores de la compañía microchip que nos provee este microcontrolador PIC, el código esta hecho para el 16F84A pero podría funcionar perfectamente en otros microcontroladores de gama media.

Lo que hace el código siguiente es mostrar un numero en la pantalla de 7 segmentos dependiendo de el swich que se levante, para esto se necesitan 3 switch conectados a tierra y unas resistencias (yo las puse de 10k) que van a VCC usando la inversa es decir cuando se levante el switch habrá corriente y cuando este abajo no habrá corriente, ustedes pueden modificarlo y hacerlo de forma directa lo interesante es el código...

LISTP=16F84A
    #INCLUDE <P16F84A.INC>
        RADIX HEX

AUXILIAR    EQU 0X0C
CONTADOR    EQU 0X0D

    ORG 0
    GOTO INICIO
    ORG 5


INICIO  BSF STATUS,RP0  ;NOS PASAMOS AL BANCO 1
        MOVLW B'00000010'
        MOVWF TRISB
        MOVLW B'00111'    ;CONFIGURAMOS 3 PUERTOSA ENTRADA
        MOVWF TRISA        ;APLICAMOS LA CONFIGURACION AL PUERTO A
        BCF STATUS,RP0    ;NOS PASAMOS AL BANCO 0

BORRAR     MOVLW B'11111111'
        MOVWF PORTB
SEGUIR  MOVLW B'00001'    ;CARGAMOS EL PUERTO A EN W 
        XORWF PORTA        ;COMPARAMOS W CON EL PUERTOA (IF W == PUERTOA)
        BTFSS STATUS,Z  ;RESULTADO DEL FLAG Z (IF W==PUERTOA THEN Z=0 ELSE Z=1)
        GOTO PROBAR2    ;SI Z ES IGUAL A 1 ENTONCES VAMOS A SEGUIR
        MOVLW B'11110010';DIBUJAMOS EL 1
        MOVWF PORTB        ;CARGAMOS W AL PUERTO B
        GOTO SEGUIR
PROBAR2    MOVLW B'00010'
        XORWF PORTA        ;COMPARAMOS W CON EL PUERTOA (IF W == PUERTOA)
        BTFSS STATUS,Z  ;RESULTADO DEL FLAG Z (IF W==PUERTOA THEN Z=0 ELSE Z=1)
        GOTO PROBAR3    ;SI Z ES IGUAL A 1 ENTONCES VAMOS A SEGUIR
        MOVLW B'01001000';DIBUJAMOS EL 2
        MOVWF PORTB   
        GOTO SEGUIR
PROBAR3    MOVLW B'00100'
        XORWF PORTA        ;COMPARAMOS W CON EL PUERTOA (IF W == PUERTOA)
        BTFSS STATUS,Z  ;RESULTADO DEL FLAG Z (IF W==PUERTOA THEN Z=0 ELSE Z=1)
        GOTO BORRAR        ;SI Z ES IGUAL A 1 ENTONCES VAMOS A SEGUIR
        MOVLW B'01100000';DIBUJAMOS EL 3
        MOVWF PORTB        ;CARGAMOS W AL PUERTO B
        GOTO SEGUIR        ;NOTA 0=ENCENDIDO 1=APAGADO

    END

viernes, 4 de febrero de 2011

C - Reemplazar Offsets

Modifiqué mi anterior función para hacer una que reemplaze los offsets que se quieran y no nomás 1 así me evitaba hacer un bucle en un programa inecesario!

Nota: La variable final la pueden quitar y usar directamente nOffset, yo la puse para debuggear.

int ReemplazarOffsets(int pOffset,int cantidad,char *nOffset, char * archivo)
{
  FILE *fp;
  char *buffer;
  char *temp;
  char *final;
  int peso;

  fp=fopen(archivo,"rb");
  if(fp==NULL)
    return -1;
  fseek(fp,0,SEEK_END);
  peso=ftell(fp);
  rewind(fp);
  final=(char *)malloc(cantidad);
  temp=(char *)malloc(pOffset -1);
  fread(temp,pOffset-1,1,fp);
  fseek(fp,pOffset-1+cantidad,SEEK_SET);
  buffer=(char *)malloc(peso - (pOffset - 1) - cantidad);
  fread(buffer,peso - (pOffset - 1) - cantidad,1,fp);
  fclose(fp);
  final=nOffset;
  fp=fopen(archivo,"wb");
  if(fp==NULL)
    return -1;
  fwrite(temp,pOffset-1,1,fp);
  fwrite(final,cantidad,1,fp);
  fwrite(buffer,peso - (pOffset - 1) - cantidad,1,fp);
  fclose(fp);
  free(temp);
  free(buffer);
  free(final);
  return 0;
}


//uso
...
//Reemplazamos del offset 0x256 al 0x25C rellenando esos offsets con Linkgl
ReemplazarOffsets(0x256,6,"Linkgl","C:\linkgl.exe");
...