Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/11/2010 #361


Hola a tod@s! Lo primero: george manson un 100 sobre 10, menudo peazo tema te has currao, enhorabuena, y gracias tb al resto de integrantes, es todo informacion util para los novatos como yo, ggg. Escribo para ver si me podeis resolver unas dudas.

1-Estoy aprendiendo a programar en CCS y he observado que al establecer los puerto como entradas o salidas, en la simulacion de proteus el puerto en cuestion no hace lo que yo le ordeno, es decir, seteo port b como entrada mediante set_tris_b(1), voy a proteus y me encuentro que hay pines rojos y azules, incluso uno apagado (gris). ¿A que puede ser debido esto? ¿que es lo ke estoy haciendo mal? he probado poniendo en hex, en binario... y no hay manera.

2-Esta parte es mas de proteus, tal vez y no se si es este el lugar indicado, ya podeis perdonar. Pongo un pulsador pero al actuarlo no observo cambio de estado alguno con la watch window en ese puerto, a ke puede ser debido? he visto circuitos en los ke simplemente conectan un estremo al pin y el otro a tierra o a +5v segun el estado ke se kiera konseguir, pero no hay manera, ¿sera ke en lo ke he visto estan activadas las resistencias internas del pic? digo esto x ke si intercalo una resistencia la simulacion si anda aunke sigo sin observar cambi de estado en el puerto.

Muchas gracias de antemano y seguir asi. Enhorabuena!!!
03/11/2010 #362

Avatar de ByAxel

Que PIC usas?
Sube el programa que estás probando...
03/11/2010 #363


Hola ByAxel, un placer volver a verte, este es el codigo, aparentemente sencillo pero ke no hace lo ke yo kiero :(

//Incluimos las librerias necesarias

#include <16F874A.h>

#use delay(clock=40000000)

#include <lcd_mod.c>

#fuses HS,NOWDT,NOPROTECT,NOLVP





void MenuReloj()

{

lcd_putc("\f");

lcd_gotoxy(1,1);

lcd_putc("MENU HORA");



while(true)

{

lcd_putc("\f");

lcd_gotoxy(1,1);

lcd_putc("10h20m");



if(!input(pin_c3))//pulsador de salida

{

return;

}

else

{

delay_ms(20);

}

}

}



void main()

{

int columna=1;

int fila=1;



//Establecemos los puertos

SET_TRIS_A(0);

SET_TRIS_B(1);



//Inicializar LCD

lcd_init();





while(true)

{

//Menu Reloj

if(!input(pin_b0))//pulsador de menu

{

MenuReloj();

}



if(!input(pin_b0))

{

}



//Corre la cadena por todo el LCD

lcd_putc("\f");

lcd_gotoxy(columna,fila);

lcd_putc("HOLA");



delay_ms(20);



columna++;



if(columna==17)
03/11/2010 #364

Avatar de ByAxel

Es parte del programa?
- Wow 40Mhz? #use delay(clock=40000000) no exageres que los PIC16F no pueden correr a mas de 20Mhz.
- En la cabecera prueba esto #use fast_io(b); esto evita a que se esté configurando una y otra vez el puerto.
03/11/2010 #365


Lo del reloj ha sido un fallo, lo otro lo he probado pero nada, en proteus hace lo ke kiere, he seteado el port c para probar y pone todos los pines menos uno, en portb cuatro y cuatro, cuando pulso cambia el color del pin pero en el registro de la watch window no y aparte no hace lo ke esta en el programa. Adjunto la simulacion con el boton sin pulsar y pulsado para este codigo

//Incluimos las librerias necesarias
#include <16F874A.h>
#use delay(clock=4000000)
#include <lcd_mod.c>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use fast_io(b)
#use fast_io(c)

//#DEVICE

void MenuReloj()
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("MENU HORA");

while(true)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("10h20m");

if(!input(pin_c3))
{
return;
}
else
{
delay_ms(1000);
}
}
}

void main()
{
int columna=1;
int fila=1;

//Establecemos los puertos
SET_TRIS_A(0);
set_tris_b(1);
set_tris_c(1);
//Inicializar LCD
lcd_init();


while(true)
{
//Menu Reloj
if(!input(pin_b0))
{
MenuReloj();
}

if(!input(pin_b0))
{
}

//Corre la cadena por todo el LCD
lcd_putc("\f");
lcd_gotoxy(columna,fila);
lcd_putc("HOLA");

delay_ms(40);

columna++;

if(columna==17)
{
fila++;
columna=1;
}

if(fila>2)
{
fila=1;
}
}
}
Imágenes Adjuntas
Tipo de Archivo: jpg simulacion.JPG (158,9 KB (Kilobytes), 35 visitas)
Tipo de Archivo: jpg pulsado.JPG (158,3 KB (Kilobytes), 28 visitas)
03/11/2010 #366

Avatar de ByAxel

Simule tu código sin las rutinas del LCD quedando algo así:

Código PHP:
#include <16F874A.h>
#FUSES XT
#use delay(clock=4M)
#use fast_io(b)
#use fast_io(c)
long cnt 0;

//---
void Menu(void)
{
   while(
TRUE){
      if(!
input(PIN_C0)){
         break;   
      } 
      
delay_ms(100);
      
output_toggle(PIN_C3);  // Parpadeo mientras RC0 = 1
      
--cnt;                         // Decremento un contador
   
}
}

void main()
{
   
// Al usar el PORTA como I/O digital se tiene que desactivar las entradas análogas.

   
set_tris_a(0);
   
set_tris_b(1);
   
set_tris_c(1);
   
   
output_b(0);
   
output_c(0);
      
   while(
TRUE){   
      if(!
input(PIN_B0)){
         
Menu();   // RB0 = 0 => Va a sub-proceso
      
}
      
delay_ms(100);
      
output_toggle(PIN_B3);  // Parpadeo mientras RB0 = 1
      
++cnt;                        // Incremento un contador
   
}

Si le hace caso a los pulsadores. Me pregunto si tu librería del LCD es la causante. Y no se te olvide de colocar las resistencias a pull-up para darle un valor lógico '1' a pin como entrada mientras no se presione el pulsador.

saludos
03/11/2010 #367

Avatar de Etazla

ByAxel dijo: Ver Mensaje
Simule tu código sin las rutinas del LCD quedando algo así:

Código PHP:
#include <16F874A.h>
#FUSES XT
#use delay(clock=4M)
#use fast_io(b)
#use fast_io(c)
long cnt 0;

//---
void Menu(void)
{
   while(
TRUE){
      if(!
input(PIN_C0)){
         break;   
      } 
      
delay_ms(100);
      
output_toggle(PIN_C3);  // Parpadeo mientras RC0 = 1
      
--cnt;                         // Decremento un contador
   
}
}

void main()
{
   
// Al usar el PORTA como I/O digital se tiene que desactivar las entradas análogas.

   
set_tris_a(0);
   
set_tris_b(1);
   
set_tris_c(1);
   
   
output_b(0);
   
output_c(0);
      
   while(
TRUE){   
      if(!
input(PIN_B0)){
         
Menu();   // RB0 = 0 => Va a sub-proceso
      
}
      
delay_ms(100);
      
output_toggle(PIN_B3);  // Parpadeo mientras RB0 = 1
      
++cnt;                        // Incremento un contador
   
}

Si le hace caso a los pulsadores. Me pregunto si tu librería del LCD es la causante. Y no se te olvide de colocar las resistencias a pull-up para darle un valor lógico '1' a pin como entrada mientras no se presione el pulsador.

saludos
pero fue simulado en que?, la rutina solo del pulsador en mplab es....

Código PHP:
;**********************************************************************
;   
This file is a basic code template for assembly code generation   *
;   
on the PIC16F887This file contains the basic code               *
;   
building blocks to build upon.                                    *
;                                                                     *
;   
Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:        xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P16F887.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;**********************************************************************


    list        p=16f887    ; list directive to define processor
    #include    <p16f887.inc>    ; processor specific variable definitions


; '
__CONFIG' directive is used to embed configuration data within .asm file.
; The labels following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V



;***** VARIABLE DEFINITIONS
CONT        EQU    0X20
CONT2        EQU    0X21
VAR1        EQU    0X22
TEMPORAL    EQU    0X23


w_temp        EQU    0x7D        ; variable used for context saving
status_temp    EQU    0x7E        ; variable used for context saving
pclath_temp    EQU    0x7F        ; variable used for context saving


;**********************************************************************
    ORG     0x000             ; processor reset vector

    nop
      goto    main              ; go to beginning of program


    ORG     0x004             ; interrupt vector location

    movwf   w_temp            ; save off current W register contents
    movf    STATUS,w          ; move status register into W register
    movwf    status_temp       ; save off contents of STATUS register
    movf    PCLATH,w      ; move pclath register into w register
    movwf    pclath_temp      ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere

    movf    pclath_temp,w      ; retrieve copy of PCLATH register
    movwf    PCLATH          ; restore pre-isr PCLATH register contents
    movf    status_temp,w     ; retrieve copy of STATUS register
    movwf    STATUS            ; restore pre-isr STATUS register contents
    swapf   w_temp,f
    swapf   w_temp,w          ; restore pre-isr W register contents
    retfie                    ; return from interrupt



main
    BANKSEL    ANSELH            ;SELECCIONO EL BANCO DE RAM DEL REGISTRO ANSELH (ANALOG SELECTOR HIGH SE USA PARA CONFIGURAR EL PORTB)
    MOVLW    0X00
    MOVWF    ANSELH            ;AL CARGAR 0X00 EN ESE REGISTRO LE DIGO AL PIC QUE LOS PINES DEL PUERTO B SON DIGITALES (CON 1 ES ANALOGO)

    BANKSEL    ANSEL            ;SELECCIONO EL BANCO DE RAM DEL REGISTRO ANSEL (ANALOG SELECTOR HIGH SE USA PARA CONFIGURAR EL PORTA)
    MOVLW    0X00
    MOVWF    ANSEL            ;AL CARGAR 0X00 EN ESE REGISTRO LE DIGO AL PIC QUE LOS PINES DEL PUERTO A SON DIGITALES (CON 1 ES ANALOGO)

    BANKSEL    TRISB            ;SELECCIONO EL BANCO DE RAM DEL REGISTRO DE CONFIGURACION DE ENTRADA/SALIDA DEL PUERTO B
    MOVLW    B'
00001111'
    MOVWF    TRISB            ;EN EL PORTB LOS PINES BAJOS SON DE ENTRADA Y LOS ALTOS SON DE SALIDA 

    BANKSEL    TRISA            ;ESTO ES LO MISMO PERO PARA EL PUERTO A
    MOVLW    B'
00000011'            
    MOVWF    TRISA            ;CAMBIO EL VALOR EN EL REGUISTRO TRIS PARA QUE EN EL PIN 0 DEL PORTA SEA DE ENTRADA 

    BANKSEL    PORTB            ;ANTES DE PASAR A LA RUTINA QUE NECESITO, DEBO SELECCIONAR EL BANCO DEL PUERTO B (QUE ES EL QUE VOY A USAR)
    CLRF    VAR1
    CLRF    PORTB
    CLRF    PORTA
    BCF        STATUS,Z

LED_ON_OFF
    BSF        PORTA,3            ;PONGO EN 1 EL PIN 3 DEL PUERTO A 
    CALL     RUTINA
    BCF        PORTA,3            ;PONGO EN 0 EL PIN 0 DEL PUERTO B
    CALL    RETARDOTE        ;LLAMO AL RETARDO
    BSF        PORTA,3            ;PONGO EN 1 EL PIN 3 DEL PUERTO A 
    CALL     RUTINA
    BCF        PORTA,3            ;PONGO EN 0 EL PIN 0 DEL PUERTO B
    CALL    RETARDOTE        ;LLAMO AL RETARDO
    GOTO    LED_ON_OFF        ;VUELVO A INICIAR TODO DE NUEVO PERO SIN RECONFIGURAR LA MAQUINA 

RETARDO
    MOVLW    0XFF
    MOVWF    CONT
LOOP_RETARDO
    DECFSZ    CONT,F
    GOTO    LOOP_RETARDO
    RETURN

RETARDOTE
    MOVLW    0XFF
    MOVWF    CONT2
LOOP_RETARDOTE
    CALL    RETARDO
    DECFSZ    CONT2,F
    GOTO    LOOP_RETARDOTE
    RETURN


RUTINA
    BTFSS    PORTA,0
    GOTO    CHEQUEO1
    BTFSS    PORTA,1
    GOTO    CHEQUEO5
    GOTO    RUTINA

CHEQUEO1
    BTFSC    PORTA,1
    GOTO    CHEQUEO2
    GOTO    CHEQUEO1

CHEQUEO2
    BTFSS    PORTA,1
    GOTO    CHEQUEO3
    GOTO    CHEQUEO2

CHEQUEO3
    BTFSC    PORTA,0
    GOTO    CHEQUEO4
    GOTO    CHEQUEO3

CHEQUEO4
    BTFSS    PORTA,1
    GOTO    CHEQUEO4
    INCF    VAR1
    GOTO    MIRAR1

CHEQUEO5
    BTFSC    PORTA,0
    GOTO    CHEQUEO6
    GOTO    CHEQUEO5

CHEQUEO6
    BTFSS    PORTA,0
    GOTO    CHEQUEO7
    GOTO    CHEQUEO6

CHEQUEO7
    BTFSC    PORTA,1
    GOTO    CHEQUEO8
    GOTO    CHEQUEO7

CHEQUEO8
    BTFSS    PORTA,0
    GOTO    CHEQUEO8
    DECF    VAR1
    GOTO    MIRAR2

MIRAR1
    MOVF    VAR1,W
    SUBLW    0X10
    BTFSC    STATUS,Z    
    DECF    VAR1
    GOTO    ACTUALIZAR    

MIRAR2
    MOVF    VAR1,W
    SUBLW    0XFF
    BTFSC    STATUS,Z
    INCF    VAR1
    GOTO    ACTUALIZAR            ;3520634    2685240

ACTUALIZAR
    MOVF    VAR1,W
    MOVWF    TEMPORAL        ;Y LO ALAMCENO EN UNA VARIABLE "TEMPORAL" PARA PODER OPERARLA
    SWAPF    TEMPORAL,W        ;HAGO UN SWAPDE LOS BITS QUE ACABO DE LEER DEL PUERTO B

SALIDA
    MOVWF     PORTB             ;UNA VEZ REALIZADA LA OPERACION RECARGO EL RESULTADOEN EL PUERTO B
    RETURN
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             



; example of preloading EEPROM locations

    ORG    0x2100
    DE    5, 4, 3, 2, 1

    END                       ; directive '
end of program
y aprovecho para decir como hago para un cto con una fotocelda o un fototransistor para poder medirlo en el lcd (un conversor analogo digital) pero no se como montarlo por que este si me tiene en bloqueo mental total. solo tengo este......pero este muestra es el paso de voltaje atravez de un potenciometro....
Notes: *
; *
;************************************************* *********************


Código PHP:
 list        p=16f887    ; list directive to define processor
    
#include    <p16f887.inc>    ; processor specific variable definitions


'__CONFIG' directive is used to embed configuration data within .asm file.
The labels following the directive are located in the respective .inc file.
See respective data sheet for additional information on configuration word.

    
__CONFIG    _CONFIG1_LVP_OFF _FCMEN_ON _IESO_OFF _BOR_OFF _CPD_OFF _CP_OFF _MCLRE_ON _PWRTE_ON _WDT_OFF _XT_OSC
    __CONFIG    _CONFIG2
_WRT_OFF _BOR21V



;***** VARIABLE DEFINITIONS
;***** VARIABLE DEFINITIONS
w_temp        EQU     0x7E        
variable used for context saving 
status_temp   EQU     0x7F        
variable used for context saving

VAR1            EQU        0X20
VAR2            EQU        0X21
COSI            EQU        0X22

L_8X8            EQU        0X23
H_8X8            EQU        0X24

N1_L            EQU        0X25
N1_H            EQU        0X26
N2_L            EQU        0X27
N2_H            EQU        0X28
N3_L            EQU        0X29
N3_H            EQU        0X2A
BK1_H            EQU        0X2B
BK1_L            EQU        0X2C
BK2_H            EQU        0X2D
BK2_L            EQU        0X2E
BK3_H            EQU        0X2F
BK3_L            EQU        0X30
INDI_H            EQU        0X31
INDI_L            EQU        0X32
COCI_H            EQU        0X33
COCI_L            EQU        0X34
FLAGS            EQU        0X35
UNI                EQU        0X36
DEC                EQU        0X37
CEN                EQU        0X38
MIL                EQU        0X39
DECMIL            EQU        0X3A
CONV_H            EQU        0X3B
CONV_L            EQU        0X3C
WREG_H            EQU        0X3D        
;BYTE ALTO DE WREG
STACK_1H        EQU        0X3E
STACK_1L        EQU        0X3F
STACK_2H        EQU        0X40
STACK_2L        EQU        0X41
STACK_3H        EQU        0X42
STACK_3L        EQU        0X43
STACK_4H        EQU        0X44
STACK_4L        EQU        0X45
STACK_5H        EQU        0X46
STACK_5L        EQU        0X47
WREG_H_TEMP        EQU        0X48
WREG_L_TEMP        EQU        0X49
WREG_L            EQU        0X4A

CONT            EQU        0x4B
CONT2            EQU        0x4C
LCDATA            EQU        0X4D

;********* DEFINICIONES DE BANDERAS *************
EN        EQU        0X00
RS        EQU        0X01

CARRY    EQU        0X00



;**********************************************************************
        
ORG     0x000             processor reset vector
        clrf    PCLATH            
ensure page bits are cleared
          
goto    main              go to beginning of program


        ORG     0x004             
interrupt vector location
        movwf   w_temp            
save off current W register contents
        movf    STATUS
,w          move status register into W register
        movwf    status_temp       
save off contents of STATUS register


isr code can go here or be located as a call subroutine elsewhere


        movf    status_temp
,w     retrieve copy of STATUS register
        movwf    STATUS            
restore pre-isr STATUS register contents
        swapf   w_temp
,f
        swapf   w_temp
,w          restore pre-isr W register contents
        retfie                    
; return from interrupt



main
        BANKSEL    ANSEL
        MOVLW    
B'00000001'            ;RA0-RA3 TODOS ANALOGOS
        MOVWF    ANSEL        

        BANKSEL    ANSELH
        MOVLW    
B'00000000'            ;RB0-RB7 TODOS DIGITALES
        MOVWF    ANSELH        

        BANKSEL    ADCON1
        MOVLW    
B'10000000'            ;JUSTIFICACION A LA DERECHAVREF EN TIERRA Y FUENTE
        MOVWF    ADCON1

        BANKSEL    ADCON0                
;encender el analogo digital
        MOVLW    
B'10000001'            ;FOSC/32CH0DONEACD ON
        MOVWF    ADCON0


        BANKSEL TRISA
        MOVLW    
B'00000001'            ;puerto A y el resto en ceroshay que ponerlo de entrada en el tirsa
        MOVWF    TRISA                
;LOS 4 BITS DE MENOR PESO DE ENTRADA PARA LUEGO SER ANALOGOS

        CLRF    TRISB            
;PONGO TODOS LOS TRIS DE SALIDA EN EL PUERTO B


        BANKSEL    ADCON0

        MOVLW    
B'10000001'            ;FOSC/32CH0DONEACD ON
        MOVWF    ADCON0
        BSF        ADCON0
,GO_DONE        ;INICIO UNA CONVERSIÓN A/D

        BANKSEL    PORTA

        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE

        CALL    INIT_LCD
        CALL    MENSAJE_TERMOMETRO
    
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE
        MOVLW    .255
        CALL    RETARDOTE

        CALL    BORRAR

LOOP_PRINCIPAL        
;se tiene que poner en cero
        BTFSC    ADCON0
,GO_DONE
        
GOTO    NO_DATA
SI_DATA    
        BSF        ADCON0
,GO_DONE        ;INICIO OTRA CONVERSIÓN ADC

        
;se pone el watch constack_1h1l.2l,2h,3l,3h,4l,4hadresh 0x01adresl0xffwre_hwreg_lwreg
        MOVF    ADRESH
,W
        MOVWF    WREG_H
        BSF        STATUS
,RP0
        MOVF    ADRESL
,W
        BCF        STATUS
,RP0
        MOVWF    WREG_L            
;CARGO EL DATO QUE OBTENDO DEL ADC EN WREG 16 BITS
        CALL    PUSH_2_STACK    
;LO ENTRO A LA PILA

        CALL    ADC_2_VOLT        
;CONVIERTO A VOLTAJE EN BCD (REVISAR REGISTROS DECMILMIL ETC)

        
CALL    BORRAR

            

    

        MOVF    CEN
,W        ;TOMO EL DATO QUE HAYA EN EL REGISTROLO PASO A ASCII Y LO ENVIO DE UNA AL LCD
        ADDLW    0X30
        CALL    LCDD

        MOVF    DEC
,W        ;TOMO EL DATO QUE HAYA EN EL REGISTROLO PASO A ASCII Y LO ENVIO DE UNA AL LCD
        ADDLW    0X30
        CALL    LCDD

        MOVLW    
'.'
        
CALL    LCDD        ;ENVIO EL PUNTO DECIMAL        

        MOVF    DEC
,W        ;TOMO EL DATO QUE HAYA EN EL REGISTROLO PASO A ASCII Y LO ENVIO DE UNA AL LCD
        ADDLW    0X30
        CALL    LCDD        

        MOVF    UNI
,W        ;TOMO EL DATO QUE HAYA EN EL REGISTROLO PASO A ASCII Y LO ENVIO DE UNA AL LCD
        ADDLW    0X30
        CALL    LCDD    
        
        MOVLW    
'%'
        
CALL    LCDD        ;ENVIO EL PUNTO DECIMAL    

NO_DATA
        
GOTO    LOOP_PRINCIPAL


RETARDOTE
LOOP_RETARDOTE
        CALL    RETARDO
        DECFSZ    CONT2
,F
        
GOTO    LOOP_RETARDOTE
        
RETURN

RETARDO
        MOVLW    .255
        MOVWF    CONT
LOOP_RETARDO
        DECFSZ    CONT
,F
        
GOTO    LOOP_RETARDO
        
RETURN

INIT_LCD
        MOVLW   0X30        
;MANDA LA INSTRUCCION 3 VECESPRIMERA
        MOVWF    PORTB
        CALL    OUTLCD
        MOVLW   0X30        
;SEGUNDA
        MOVWF    PORTB
        CALL    OUTLCD
        MOVLW   0X30        
;TERCERA
        MOVWF    PORTB
        CALL    OUTLCD
        MOVLW   0X20        
;Operacion en 4 bits
        MOVWF    PORTB
        CALL    OUTLCD        
;MANDA LA INSTRUCCION
        MOVLW   0X2C        
;
        
CALL    LCDI
        MOVLW   0X08        
;
        
CALL    LCDI
        MOVLW   0X0F        
;
        
CALL    LCDI
        MOVLW   0X01        
;
        
CALL    LCDI
        MOVLW   0X06        
;
        
CALL    LCDI
        MOVLW   0X0C
        CALL    LCDI
        
RETURN

OUTLCD
        BSF     PORTB
,EN         PONE EN 1 el enable del lcd  "HABILITA" EL LCD
        MOVLW   0X05            
;0X05
        MOVWF   CONT2
        CALL    RETARDOTE
        BCF     PORTB
,EN         PONE EN 0 ENABLE DEL LCD
        
RETURN

LCDD
        MOVWF    LCDATA        
;
        
SUBLW    0X00        ;COMPARO CON 0X00 PARA SABER SI TERMINO DE ESCRIBIR EN LCD
        BTFSC    STATUS
,Z    ;SALTO SI NO ES IGUAL A 0X00
        
GOTO    FIN_LCDD    ;SI ES IGUAL TERMINO LA RUTINA SIN SACAR NADA POR LCD

        MOVLW    0XF0            
;MASCARA DEL NIBBLE ALTO
        ANDWF    LCDATA
,W        ;
        
MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
        BSF        PORTB
,RS        ;PONE RS EN CARACTER

        CALL    OUTLCD

        MOVLW    0X0F            
;MASCARA DEL NIBBLE BAJO
        ANDWF    LCDATA
,f        ;
        
SWAPF    LCDATA,W        ;PONE LOS 4 BITS DE MENOR PESO EN EL DE MAYOR PESO EN LCDATA
        MOVWF   PORTB           
;SACA POR EL PUERTO EL DATO
        BSF        PORTB
,RS        ;PONE RS EN CARACTER

        CALL    OUTLCD
FIN_LCDD
        
RETURN


LCDI
        MOVWF    LCDATA        
;
        
MOVLW    0XF0            MASCARA DEL NIBBLE ALTO
        ANDWF    LCDATA
,W        ;
        
MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
        BCF        PORTB
,RS        PONE RS EN INSTRUCCION O COMANDO

        CALL    OUTLCD          
DA SALIDA POR EL LCD

        MOVLW    0X0F            
MASCARA DEL NIBBLE BAJO
        ANDWF    LCDATA
,f        ;
        
SWAPF    LCDATA,W        PONE LOS 4 BITS DE MENOR PESO EN EL DE MAYOR PESO EN IODATA
        MOVWF   PORTB           
;SACA POR EL PUERTO EL DATO
        BCF        PORTB
,RS        PONE RS EN INSTRUCCION

        CALL    OUTLCD          
DA SALIDA POR EL LCD

        
RETURN

MENSAJE_TERMOMETRO
        MOVLW    
'L'
        
CALL    LCDD
        MOVLW    
'U'
        
CALL    LCDD
        MOVLW    
'M'
        
CALL    LCDD
        MOVLW    
'I'
        
CALL    LCDD
        MOVLW    
'O'
        
CALL    LCDD
        MOVLW    
'C'
        
CALL    LCDD
        MOVLW    
'I'
        
CALL    LCDD
        MOVLW    
'D'
        
CALL    LCDD
        MOVLW    
'A'
        
CALL    LCDD
        MOVLW    
'D'
        
CALL    LCDD
        
RETURN

ADC_2_VOLT
;    MOVLW    0X01                ;
;    
MOVWF    WREG_H
;    MOVLW    0X33
;    MOVWF    WREG_L
;    CALL    PUSH_2_STACK

    MOVLW    0X00    
    MOVWF    WREG_H
    MOVLW    0X32        
;metio el numero 100
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    MULTI_16S    
;multiplica lo que leyo por 100

    MOVLW    0X00                
    MOVWF    WREG_H
    MOVLW    0X20 
50
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    MOVLW    0X00                
    MOVWF    WREG_H
    MOVLW    0X0A
    MOVWF    WREG_L
    CALL    PUSH_2_STACK
    
    CALL    MULTI_16S 
    
    MOVLW    0X00                
    MOVWF    WREG_H
    MOVLW    0X20 
50
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    CALL    HEX_2_DEC_16    
;
    RETURN



HEX_2_DEC_16                    ;CONVIERTE EL OBJETO EN EL NIVEL 1 DEL STACK EN DECIMAL
    CALL    DUP                    
;DECMIL.MIL.CEN.DEC.UNI

    MOVLW    0X27                
;DIVISION POR 10.000
    MOVWF    WREG_H
    MOVLW    0X10
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    MOVF    STACK_1L
,W
    MOVWF    DECMIL
    
    MOVLW    0X27
    MOVWF    WREG_H
    MOVLW    0X10
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    MULTI_16S

    CALL    RESTA_16S

    CALL    DUP

    MOVLW    0X03                
;DIVISION POR 1.000
    MOVWF    WREG_H
    MOVLW    0XE8
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    MOVF    STACK_1L
,W
    MOVWF    MIL

    MOVLW    0X03
    MOVWF    WREG_H
    MOVLW    0XE8
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    MULTI_16S

    CALL    RESTA_16S
    
    CALL    DUP

    MOVLW    0X00                
;DIVISION POR 100
    MOVWF    WREG_H
    MOVLW    0X64
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    MOVF    STACK_1L
,W
    MOVWF    CEN

    MOVLW    0X00
    MOVWF    WREG_H
    MOVLW    0X64
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    MULTI_16S

    CALL    RESTA_16S


    CALL    DUP

    MOVLW    0X00                
;DIVISION POR 10
    MOVWF    WREG_H
    MOVLW    0X0A
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    DIVI_16S

    MOVF    STACK_1L
,W
    MOVWF    DEC

    MOVLW    0X00
    MOVWF    WREG_H
    MOVLW    0X0A
    MOVWF    WREG_L
    CALL    PUSH_2_STACK

    CALL    MULTI_16S

    CALL    RESTA_16S

    MOVF    STACK_1L
,W
    MOVWF    UNI
    
RETURN


CLR_STACK
    MOVLW    0X00

    MOVWF    STACK_4H
    MOVWF    STACK_3H
    MOVWF    STACK_2H
    MOVWF    STACK_1H

    MOVWF    STACK_4L
    MOVWF    STACK_3L
    MOVWF    STACK_2L
    MOVWF    STACK_1L
    
    
RETURN

SHIFT_STACK_UP
    MOVF    STACK_3H
,W
    MOVWF    STACK_4H
    MOVF    STACK_3L
,W
    MOVWF    STACK_4L
SHIFT_STACK_UNTIL_3
    MOVF    STACK_2H
,W
    MOVWF    STACK_3H
    MOVF    STACK_2L
,W
    MOVWF    STACK_3L
SHIFT_STACK_UNTIL_2
    MOVF    STACK_1H
,W
    MOVWF    STACK_2H
    MOVF    STACK_1L
,W
    MOVWF    STACK_2L
    
RETURN

SWAP
    MOVF    STACK_2H
,W        ;HAGO UNA COPIA TEMPORAL DE STACK_2 EN STACK_5
    MOVWF    STACK_5H        
    MOVF    STACK_2L
,W
    MOVWF    STACK_5L        
    CALL    SHIFT_STACK_UNTIL_2        
;HAGO UN SHIFT EN EL STACK HASTA EL NIVEL 3
    MOVF    STACK_5H
,W                ;RESTAURO LA COPIA TEMPORAL YA EN STACK_1
    MOVWF    STACK_1H
    MOVF    STACK_5L
,W
    MOVWF    STACK_1L
    
RETURN

ROT
    MOVF    STACK_3H
,W        ;HAGO UNA COPIA TEMPORAL DE STACK_2 EN STACK_5
    MOVWF    STACK_5H        
    MOVF    STACK_3L
,W
    MOVWF    STACK_5L        
    CALL    SHIFT_STACK_UNTIL_3        
;HAGO UN SHIFT EN EL STACK HASTA EL NIVEL 3
    MOVF    STACK_5H
,W                ;RESTAURO LA COPIA TEMPORAL YA EN STACK_1
    MOVWF    STACK_1H
    MOVF    STACK_5L
,W
    MOVWF    STACK_1L
    
RETURN

DROP
    MOVF    STACK_2H
,W
    MOVWF    STACK_1H
    MOVF    STACK_2L
,W
    MOVWF    STACK_1L

    MOVF    STACK_3H
,W
    MOVWF    STACK_2H
    MOVF    STACK_3L
,W
    MOVWF    STACK_2L

    MOVF    STACK_4H
,W
    MOVWF    STACK_3H
    MOVF    STACK_4L
,W
    MOVWF    STACK_3L
    CLRF    STACK_4H
    CLRF    STACK_4L
    
RETURN

DUP
    MOVF    STACK_1H
,W        ;HAGO UNA COPIA TEMPORAL DE STACK_2 EN STACK_5
    MOVWF    WREG_H        
    MOVF    STACK_1L
,W
    MOVWF    WREG_L
    CALL    PUSH_2_STACK
    
RETURN

PUSH_2_STACK                ;ESTA RUTINA RECIBE LOS DATOS EN (WREG_H:W)
    
CALL    SHIFT_STACK_UP    ;PRIMERO HAGO UN SHIFT DEL STACK HACIA ARRIBA PARA ABRIR EL ESPACIO (SE PIERDE EL DATO EN STACK 4)
    
MOVF    WREG_L,W
    MOVWF    STACK_1L        
;CARGO EL VALOR DE W EN EL BYTE BAJO DEL PRIMER NIVEL DE STACK
    MOVF    WREG_H
,W        ;PONGO EL BYTE ALTO DE W EN EL BYTE ALTO DEL PRIMER NIVEL DE STACK
    MOVWF    STACK_1H        
;
    RETURN

SUMA_16S
    MOVF    STACK_2H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N2_H
    MOVF    STACK_2L
,W
    MOVWF    N2_L

    MOVF    STACK_1H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N1_H
    MOVF    STACK_1L
,W
    MOVWF    N1_L

    CALL    SUMA_16

    MOVF    N3_H
,W            ;PONGO EL RESULTADO DE LA OPERACION EN EL NIVEL 2 DEL STACK
    MOVWF    STACK_2H
    MOVF    N3_L
,W
    MOVWF    STACK_2L

    CALL    DROP            
;HAGO UN DROP DEL NIVEL 1 PARA QUE LA SUMA QUEDE COMPLETA EN EL NIVEL 1
    
RETURN

RESTA_16S
    MOVF    STACK_2H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N1_H
    MOVF    STACK_2L
,W
    MOVWF    N1_L

    MOVF    STACK_1H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N2_H
    MOVF    STACK_1L
,W
    MOVWF    N2_L

    CALL    RESTA_16C

    MOVF    N3_H
,W            ;PONGO EL RESULTADO DE LA OPERACION EN EL NIVEL 2 DEL STACK
    MOVWF    STACK_2H
    MOVF    N3_L
,W
    MOVWF    STACK_2L

    CALL    DROP            
;HAGO UN DROP DEL NIVEL 1 PARA QUE LA SUMA QUEDE COMPLETA EN EL NIVEL 1
    
RETURN

MULTI_16S
    MOVF    STACK_2H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N1_H
    MOVF    STACK_2L
,W
    MOVWF    N1_L

    MOVF    STACK_1H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N2_H
    MOVF    STACK_1L
,W
    MOVWF    N2_L

    CALL    MULTI_16

    MOVF    N3_H
,W            ;PONGO EL RESULTADO DE LA OPERACION EN EL NIVEL 2 DEL STACK
    MOVWF    STACK_2H
    MOVF    N3_L
,W
    MOVWF    STACK_2L

    CALL    DROP            
;HAGO UN DROP DEL NIVEL 1 PARA QUE LA SUMA QUEDE COMPLETA EN EL NIVEL 1
    
RETURN

DIVI_16S
    MOVF    STACK_2H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N1_H
    MOVF    STACK_2L
,W
    MOVWF    N1_L

    MOVF    STACK_1H
,W        ;CARGO LOS DATOS DE LA PILA EN LOS REGISTROS DE TRABAJO DE LA RUTINA SUMA_16
    MOVWF    N2_H
    MOVF    STACK_1L
,W
    MOVWF    N2_L

    CALL    DIVI_16

    MOVF    COCI_H
,W            ;PONGO EL RESULTADO DE LA OPERACION EN EL NIVEL 2 DEL STACK
    MOVWF    STACK_2H
    MOVF    COCI_L
,W
    MOVWF    STACK_2L

    CALL    DROP            
;HAGO UN DROP DEL NIVEL 1 PARA QUE LA SUMA QUEDE COMPLETA EN EL NIVEL 1
    
RETURN

SUMA_16
    MOVF    N1_L
,W
    ADDWF    N2_L
,W
    MOVWF    N3_L
    MOVF    N1_H
,W
    BTFSC    STATUS
,C
    INCF    N1_H
,W
    ADDWF    N2_H
,W
    MOVWF    N3_H
    
RETURN
    
RESTA_16C
    BSF        FLAGS
,CARRY                    ;PRESUPONGO INICIALMENTE QUE LA OPERACION DA MAYOR QUE 0
    MOVF    N2_L
,W
    SUBWF    N1_L
,W
    MOVWF    N3_L
    BTFSS    STATUS
,C
    CALL    DECREMENTA_CON_CARRY        
;DEBO INDICAR CUANDO EL BYTE ALTO PRODUCE CARRY
    MOVF    N2_H
,W
    SUBWF    N1_H
,W
    MOVWF    N3_H

    MOVF    STATUS
,W                    ;ESTA PARTE DE LA RUTINA DEBE LOGRAR QUE RESTA_16 GENERE CARRY=0
    ANDLW    
B'00000001'                    ;CUANDO UNA OPERACION DA NEGATIVABIEN SEA EN EL BYTE ALTO O EN EL BAJO
    ANDWF    FLAGS
,W
    BCF        STATUS
,C
    BTFSS    STATUS
,Z
    BSF        STATUS
,C

    
RETURN

DECREMENTA_CON_CARRY
    BSF        FLAGS
,CARRY                    ;USO UNA BANDERA DE USUARIO PARA "ACORDARME" DEL CARRY EN EL BYTE ALTO
    MOVLW    0X01
    SUBWF    N1_H
,F
    BTFSS    STATUS
,C
    BCF        FLAGS
,CARRY
    
RETURN
    
MULTI_16
            CALL    N2_2_INDI            
;COPIO EL VALOR DE UNO DE LOS MULTIPLOS A OTRA VARIABLE LLAMADA INDICE QUE INDICARA 
            CLRF    N2_H                
;CUANTAS VECES DEBO SUMAR EN 16 BITS
            CLRF    N2_L                
;LUEGOEN N2 ACUMULO EL VALOR DE LA MULTIPICACIONPOR LO TANTO LO ARRANCO EN 0X0000
LOOP_MULTI_16
            CALL    SUMA_16                
;HAGO LA PRIMERA SUMA (N1+0)=N3
            CALL    BKUP_N1_N2_N3        
;HAGO UNA COPIA DE SEGURIDAD DE TODA LA OPERACION DE SUMA PORQUE A CONTINUCION DEBO HACER UNA RESTA
            CALL    INDI_2_N1            
;PONGO EL INDICE EN N1 CON LA INTENCIÓN DE RESTARLE 1 AL INDICE (INDICE=INDICE-1)
            
CLRF    N2_H                ;PERO DEBE HACERSE EN 16 BITS
            MOVLW    0X01                
;
            
MOVWF    N2_L                ;CARGO N2 CON 0X0001 (0X00 Y 0X01)
            
CALL    RESTA_16C            ;(INDICE=INDICE-1)
            
CALL    N3_2_INDI            ;EL RESULTADO DE LA RESTA LO ALMACENO EN INDICE
            CALL    CHECK_INDI_0
            BTFSC    STATUS
,Z
            
GOTO    FIN_MULTI_16        ;EN CASO DE QUE SE HAYA LLEGADO A 0SIMPLEMENTE SE TERMINA LA OPERACION
            CALL    RSTR_N1_N2_N3        
;EN CASO DE QUE AUN FALTEN CICLOSENTONCES SE RESTAURAN LOS VALORES DE LA SUMA
            CALL    N3_2_N2                
;SE ACUMULA EL VALOR DEL RESULTADO EN N2 (N2=N3)
            GOTO    
LOOP_MULTI_16        ;Y SE REANUDA EL PROCESO
FIN_MULTI_16
            CALL    RSTR_N1_N2_N3        
;DESPUES DE RESTAURAR LOS VALORES EN N3 SE ENCUENTRA LA RESPUESTA
            
RETURN

DIVI_16
            CLRF    COCI_H                
;INICIALIZO EL COCIENTE
            CLRF    COCI_L
LOOP_DIVI_16
            CALL    RESTA_16C            
;INICIO CON UNA RESTA EN 16 BITS
            BTFSS    STATUS
,C            ;CUANDO ME DE UN CARRY NEGATIVOPARO DE "RESTAR"!
            GOTO    
FIN_DIVI_16
            CALL    BKUP_N1_N2_N3        
;HAGO BACKUP PARA PODER OPERAR CON LAS RUTINAS OTROS DATOS
            CALL    COCI_2_N1
            CLRF    N2_H
            MOVLW    0X01                
;LE SUMO EN 16 BITS 1 AL CONTADOR (COCIENTE)
            
MOVWF    N2_L
            CALL    SUMA_16
            CALL    N3_2_COCI            
;COPIO EL RESULTADO DE LA SUMA AL COCIENTE
            CALL    RSTR_N1_N2_N3        
;RESTAURO LAS COPIAS PARA CONTINUAR CON LA DIVISION
            CALL    N3_2_N1
            
GOTO    LOOP_DIVI_16
FIN_DIVI_16
            
RETURN

CHECK_INDI_0
            MOVLW    0X00                
;EN LA MULTIPLICACION DEBO CHEQUEAR CUANDO LA VARIABLE INDICE ME DA 0
            SUBWF    INDI_H
,W
            BTFSS    STATUS
,Z            ;PARA PODER PARAR DE SUMAR
            
GOTO    FIN_CHECK_INDI_0
            MOVLW    0X00                
;COMO ES EN 16 BITSENTONCES TOCA ASEGURARSE POR CADA BYTE
            SUBWF    INDI_L
,W
            BTFSS    STATUS
,Z
            
GOTO    FIN_CHECK_INDI_0
            BSF        STATUS
,Z
            
RETURN
FIN_CHECK_INDI_0
            BCF        STATUS
,Z
            
RETURN


BKUP_N1_N2_N3                            ;RUTINA DE BACK UP
        MOVF    N1_H
,W
        MOVWF    BK1_H
        MOVF    N1_L
,W
        MOVWF    BK1_L
        MOVF    N2_H
,W
        MOVWF    BK2_H
        MOVF    N2_L
,W
        MOVWF    BK2_L
        MOVF    N3_H
,W
        MOVWF    BK3_H
        MOVF    N3_L
,W
        MOVWF    BK3_L
        
RETURN

RSTR_N1_N2_N3                            ;RUTINA DE RESTAURACION
        MOVF    BK1_H
,W
        MOVWF    N1_H
        MOVF    BK1_L
,W
        MOVWF    N1_L
        MOVF    BK2_H
,W
        MOVWF    N2_H
        MOVF    BK2_L
,W
        MOVWF    N2_L
        MOVF    BK3_H
,W
        MOVWF    N3_H
        MOVF    BK3_L
,W
        MOVWF    N3_L
        
RETURN

N2_2_INDI                                ;RUTINAS DE COPIADO ENTRE VARIABLES PARA PODER OPERAR CON LAS MISMAS
        MOVF    N2_H
,W                    ;VARIABLES QUE INICIALMENTE SE NOMBRARON PARA CADA NUMERO N1 N2 N3
        MOVWF    INDI_H
        MOVF    N2_L
,W
        MOVWF    INDI_L
        
RETURN

N3_2_COCI
        MOVF    N3_H
,W
        MOVWF    COCI_H
        MOVF    N3_L
,W
        MOVWF    COCI_L
        
RETURN


INDI_2_N1
        MOVF    INDI_H
,W
        MOVWF    N1_H
        MOVF    INDI_L
,W
        MOVWF    N1_L
        
RETURN

COCI_2_N1
        MOVF    COCI_H
,W
        MOVWF    N1_H
        MOVF    COCI_L
,W
        MOVWF    N1_L
        
RETURN

N3_2_INDI
        MOVF    N3_H
,W
        MOVWF    INDI_H
        MOVF    N3_L
,W
        MOVWF    INDI_L
        
RETURN

N3_2_N2
        MOVF    N3_H
,W
        MOVWF    N2_H
        MOVF    N3_L
,W
        MOVWF    N2_L
        
RETURN

N3_2_N1
        MOVF    N3_H
,W
        MOVWF    N1_H
        MOVF    N3_L
,W
        MOVWF    N1_L
        
RETURN


BORRAR
        MOVLW    .1
        CALL    LCDI
        
RETURN

        
END                       directive 'end of program' 
P.D: alguien me podria enseñar como hago para poner eso en cuadros y no generar esa chorrera de datos?
04/11/2010 #368

Avatar de ByAxel

Etazla dijo: Ver Mensaje
pero fue simulado en que?, la rutina solo del pulsador en mplab es....
Es lógico, en el proteus que es el mismo que usa más arriba... lee y mira todo antes de decir algo.

Con respecto a tu pregunta aunque fue el primer lenguaje que aprendí me da flojera leer todo el asm peeero... intenta evitar mandar los datos al LCD una y otra vez, algo usual es enviarlo cuando el valor del ADC de una canal haya cambiado, eso involucra tener un registro/s donde se compare el valor actual con el anterior y al ser diferente, recién lo muestre en el LCD y actualice el registro de comparación. Otra es usando lo anterior pero con un rango más amplio, es decir por ejemplo si el valor actual es mayor + 10 unidades o menor - 10 unidades al valor anterior, recién lo muestra en el LCD y actualiza el registro... en fin o

saludos
05/11/2010 #369

Avatar de dragondgold

Hola, estoy en el tema de la comunicación infrarroja y tengo un sensor como los de TV en donde un 1 se interpreta por 800us de pulsos a 38KHz. Hice una rutina a la cual le envío el dato y esta me la saca por un pin que yo defino. Entonces si es 1 generar pulsos de 38KHz por 800us aproximadamente y si es un 0 saca simplemente un 0 por el pin antes mencionado. Para esto genero una interrupcion cada 13us en donde cambio el pin de 1 a 0 entonces en el cambio me daria un periodo de 26us = 38KHz. El programa durante la interrupción es bastante rapido pero para salir de la rutina al programa le toma 53uS en salir y si necesito generar un periodo de 26us repetidas veces esto me demora todo. Por que demora tanto si supuestamente se sale inmediatamente de la interrupcion en ASM con la instrucción RETFIE, por que demora tanto en CCS? Me esta volviendo loco. Olvide de decir que el programa calcula el valor que le va al timer de acuerdo a la frecuencia de reloj, esto nos permite tener comunicaciones de infrarrojo a cualquier velocidad de reloj, yo estoy probando en el peor de los casos que es 4MHz, espero puedan ayudarme.

El programa:
Código:
#include <16F84A.H>
#use delay(clock=4M)
#include <XMIT_IR.c>
#define io_port B

INT16 IR;

VOID MAIN (VOID){

set_tris_b(0b00000000);
output_b(0b00000000);
IR = 0b1010101010101010;
ir_init(4);
delay_ms(1000);

   WHILE(1){
ir_write(IR);
delay_ms(3000);
   }
    
}

La rutina:
Código:
#ifndef XMIT_IR
#define XMIT_IR
#define RMIT_PIN PIN_B0
#define XMIT_PIN PIN_B1
#use fast_io(B)


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                        VARIABLES GLOBALES                                                    //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INT FFF = 0;                                                                     //numero a cargar en el timer segun la freq del cristal
INT nt = 0;                                                                      //veces a repetir el periodo para llegar a 800us = 1 bit
INT1 XDF = 0;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                        INTERRUPCION TIMER0                                                   //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#INT_TIMER0                                                                   
VOID TIMER0 (VOID){                                                              //interrupción del timer0
      set_timer0(FFF);
      output_toggle(XMIT_PIN);
      ++nt;
      IF(nt==60){
      disable_interrupts(INT_TIMER0);
      XDF = 1;
      }
      return;
}



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                               PROTOTIPOS DE FUNCIONES                                                        //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VOID ir_write (int16 dato);                                                      //envío de datos                                                    
VOID ir_init (VOID);                                                             //inicialización, debe llamarse antes que otra rutina
INT16 ir_read (VOID);                                                            //leo el dato recibido             

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Esta función envía por un PIN que se define pulsos de 38KHz para un "1" y nada para un "0" para ser enviados  //
//vía infrarrojo, acepta hasta INT16, el pin por donde salen los pulsos es seleccionable. La funcion envía los  //
//bits comenzando por el más significativo el inicio de la transmición esta marcada por un flanco de subida.    //
//Se utiliza el timer0 para la generacion de los pulsos                                                         //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VOID ir_write(int16 dato){

XDF = 0;
INT n;                                                                           //cantidad de bits
output_low(XMIT_PIN);                                                            //inicializo pin de transmición
setup_timer_0(RTCC_DIV_1 | RTCC_INTERNAL);                                       //timer 0 para temporizacion del periodo en modo software
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_timer0(FFF);
WHILE(XDF!=1){}                                                                  //flanco de bajada en el receptor para inicio de TR
nt = 0;
XDF = 0;

   FOR(n=16;n>0;--n){                                                            //voy contando los 16 bits
      IF(bit_test(dato,n)==1){                                                   //si el bit de mayor peso es 1
       set_timer0(FFF);
       enable_interrupts(INT_TIMER0);
         WHILE(XDF!=1){}                                                         //repito 61 veces el periodo con el timer para completar 800uS
       nt = 0;
       XDF = 0;
      }
      
      ELSE{
         disable_interrupts(INT_TIMER0);
         output_low(XMIT_PIN);                                                   //envío un "0"
         delay_us(800);
      }
   }
output_low(XMIT_PIN);                                                            //apago el pin de transmicion
disable_interrupts(INT_TIMER0);                                                  //desabilito las interrupciones                                                                     //dejo al timer0 para ser usado, esta rutina ya no lo usa mas
}  

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Configuro la interrupción para la recepción de datos y configura los tiempos segun la frecuencia de reloj.    //
//INT QQ es la frecuencia de cristal usada (sin dividir por 4) en MHz                                           //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VOID ir_init(FLOAT QQ){

      QQ = QQ / 4;                                                               //frecuencia del reloj /4 para sacar Freq de tarabajo
      QQ = 1 / QQ;                                                               //periodo de la freq de trabajo
      QQ = 13 / QQ;                                                              //saco el valor del timer para generar los 13us
      FFF = 256 - QQ;                                                            //le resto el valor y 256 (8 bits) y obtengo el valor timer
      ext_int_edge(H_TO_L);                                                      //interrupcion por flanco de bajada para la recepcion
      enable_interrupts(INT_EXT);                                                //de datos
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibo datos dentro de la interrupción de hasta INT16, la rutina se sincroniza con la interrupción que se     //
// produce en RB0 por flanco de bajada, debido a esto la funcion debe usarse inmediatamente despues de          //  
// producirse la interrupcion en RB0                                                                            //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INT16 ir_read(VOID){
   
INT16 dato = 0;                                                                  //variable donde se guarda el dato recibido
INT n;                                                                           //cantidad de bits a recibir

      delay_us(900);                                                             //el flanco de bajada indica inicio de transmición, espero
                                                                                 //al siguiente bit y un poco mas para asegurarme estar dentro
                                                                                 //del mismo y no caer sobre el flanco
   FOR(n=16;n>0;--n){                                                            //voy contando los 16 bits
      IF(input(RMIT_PIN)==0){                                                    //si el dato recibido es 0
      bit_set(dato,n);                                                           //pongo a 1 el bit correspondiente del registro ya que
      dato = dato<<1;                                                            //el sensor recibe los datos invertidos, roto una vez a la
      delay_us(900);                                                             //izquierda para ir formando el dato y espero al siguiente
      }                                                                          //bit
      
      ELSE{                                                                      //si el dato recibido es 1 pongo el bit correspondiente
      bit_clear(dato,n);                                                         //a 0 porque el receptor manda los datos invertidos
      dato = dato<<1;                     
      delay_us(900);    
      }
   }
  
   return dato;                                                                  //devuelvo el dato recibido en formato INT16
}
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                            FIN LIBRERIA                                                      //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif
Saludos y gracias!!
05/11/2010 #370

Avatar de ByAxel

En realidad para entrar y salir de una interrupción en los PIC16 se demora porque guarda/restaura el contexto del registro STATUS, PCL, PCLATCH y otras cosas pero a que se demora tanto como dices tendrías que revisar el archivo *.lst que genera al compilar, ahí está todo en ASM y para que se entienda mejor ve a "Options > Project Options > Output Files" y en "List file" escoge "Symbolic".

PD: Para casos precisos es mejor mezclar ambos lenguajes C + ASM.

saludos.
05/11/2010 #371

Avatar de dragondgold

Bueno intente borrar el flag de interrupción en asm y hasta ahi todo bien pero me da un error extraño y no me deja compilar... No hay otra manera? No recuerdo que en ASM se tardara tanto en salir de una interrupcion, yo no hacia todos esos pasos y funcionaba... Ya no se que hacer agote todas las posbilidades la interrupcion era lo que me quedaba y todo iba bien excepto que cuando sale demora demasiado... Alguna idea??

Se los agradezco saludos
05/11/2010 #372

Avatar de ByAxel

Si lo vez bien, genera todo esto para la rutina de interrupción solo al declarar:
Código:
0000:  MOVLW  00
0001:  MOVWF  PCLATH
0002:  GOTO   MAIN
0003:  NOP
0004:  MOVWF  07F
0005:  SWAPF  STATUS,W
0006:  CLRF   STATUS
0007:  MOVWF  21
0008:  MOVF   PCLATH,W
0009:  MOVWF  20
000A:  CLRF   PCLATH
000B:  MOVF   FSR,W
000C:  MOVWF  22
000D:  MOVF   @77,W
000E:  MOVWF  23
000F:  MOVF   @78,W
0010:  MOVWF  24
0011:  MOVF   @79,W
0012:  MOVWF  25
0013:  MOVF   @7A,W
0014:  MOVWF  26
0015:  BCF    STATUS.IRP
0016:  BCF    STATUS.RP0
0017:  BTFSS  INTCON.TMR0IE
0018:  GOTO   01B
0019:  BTFSC  INTCON.TMR0IF
001A:  GOTO   02C
001B:  MOVF   22,W
001C:  MOVWF  FSR
001D:  MOVF   23,W
001E:  MOVWF  @77
001F:  MOVF   24,W
0020:  MOVWF  @78
0021:  MOVF   25,W
0022:  MOVWF  @79
0023:  MOVF   26,W
0024:  MOVWF  @7A
0025:  MOVF   20,W
0026:  MOVWF  PCLATH
0027:  SWAPF  21,W
0028:  MOVWF  STATUS
0029:  SWAPF  07F,F
002A:  SWAPF  07F,W
002B:  RETFIE
002C:  BCF    PCLATH.PCLATH3
002D:  BCF    PCLATH.PCLATH4
002E:  GOTO   02F
Si continuas con el C, creo que debes de hacer la rutina de interrupción manualmente y en ASM, usando directivas como #ORG para ubicar el código en el lugar correcto...
12/11/2010 #373

Avatar de dragondgold

Hola, tengo un array bidimensional que es un imagen para mostrar en un GLCD creada por el programa Bitmap2lcd basic v1.8 el cual crea una imagen en hexadecimal a partir de una imagen JPG o GIF. Tengo la funcion que toma el array bidimensional y me lo va escribiendo en el GLCD para formar la imagen pero si tengo mas de una imagen debo crear muchas de estas funciones con diferentes nombres. Entonces pense en crear el array tridimensional en donde esta tercera indicaria el numero de imagen a mostrar, pero por mas que intento opciones no logra compilar el codigo por que? La idea en sintesis es hacer un array tridimensional a partir de este que tengo para poder seguir agregando mas imagenes. Espero puedan ayudarme:

Código:
VOID IMG_TMAX (VOID){
 char i,j;
 signed char k;
    for( i = 0 ; i < 64 ; i ++ )
   {  
      for( j = 0 ; j < 16 ; j ++)
      {    
         for(k=7;k>-1;k--)
         {      
            if( bit_test(IMAGEN_TMAX[i][j],7-k )) 
               glcd_pixel( j*8+k,i, ON );
               
         }  
      }
   }
}
Como ven para cada imagen deberia cambiar en donde dice IMAGEN_TMAX por el nombre de la otra imagen pero esto se solucionaria con un array tridimensional y simplemente cambiando un numero en una variable.

Este es el array de la imagen:

Código:
CONST INT8 IMAGEN_TMAX [128][16] = {                                             //imagen numero 1 Tmax

 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00                           //128 filas para la imagen
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00                           //16 columnas para la imagen
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x00 , 0x00 , 0x00 , 0x03 , 0xFC , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x03 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x07 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x07 , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x3E , 0x00
 0x00 , 0x00 , 0x00 , 0x0F , 0xE0 , 0x0F , 0xF8 , 0x1F
 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x41 , 0x00
 0x00 , 0x00 , 0x00 , 0x0F , 0xE0 , 0x1F , 0xF8 , 0x3F
 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x9C , 0x80
 0x00 , 0x00 , 0x00 , 0x1F , 0xC0 , 0x1F , 0xF8 , 0x3F
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA2 , 0x80
 0x00 , 0x00 , 0x00 , 0x3F , 0xC0 , 0x1F , 0xF8 , 0x7F
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xBC , 0x80
 0x00 , 0x00 , 0x00 , 0x3F , 0x80 , 0x1F , 0xF8 , 0xFF
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA4 , 0x80
 0x00 , 0x00 , 0x00 , 0x7F , 0x00 , 0x3F , 0xF8 , 0xFF
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA2 , 0x80
 0x00 , 0x00 , 0x00 , 0x7F , 0x00 , 0x3F , 0xF9 , 0xFF
 0xC0 , 0x3F , 0xE0 , 0x3F , 0xCF , 0xE0 , 0x41 , 0x00
 0x00 , 0x00 , 0x00 , 0xFE , 0x00 , 0x7F , 0xFB , 0xFF
 0xC0 , 0xFF , 0xF0 , 0x3F , 0xDF , 0xE0 , 0x3E , 0x00
 0x00 , 0x00 , 0x01 , 0xFE , 0x00 , 0x7F , 0xFF , 0xFF
 0x81 , 0xFF , 0xF8 , 0x3F , 0x9F , 0xE0 , 0x00 , 0x00
 0x00 , 0x00 , 0x01 , 0xFC , 0x00 , 0x7F , 0xFF , 0xFF
 0x83 , 0xFF , 0xF8 , 0x7F , 0xBF , 0xC0 , 0x00 , 0x00
 0x00 , 0x00 , 0x03 , 0xFC , 0x00 , 0xFF , 0xFF , 0xFF
 0x87 , 0xFF , 0xF8 , 0x7F , 0x3F , 0xC0 , 0x00 , 0x00
 0x00 , 0x00 , 0x03 , 0xF8 , 0x00 , 0xFF , 0xFF , 0xFF
 0x0F , 0xFF , 0xF8 , 0x7F , 0x3F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x07 , 0xF0 , 0x01 , 0xFF , 0xFF , 0xFF
 0x0F , 0xFF , 0xF8 , 0xFF , 0x3F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x07 , 0xF0 , 0x01 , 0xFF , 0xFF , 0xFF
 0x0F , 0xF3 , 0xF8 , 0xFE , 0x7F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x0F , 0xE0 , 0x01 , 0xFF , 0xFF , 0xFE
 0x1F , 0xE7 , 0xF0 , 0xFE , 0x7F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x1F , 0xC0 , 0x03 , 0xFF , 0xFF , 0xFE
 0x1F , 0xC7 , 0xF0 , 0xFF , 0xFF , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x1F , 0xC0 , 0x03 , 0xFF , 0xFF , 0xFE
 0x1F , 0xCF , 0xE0 , 0xFF , 0xFE , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x3F , 0x80 , 0x03 , 0xFF , 0xFF , 0xFC
 0x1F , 0xFF , 0xE0 , 0xFF , 0xFC , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x7F , 0x80 , 0x07 , 0xFF , 0xFF , 0xFC
 0x3F , 0xFF , 0xE0 , 0xFF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x7F , 0x00 , 0x07 , 0xFD , 0xEF , 0xF8
 0x3F , 0xFF , 0xE1 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0xFF , 0x00 , 0x07 , 0xFD , 0xCF , 0xF8
 0x7F , 0xFF , 0xC3 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0xFE , 0x00 , 0x0F , 0xF9 , 0x9F , 0xF8
 0x7F , 0xFF , 0xC7 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xFE , 0x00 , 0x0F , 0xF8 , 0x1F , 0xF0
 0x7F , 0x3F , 0x87 , 0xF3 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xFC , 0x00 , 0x0F , 0xF0 , 0x3F , 0xF0
 0xFE , 0x3F , 0x8F , 0xE7 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x03 , 0xF8 , 0x00 , 0x1F , 0xF0 , 0x3F , 0xF0
 0xFE , 0x3F , 0x8F , 0xE7 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x03 , 0xF8 , 0x00 , 0x1F , 0xE0 , 0x3F , 0xE1
 0xFC , 0x7F , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x07 , 0xF0 , 0x00 , 0x3F , 0xE0 , 0x7F , 0xE1
 0xFC , 0x7F , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x0F , 0xE0 , 0x00 , 0x3F , 0xE0 , 0x7F , 0xE1
 0xFC , 0xFE , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x07 , 0xE0 , 0x00 , 0x3F , 0xE0 , 0xFF , 0xC3
 0xF8 , 0xFE , 0x1F , 0x9F , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xE0 , 0x00 , 0x7F , 0xC0 , 0xFF , 0xC3
 0xF8 , 0xFE , 0x3F , 0x9F , 0xE0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x40 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
};
13/11/2010 #374

Avatar de george.manson.69

dragondgold dijo: Ver Mensaje
Hola, tengo un array bidimensional que es un imagen para mostrar en un GLCD creada por el programa Bitmap2lcd basic v1.8 el cual crea una imagen en hexadecimal a partir de una imagen JPG o GIF. Tengo la funcion que toma el array bidimensional y me lo va escribiendo en el GLCD para formar la imagen pero si tengo mas de una imagen debo crear muchas de estas funciones con diferentes nombres. Entonces pense en crear el array tridimensional en donde esta tercera indicaria el numero de imagen a mostrar, pero por mas que intento opciones no logra compilar el codigo por que? La idea en sintesis es hacer un array tridimensional a partir de este que tengo para poder seguir agregando mas imagenes. Espero puedan ayudarme:

Código:
VOID IMG_TMAX (VOID){
 char i,j;
 signed char k;
    for( i = 0 ; i < 64 ; i ++ )
   {  
      for( j = 0 ; j < 16 ; j ++)
      {    
         for(k=7;k>-1;k--)
         {      
            if( bit_test(IMAGEN_TMAX[i][j],7-k )) 
               glcd_pixel( j*8+k,i, ON );
               
         }  
      }
   }
}
Como ven para cada imagen deberia cambiar en donde dice IMAGEN_TMAX por el nombre de la otra imagen pero esto se solucionaria con un array tridimensional y simplemente cambiando un numero en una variable.

Este es el array de la imagen:

Código:
CONST INT8 IMAGEN_TMAX [128][16] = {                                             //imagen numero 1 Tmax

 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00                           //128 filas para la imagen
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00                           //16 columnas para la imagen
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
 0x00 , 0x00 , 0x00 , 0x03 , 0xFC , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x03 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x07 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x07 , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x3E , 0x00
 0x00 , 0x00 , 0x00 , 0x0F , 0xE0 , 0x0F , 0xF8 , 0x1F
 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x41 , 0x00
 0x00 , 0x00 , 0x00 , 0x0F , 0xE0 , 0x1F , 0xF8 , 0x3F
 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x9C , 0x80
 0x00 , 0x00 , 0x00 , 0x1F , 0xC0 , 0x1F , 0xF8 , 0x3F
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA2 , 0x80
 0x00 , 0x00 , 0x00 , 0x3F , 0xC0 , 0x1F , 0xF8 , 0x7F
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xBC , 0x80
 0x00 , 0x00 , 0x00 , 0x3F , 0x80 , 0x1F , 0xF8 , 0xFF
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA4 , 0x80
 0x00 , 0x00 , 0x00 , 0x7F , 0x00 , 0x3F , 0xF8 , 0xFF
 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xA2 , 0x80
 0x00 , 0x00 , 0x00 , 0x7F , 0x00 , 0x3F , 0xF9 , 0xFF
 0xC0 , 0x3F , 0xE0 , 0x3F , 0xCF , 0xE0 , 0x41 , 0x00
 0x00 , 0x00 , 0x00 , 0xFE , 0x00 , 0x7F , 0xFB , 0xFF
 0xC0 , 0xFF , 0xF0 , 0x3F , 0xDF , 0xE0 , 0x3E , 0x00
 0x00 , 0x00 , 0x01 , 0xFE , 0x00 , 0x7F , 0xFF , 0xFF
 0x81 , 0xFF , 0xF8 , 0x3F , 0x9F , 0xE0 , 0x00 , 0x00
 0x00 , 0x00 , 0x01 , 0xFC , 0x00 , 0x7F , 0xFF , 0xFF
 0x83 , 0xFF , 0xF8 , 0x7F , 0xBF , 0xC0 , 0x00 , 0x00
 0x00 , 0x00 , 0x03 , 0xFC , 0x00 , 0xFF , 0xFF , 0xFF
 0x87 , 0xFF , 0xF8 , 0x7F , 0x3F , 0xC0 , 0x00 , 0x00
 0x00 , 0x00 , 0x03 , 0xF8 , 0x00 , 0xFF , 0xFF , 0xFF
 0x0F , 0xFF , 0xF8 , 0x7F , 0x3F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x07 , 0xF0 , 0x01 , 0xFF , 0xFF , 0xFF
 0x0F , 0xFF , 0xF8 , 0xFF , 0x3F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x07 , 0xF0 , 0x01 , 0xFF , 0xFF , 0xFF
 0x0F , 0xF3 , 0xF8 , 0xFE , 0x7F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x0F , 0xE0 , 0x01 , 0xFF , 0xFF , 0xFE
 0x1F , 0xE7 , 0xF0 , 0xFE , 0x7F , 0x80 , 0x00 , 0x00
 0x00 , 0x00 , 0x1F , 0xC0 , 0x03 , 0xFF , 0xFF , 0xFE
 0x1F , 0xC7 , 0xF0 , 0xFF , 0xFF , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x1F , 0xC0 , 0x03 , 0xFF , 0xFF , 0xFE
 0x1F , 0xCF , 0xE0 , 0xFF , 0xFE , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x3F , 0x80 , 0x03 , 0xFF , 0xFF , 0xFC
 0x1F , 0xFF , 0xE0 , 0xFF , 0xFC , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x7F , 0x80 , 0x07 , 0xFF , 0xFF , 0xFC
 0x3F , 0xFF , 0xE0 , 0xFF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x7F , 0x00 , 0x07 , 0xFD , 0xEF , 0xF8
 0x3F , 0xFF , 0xE1 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0xFF , 0x00 , 0x07 , 0xFD , 0xCF , 0xF8
 0x7F , 0xFF , 0xC3 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0xFE , 0x00 , 0x0F , 0xF9 , 0x9F , 0xF8
 0x7F , 0xFF , 0xC7 , 0xFF , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xFE , 0x00 , 0x0F , 0xF8 , 0x1F , 0xF0
 0x7F , 0x3F , 0x87 , 0xF3 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xFC , 0x00 , 0x0F , 0xF0 , 0x3F , 0xF0
 0xFE , 0x3F , 0x8F , 0xE7 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x03 , 0xF8 , 0x00 , 0x1F , 0xF0 , 0x3F , 0xF0
 0xFE , 0x3F , 0x8F , 0xE7 , 0xF8 , 0x00 , 0x00 , 0x00
 0x00 , 0x03 , 0xF8 , 0x00 , 0x1F , 0xE0 , 0x3F , 0xE1
 0xFC , 0x7F , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x07 , 0xF0 , 0x00 , 0x3F , 0xE0 , 0x7F , 0xE1
 0xFC , 0x7F , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x0F , 0xE0 , 0x00 , 0x3F , 0xE0 , 0x7F , 0xE1
 0xFC , 0xFE , 0x1F , 0xCF , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x07 , 0xE0 , 0x00 , 0x3F , 0xE0 , 0xFF , 0xC3
 0xF8 , 0xFE , 0x1F , 0x9F , 0xF0 , 0x00 , 0x00 , 0x00
 0x00 , 0x01 , 0xE0 , 0x00 , 0x7F , 0xC0 , 0xFF , 0xC3
 0xF8 , 0xFE , 0x3F , 0x9F , 0xE0 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x40 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
};

Mira una manera eficaz es realizar una funcion usando punteros, te propongo que empieces a busacar como funcionan los punteros, eso seria una solucion muy optima.

Código:
void Glcd_image(const unsigned char *ptr){

 char i,j;
  signed char k;
       for( j = 0 ; j < 16 ; j ++)
       {    
          for(k=7;k>-1;k--)
          {      
             if( bit_test(&ptr,7-k )) 
                glcd_pixel( j*8+k,i, ON );
                
          }  
       }

}
y asi si tienes dos imagenes del mismo tamañano. solo tendrias que llmar una sola funcion pero diferentes imagenes, las imagenes etaran guardadas en la memoria de programa . por eso se pone un puntero que apunte a la memoria de programa

por ejemplo.

Glcd_image(imagen1);
Glcd_image(imagen2);

y asi...seria una solucion muy optima, checa a lo mejor esa seria una solucion.

Saludos
13/11/2010 #375

Avatar de dragondgold

Huuuuy gracias ya habia intentado con punteros pero me decia que estaba intentando crear un puntero para una variable CONST y no me dejaba, ahora lo pruebo, y ya encontre como hacer el array tridimencional!!

Edito: no debería ser if( bit_test(*ptr,7-k )) ? en ves de if( bit_test(&ptr,7-k )) ? porque usas & en ves *? Si supuestamente se comprueba el bit de la variable que guarde el puntero...

Saludos
14/11/2010 #376

Avatar de george.manson.69

dragondgold dijo: Ver Mensaje
Huuuuy gracias ya habia intentado con punteros pero me decia que estaba intentando crear un puntero para una variable CONST y no me dejaba, ahora lo pruebo, y ya encontre como hacer el array tridimencional!!

Edito: no debería ser if( bit_test(*ptr,7-k )) ? en ves de if( bit_test(&ptr,7-k )) ? porque usas & en ves *? Si supuestamente se comprueba el bit de la variable que guarde el puntero...

Saludos
VOID IMG_TMAX (const unsigned char *ptr, unsigned char ON){
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(*ptr,7-k ))
glcd_pixel( j*8+k,i, ON );

}
*ptr++; //faltaba poner esto
}
}
}
Asi lo tengo en mi programita, ya lo probe y funciona, y si estaba bien como tu decias me habia equivocado error de dedo jeje.

saludos
15/11/2010 #377

Avatar de dragondgold

George me dice "Expecting an identifier" señalando en donde declaro al puntero en la funcion, me hacia exactamente lo mismo por eso no utilize punteros. No se por que me da ese error no se que me falta declara, me gusta la idea de los punteros porque con la matriz tridimensional es bastante lento en buscar y dibujar la imagen...

Saludos
16/11/2010 #378

Avatar de dragondgold

george.manson no se como funcionó tu codigo, estuve leyendo y el CCS no admite punteros a constantes, que mal otro punto en contra al CCS =(

Saludos!!
17/11/2010 #379

Avatar de george.manson.69

dragondgold dijo: Ver Mensaje
george.manson no se como funcionó tu codigo, estuve leyendo y el CCS no admite punteros a constantes, que mal otro punto en contra al CCS =(

Saludos!!
Ok! bueno yo esty usando el compilador Hi tech, y me funciono de 100, pero no lo probe con el CCS C.
Pero debe de funcionar en CCS C.

En el arreglo de la imagen tienes por ejemplo

const int image[64][16];? bueno en el que yo tengo en HI tech le puse const unsigned char image[1024].

cambie la definicion del arreglo de la imgen por este:

const int image[1024] por si no lo tienes de esta manera, en el tema de Programas hecho en C18 he subido a lo similar si gustas pasar por el tema.

Saludos
17/11/2010 #380

Avatar de dragondgold

Podrias pasarme el programa que hiciste asi lo reviso por favor? Funciona la rutina de crear la imagen poniendo solo [1024] en ves de [128][16]? Mande un mail a CCS y me respondieron que se podia crear punteros a constates cambiando el CONST por ROM y que tambien pueden crearse punteros a funciones

Muchas gracias!!
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.