Autor Tema: Intrucción parecida a la SHIFTOUT de Pic Basic en C18  (Leído 5412 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« en: 13 de Septiembre de 2010, 21:55:53 »
Hola que tal foro;

Alguno sabe si hay alguna instrucción parecida a la de SHIFTOUT de PICBASIC en c18 o algun metodo de realizar algo se le asemeje?

La instrucción de SHIFTOUT desplaza en forma sincróna el contenido de una variable sobre un DataPin y un ClockPin....

Saludos :shock:
Lo que no me destruye, me fortalece

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #1 en: 14 de Septiembre de 2010, 00:20:28 »
Este codigo es para CCS, creo que podes adaptarlo acorde tu necesidad:

Código: C
  1. #define PIN_CK   PIN_A0
  2. #define PIN_DT   PIN_A1
  3. #define DELAY_US 10
  4.  
  5. void shiftout(byte orden, byte valor)
  6. {
  7.     byte b = orden == LSBFIRST? 1: 128;
  8.     while(b) {
  9.         if(valor & b)
  10.             output_high(PIN_DT);
  11.         else
  12.             output_low(PIN_DT);
  13.         output_high(PIN_CK);
  14.         delay_us(DELAY_US);
  15.         output_low(PIN_CK);
  16.         if(orden == LSBFIRST)    
  17.             b <<= 1;
  18.         else
  19.             b >>= 1;
  20.     }
  21. }
@fabianjsm is on twitter

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #2 en: 14 de Septiembre de 2010, 00:54:33 »
No directa, pero puedes implementar algo como lo que muestra fabianjm. La idea es un for para recorrer los 8 bits del byte, rotar hacia la derecha o la izquierda, y dependiendo del valor del bit leido, cargar en el puerto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #3 en: 14 de Septiembre de 2010, 12:45:21 »
Hola tal;

Gracias por el post, pero tengo una duda para terminar de adaptarlo de C18

Me podrian decir que es lo que hace:

    -byte b = orden == LSBFIRST? 1: 128;  (Que es lo que se hace en este renglon en ccs)
    -Orden es un valor de 0 - 7?
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #4 en: 14 de Septiembre de 2010, 13:03:38 »
No, es 0 o 1. Pregunta, quieres enviar primero, el menos significativo o el más significativo?

Solo que le falto definir LSBFIRST.

Es identico a:

Código: C
  1. #define LSBFIRST 0
  2.  
  3. void shiftout(byte orden, byte valor)
  4. {
  5.     byte b:
  6.  
  7.     if(orden==LSBFIRST){
  8.         b=1;
  9.     }else{
  10.         b=128;
  11.     }
  12.     // ...


Saludos!


No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #5 en: 14 de Septiembre de 2010, 13:12:21 »
Hola Suky es el menos significativo el que quiero enviar:

Segun yo el codigo traducido a C18 quedaria asi:

Código: [Seleccionar]
void shiftout(unsigned char orden,unsigned char valor)
{
    unsigned char b = orden == LSBFIRST? 1: 128;
    while(b) {
        if(valor & b)
            DATA_LCD=1;
        else
            DATA_LCD=0;
        CLK_LCD=1;
        Delay10KTCYx(300000);
        CLK_LCD=0;
        if(orden == LSBFIRST)   
            b <<= 1;
        else
            b >>= 1;
    }
}

mas no se si este correcto....

con orden que es lo que se manipula?

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #6 en: 14 de Septiembre de 2010, 13:15:17 »
Como dije anteriormente, que bit deseas enviar primero.  Por lo visto, así como los has traducido está bien.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #7 en: 14 de Septiembre de 2010, 22:00:05 »
Hola que tal;

Primeramente quiero agradecerles por la ayuda ya que gracias a este foro he logrado hechar a andar muchas cosas que desconocia de los microcontroladores y pues aqui nuevamente ando molestandolos ya que quiero hechar a andar un LCD de crystal liquido por medio de un driver el cual es el MM5452N pero no logro que los datos se desplieguen en orden..... Se que el codigo anteriormente citado funciona correctamente, ya que si le envio algun numero me lo despliega en alguna parte del display pero aun no logro hacerlo que aparezcan en orden... No se si ustedes podrian sugerirme hacer algo con esto; ya que tengo todo el dia batallando y no doy con el clavo.

Saludos

Este es el link del integrado que uso: http://www.national.com/ds/MM/MM5453.pdf
Lo que no me destruye, me fortalece

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #8 en: 15 de Septiembre de 2010, 00:17:05 »
Disculpa Palomino86, estuve unos dias estudiando a full, de todos modos las respuestas te las dio Suky.
Con respecto a esta línea
Código: C
  1. unsigned char b = orden == LSBFIRST? 1: 128;
Es ANSI C, el operador ternario, en C18 funciona.
Me olvide de la definición de LSBFIRST (su función la explico Suky)
Código: C
  1. #define LSBFIRST 1
  2. #define MSBFIRST 2
No importan los valores en si de estas macros, basta que sean diferentes.
Ejemplo:
Código: C
  1. shiftout(LSBFIRST, 0xFF);
  2. shiftout(MSBFIRST, 0xFF);

Con respecto al MM5453, puede ser que no estes pulsando DATA ENABLE (subir y volver a bajar para  para señalar el inicio), si adjuntas tu codigo en un post, talvez podamos ayudarte.
@fabianjsm is on twitter

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #9 en: 15 de Septiembre de 2010, 13:21:11 »
Hola que tal chicos;

Este es el codigo que estoy utilizando para la manipulacion del display de crystal

Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

#define CLK_LCD PORTBbits.RB6
#define DATA_LCD PORTBbits.RB7
#define DATA_ENABLE_0 PORTBbits.RB5
#define DATA_ENABLE_1 PORTAbits.RA2
#define DATA_ENABLE_2 PORTEbits.RE0
#define LSBFIRST 0
#define TOTALIZADOR PORTDbits.RD4

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);
void LCD_cmd(const rom char *mensaje, int c);
void shiftout(unsigned char orden,unsigned char valor);
void Delay_ms(unsigned t);

char x[20];
unsigned char valor1;
unsigned char valor2;
unsigned char valor3;
unsigned char valor4;

void main(void)
{
TRISA=0b00000000;
    TRISB=0b00000000;
TRISC=0b00000000;
    TRISD=0b00000000;
TRISE=0b000;
ADCON1=15;
Delay_ms(1000);
    OpenUART();
LCD_cmd("Hola Mundo",10);
valor1=0x4F;
shiftout(0,valor1);
TOTALIZADOR=1;
Delay_ms(1);
TOTALIZADOR=0;
//while(1){}
}

void shiftout(unsigned char orden,unsigned char valor)
{
    unsigned char b;
b=orden;
if(orden==LSBFIRST)
{
b=1;
}
else
{
b=128;
}

DATA_ENABLE_0=0;
while(b) {
        if(valor & b){
            DATA_LCD=1;
}
        else{
            DATA_LCD=0;
        CLK_LCD=1;
        CLK_LCD=0;
}
        if(orden == LSBFIRST)   
            b <<= 1;
        else
            b >>= 1;
    }
DATA_ENABLE_0=1;
}

void DelayTXBitUART(void)
{
Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
Delay10TCYx(52);
}

void LCD_cmd(const rom char *mensaje, int c)
{
int x;
for (x=0;x<c;x++)
{
WriteUART(mensaje[x]);
}
WriteUART('\0');
}

void Delay_ms(unsigned t)
{
while(t--)
{
Delay100TCYx(50);
}
}

y con el cual aun no logro hecharlo andar

Saludos
Lo que no me destruye, me fortalece

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #10 en: 16 de Septiembre de 2010, 05:09:54 »
No vas a conseguir nada enviando solo 8 bits  :(
Hoja de datos: The 32 data bits are latched after the 36th clock is complete.
Tenes que enviar un bit de start precediendo a 32 bits de datos, mas algunos ceros hasta completar 36 pulsos de reloj.
Con el flanco ascendente de la última señal de reloj (la 36) el MM5452 genera internamente la señal LOAD que copia los datos del registro de desplazamiento al latch del dislplay.

Podes hacer una funcion que reciba los digitos que queres enviar al MM5452 y los envie en el formato de 32 bits requerido haciendo llamadas a shiftout (a proposito, en la funcion shiftout no estas enviando la señal de reloj cuando DATA_LCD vale 1). Como el MM5452 recibe en formato 7-seg listo para mostrar, tu funcion podria recibir los digitos en formato decimal y convertilos a 7-seg para que sea facil utilizarla.
« Última modificación: 16 de Septiembre de 2010, 05:11:58 por fabianjm »
@fabianjsm is on twitter

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #11 en: 17 de Septiembre de 2010, 15:38:21 »
Hola que tal;


Ahora mi problema es enviar un solo bit... Ya suky  me dijo como declar un bit en C18. Pero si reutilizo la rutina para envio de bytes me estara mandando 8 bit aun cuando yo le mande un byte... Quisiera saber que le tengo que cambia a la estructura de esta rutina para que solamente me envie 1 bit... y asi poder terminar de hechar andar mi display....

La funcion es la siguiente: :P
Código: [Seleccionar]
void shiftout(unsigned char orden,unsigned char valor)
{
    unsigned char b;     
b=orden;
if(orden==LSBFIRST)
b=1;
else
b=128;

while(b)
{
        if(valor & b)
            DATA_LCD=1;
        else
            DATA_LCD=0;
        CLK_LCD=1;
Delay_ms(1);
CLK_LCD=0;
        if(orden == LSBFIRST)   
            b <<= 1;
        else
            b >>= 1;
    }
}

Le hice estas modificaciones pero aun no me corre bien: :x

Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

#define CLK_LCD PORTBbits.RB6
#define DATA_LCD PORTBbits.RB7
#define DATA_ENABLE_0 PORTBbits.RB5
#define DATA_ENABLE_1 PORTAbits.RA2
#define DATA_ENABLE_2 PORTEbits.RE0
#define LSBFIRST 0
#define TOTALIZADOR PORTDbits.RD4

typedef enum _BOOL{ FALSE = 0, TRUE } BOOL;   
BOOL Bit;
BOOL Bit2;
BOOL orden1;

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);
void LCD_cmd(const rom char *mensaje, int c);
void shiftout(unsigned char orden,unsigned char valor);
void Delay_ms(unsigned t);
void shiftout2(BOOL orden1,BOOL Bit2);

char x[20];
unsigned char valor1;
unsigned char valor2;
unsigned char valor3;
unsigned char valor4;
unsigned char valor5;
unsigned char valor6;

void main(void)
{
TRISA=0b00000000;
    TRISB=0b00000000;
TRISC=0b00000000;
    TRISD=0b00000000;
TRISE=0b000;
ADCON1=15;
Delay_ms(1000);
    OpenUART();
LCD_cmd("Hola Mundo",10);

DATA_ENABLE_0=0;
Bit=TRUE;
shiftout2(FALSE,Bit);
valor1=0x66;
shiftout(0,valor1);
valor2=0x66;
shiftout(0,valor2);
valor3=0x66;
shiftout(0,valor3);
valor4=0x66;
shiftout(0,valor4);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
DATA_ENABLE_0=1;

DATA_ENABLE_1=0;
Bit=TRUE;
shiftout2(FALSE,Bit);
valor5=0x66;
shiftout(0,valor5);
valor6=0x66;
shiftout(0,valor6);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=FALSE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
Bit=TRUE;
shiftout2(FALSE,Bit);
DATA_ENABLE_1=1;

TOTALIZADOR=1;
Delay_ms(1);
TOTALIZADOR=0;
//while(1){}
}

void shiftout(unsigned char orden,unsigned char valor)
{
    unsigned char b;     
b=orden;
if(orden==LSBFIRST)
b=1;
else
b=128;

while(b)
{
        if(valor & b)
            DATA_LCD=1;
        else
            DATA_LCD=0;
        CLK_LCD=1;
Delay_ms(1);
CLK_LCD=0;
        if(orden == LSBFIRST)   
            b <<= 1;
        else
            b >>= 1;
    }
}

void shiftout2(BOOL orden1,BOOL Bit2)
{
BOOL b;
b=orden1;
if(orden1==LSBFIRST)
b=1;
else
b=128;

while(b)
{
        if(Bit2 & b)
            DATA_LCD=1;
        else
            DATA_LCD=0;
        CLK_LCD=1;
Delay_ms(1);
CLK_LCD=0;
        if(orden1 == LSBFIRST)   
            b <<= 1;
        else
            b >>= 1;
    }
}

void DelayTXBitUART(void)
{
Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
Delay10TCYx(52);
}

void LCD_cmd(const rom char *mensaje, int c)
{
int x;
for (x=0;x<c;x++)
{
WriteUART(mensaje[x]);
}
WriteUART('\0');
}

void Delay_ms(unsigned t)
{
while(t--)
{
Delay100TCYx(50);
}
}


Provisionalmente realice así mi código para pruebas jejejje esta algo extenso, primero quiero que me  funcione para después simplificarlo :shock:.

Saludos!!!!! :-/
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #12 en: 17 de Septiembre de 2010, 15:45:44 »
Pero primero dedícate a entender como funciona la rutina que te han mostrado. Un tips, para enviar el byte se va rotando para seleccionar un bit a la vez. Una simulación detallada, paso a paso, en proteus te puede ayudar.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Intrucción parecida a la SHIFTOUT de Pic Basic en C18
« Respuesta #13 en: 25 de Septiembre de 2010, 14:40:46 »
Funciones para la manipulación de 3 drivers (MM5452N) para LCD de cristal:

Funciones que habilitan los drivers individualmente
Código: [Seleccionar]
void Crystal_LCD_1(unsigned char bit_ini,unsigned char dig_1,unsigned char dig_2,unsigned char dig_3,unsigned char dig_4,unsigned char relleno_1,unsigned char relleno_2,unsigned char relleno_3,unsigned char relleno_4,unsigned char relleno_5,unsigned char relleno_6,unsigned char relleno_7)
{   
DATA_ENABLE_1=0;
//Delay_ms(1);
pulso_reloj(bit_ini);
Datos_LCD_Cristal(dig_1);
Datos_LCD_Cristal(dig_2);
Datos_LCD_Cristal(dig_3);
Datos_LCD_Cristal(dig_4);
pulso_reloj(relleno_1);
pulso_reloj(relleno_2);
pulso_reloj(relleno_3);
pulso_reloj(relleno_4);
pulso_reloj(relleno_5);
pulso_reloj(relleno_6);
pulso_reloj(relleno_7);
//Delay_ms(1);
DATA_ENABLE_1=1;
}

void Crystal_LCD_2(unsigned char bit_ini,unsigned char dig_5,unsigned char dig_6,unsigned char dig_11,unsigned char dig_12,unsigned char relleno_1,unsigned char relleno_2,unsigned char relleno_3,unsigned char relleno_4,unsigned char relleno_5,unsigned char relleno_6,unsigned char relleno_7)
{
DATA_ENABLE_2=0;
//Delay_ms(1);
pulso_reloj(bit_ini);
Datos_LCD_Cristal(dig_5);
Datos_LCD_Cristal(dig_6);
Datos_LCD_Cristal(dig_11);
Datos_LCD_Cristal(dig_12);
pulso_reloj(relleno_1);
pulso_reloj(relleno_2);
pulso_reloj(relleno_3);
pulso_reloj(relleno_4);
pulso_reloj(relleno_5);
pulso_reloj(relleno_6);
pulso_reloj(relleno_7);
//Delay_ms(1);
    DATA_ENABLE_2=1;
}

void Crystal_LCD_3(unsigned char bit_ini,unsigned char dig_7,unsigned char dig_8,unsigned char dig_9,unsigned char dig_10,unsigned char relleno_1,unsigned char relleno_2,unsigned char relleno_3,unsigned char relleno_4,unsigned char relleno_5,unsigned char relleno_6,unsigned char relleno_7)
{
DATA_ENABLE_3=0;
//Delay_ms(1);
pulso_reloj(bit_ini);
Datos_LCD_Cristal(dig_7);
Datos_LCD_Cristal(dig_8);
Datos_LCD_Cristal(dig_9);
Datos_LCD_Cristal(dig_10);
pulso_reloj(relleno_1);
pulso_reloj(relleno_2);
pulso_reloj(relleno_3);
pulso_reloj(relleno_4);
pulso_reloj(relleno_5);
pulso_reloj(relleno_6);
pulso_reloj(relleno_7);
//Delay_ms(1);
    DATA_ENABLE_3=1;
}

Función de selecciona en numero a desplegar:
Código: [Seleccionar]
void Datos_LCD_Cristal(unsigned char valor)
{
unsigned int i,b,n;
switch(valor)
{
case 0:
for(i=0;i<6;i++)
   {pulso_reloj(1);}
pulso_reloj(0);
break;
case 1:
pulso_reloj(0);
for(i=0;i<2;i++)
   {pulso_reloj(1);}
for(i=0;i<4;i++)
   {pulso_reloj(0);}
break;
case 2:
for(i=0;i<2;i++)
       {pulso_reloj(1);}
pulso_reloj(0);
for(i=0;i<2;i++)
               {pulso_reloj(1);}
pulso_reloj(0);
pulso_reloj(1);
break;
case 3:
for(i=0;i<4;i++)
   {pulso_reloj(1);}
for(i=0;i<2;i++)
   {pulso_reloj(0);}
pulso_reloj(1);
break;
case 4:
pulso_reloj(0);
for(i=0;i<2;i++)
   {pulso_reloj(1);}
for(i=0;i<2;i++)
               {pulso_reloj(0);}
for(i=0;i<2;i++)
               {pulso_reloj(1);}
break;
case 5:
pulso_reloj(1);
pulso_reloj(0);
for(i=0;i<2;i++)
   {pulso_reloj(1);}
pulso_reloj(0);
for(i=0;i<2;i++)
   {pulso_reloj(1);}
break;
case 6:
pulso_reloj(1);
pulso_reloj(0);
for(i=0;i<5;i++)
   {pulso_reloj(1);}
break;
case 7:
for(i=0;i<3;i++)
               {pulso_reloj(1);}
for(i=0;i<4;i++)
   {pulso_reloj(0);}
break;
case 8:
for(i=0;i<7;i++)
               {pulso_reloj(1);}
break;
case 9:
for(i=0;i<3;i++)
   {pulso_reloj(1);}
for(i=0;i<2;i++)
               {pulso_reloj(0);}
for(i=0;i<2;i++)
   {pulso_reloj(1);}
break;
}
}

Funcion de pulso de reloj:
Código: [Seleccionar]
void pulso_reloj(unsigned char valor)
{
unsigned char b;
    if(valor==1)
            {DATA_LCD=1;}
        else
            {DATA_LCD=0;}
CLK_LCD=1;
CLK_LCD=0;
            b <<= 1; 
}
Lo que no me destruye, me fortalece


 

anything