# Primeros pasos con PIC (MikroC)



## sento87 (Oct 9, 2010)

Hola amigos:
Estoy intentando hacer un programa para que simplemente parpadee un led, con un 18F2550, con el oscilador interno.
Todo esto mediante el MikroC pero no lo consigo de ninguna manera, por que al compilar (Build) me dice que las variables no estan definidas.

```
void main() {
  ANSEL  = 0;            // Configure AN pins as digital
  ANSELH = 0;
  C1ON_bit = 0;          // Disable comparators
  C2ON_bit = 0;

  TRISA = 0x00;          // set direction to be output
  TRISB = 0x00;          //  set direction to be output
  TRISC = 0x00;          // set direction to be output
  TRISD = 0x00;          // set direction to be output

  while(1) {
    PORTA = 0x00;        // Turn OFF LEDs on PORTA
    PORTB = 0x00;        // Turn OFF LEDs on PORTB
    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    PORTD = 0x00;        // Turn OFF LEDs on PORTD
    Delay_ms(1000);      // 1 second delay

    PORTA = 0xFF;        // Turn ON LEDs on PORTA
    PORTB = 0xFF;        // Turn ON LEDs on PORTB
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    PORTD = 0xFF;        // Turn ON LEDs on PORTD
    Delay_ms(1000);      // 1 second delay
  }
}
```

Como veis en el programa parpadearán todos los puertos del PIC

Message No. 324 --> Undeclared identifier 'ANSEL' in expression

y lo repite con cada uno de los comandos.
Para vuestra información estoy utilizando la demo que permite programas de 2kB.

Para configurar lo del oscilador interno, le he dado a edit programa y donde poner Oscillator le he puesto "intosc:Usb-hs" a 8Mhz

Un saludo!


----------



## ByAxel (Oct 9, 2010)

Que tal:
- El registro ANSEL no existe en este PIC, revisa el datasheet del PIC18F2550.
- En el MikroC y todos los de Mikroelektronika se debe crear proyecto desde la opción "Project > New Project".
- Para 8Mhz interno, configuras en los fuses y dentro del programa debes de configurar el registro OSCCON, los bits (4, 5 y 6).

saludos


----------



## sento87 (Oct 9, 2010)

Muy buenas Axel muchas gracias por contestar.
Si que creo el programa mediante new project. ahí es donde configuro la velocidad del oscilador y donde quiero guardar el proyecto.

Con lo que no me aclaro mucho es con el datasheet del PIC he estado leyéndolo pero no lo entiendo.

El registro ANSEL lo saqué del los examples que lleva el propio MikroC.

Sabía que algo de OSCCON había que poner, pero es que el mayor problema que tengo es que no se como se configura, que comandos tengo que poner, No lo veo en el datasheet.

Me vendría muy bien un programa tipo sabeis de donde podría mirarlo de un 18F2550 en mikroC.

Es que tengo conocimientos de C, pero no encuentro el sitio donde mirar la configuración...

En el Datasheet he visto esto:

```
OSCCON: OSCILLATOR CONTROL REGISTER
R/W-0 R/W-1 R/W-0 R/W-0 R(1) R-0 R/W-0 R/W-0
IDLEN IRCF2 IRCF1 IRCF0 OSTS IOFS SCS1 SCS0
bit 7 bit 0
bit 7 IDLEN: Idle Enable bit
1 = Device enters Idle mode on SLEEP instruction
0 = Device enters Sleep mode on SLEEP instruction
bit 6-4 IRCF2:IRCF0: Internal Oscillator Frequency Select bits
111 = 8 MHz (INTOSC drives clock directly)
110 = 4 MHz
101 = 2 MHz
100 = 1 MHz(3)
011 = 500 kHz
010 = 250 kHz
001 = 125 kHz
000 = 31 kHz (from either INTOSC/256 or INTRC directly)(2)
bit 3 OSTS: Oscillator Start-up Time-out Status bit(1)
1 = Oscillator Start-up Timer time-out has expired; primary oscillator is running
0 = Oscillator Start-up Timer time-out is running; primary oscillator is not ready
bit 2 IOFS: INTOSC Frequency Stable bit
1 = INTOSC frequency is stable
0 = INTOSC frequency is not stable
bit 1-0 SCS1:SCS0: System Clock Select bits
1x = Internal oscillator block
01 = Timer1 oscillator
00 = Primary oscillator
Note 1: Depends on the state of the IESO configuration bit.
2: Source selected by the INTSRC bit (OSCTUNE<7>), see text.
3: Default output frequency of INTOSC on Reset
```


----------



## ByAxel (Oct 9, 2010)

Cada PIC o familia de PICs son distintos, se resuelve el problema revisando la hoja de datos...

Cada registro es de 8 bits, se empieza a leer desde el lado derecho empezando con el Bit0 hasta el bit7, entonces por lo general cada bit o grupo de bits en un registro tiene su descripción, por ejemplo escrito en binario:

OSCCON = 0b01110111;

Donde solo el valor *01110111*:

```
0      1      1      1      0      1      1      1
bit7 - bit6 - bit5 - bit4 - bit3 - bit2 - bit1 - bit0
```

Compara este valor con la tabla en el datasheet y veras como está configurado...
> En conjunto los 3 unos (Bits 6, 5 y 4) son del oscilador que lo configura a 8Mhz o si pones *110* lo configuras a 4Mhz, el resto lo explica en el datasheet que también son importantes.

Espero se entienda... 
saludos


----------



## sento87 (Oct 10, 2010)

Muy buenas, ya lo he probado y me funciona bien:

```
void main() {
  OSCCON = 0b01110111;

  TRISA = 0x00;          // set direction to be output
  TRISB = 0x00;          //  set direction to be output
  TRISC = 0x00;          // set direction to be output

  while(1) {
    PORTA = 0x00;        // Turn OFF LEDs on PORTA
    PORTB = 0x00;        // Turn OFF LEDs on PORTB
    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    Delay_ms(1000);      // 1 second delay

    PORTA = 0xFF;        // Turn ON LEDs on PORTA
    PORTB = 0xFF;        // Turn ON LEDs on PORTB
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    Delay_ms(1000);      // 1 second delay
  }
}
```

Todas las salidas cambian su estado cada 1seg.

ahora he probado ha poner en funcionamiento por separado cada salida con un output_high(PIN_B7) y output_low(PIN_B7) y me dice que undeclared indentifier 'output_high' y lo mismo para el low...
¿Tenéis idea de por que es?


----------



## ByAxel (Oct 10, 2010)

sento87 dijo:


> ahora he probado ha poner en funcionamiento por separado cada salida con un output_high(PIN_B7) y output_low(PIN_B7) y me dice que undeclared indentifier 'output_high' y lo mismo para el low...
> ¿Tenéis idea de por que es?


Creo que estas comparando con el CCS; se sabe que el CCS tiene funciones pre-establecidas pero también que no sigue mucho del estándar ANSI C.
Es decir que prácticamente el código del CCS no es compatible con el MiKroC por lo que no hay *output_high*. Para pines es por ejemplo PORTA.B0 = 1; o PORTB.B0 = 0; // El B0 indica Bit0.

Dale una leída al Help del MikroC desde el item *mikroC PRO for PIC Language Reference*, lo explican todo.

saludos.


----------



## sento87 (Oct 10, 2010)

Muchisimas gracias Axel, ahora lo hago.
Por eso mismo andaba un poco liado, por que la primera prueba que intenté hacer fue con el CCS pensaba que el output_high sería con todos los compiladores.

Agradezco mucho tu paciencia.
Un saludo


----------



## axelrose (Nov 6, 2010)

saludos programadores.
me gustaria saber como configuro el oscilador externo desde el edit project de mikroc pro?


----------



## ByAxel (Nov 6, 2010)

axelrose dijo:


> saludos programadores.
> me gustaria saber como configuro el oscilador externo desde el edit project de mikroc pro?



Que PIC estas usando?

Desde la ventana que indicas solo debes de escoger las opciones que se ajusten a lo que quieras... claro que debes de conocer al PIC, para eso revisa su hoja de datos.


----------



## snake137 (Jul 8, 2014)

Buen dia!

Estoy usando el PIC18F4550, lo que pasa es que no quiero utilizar un Oscilador Externo y quiero usar el Interno. Uso el Programa MikroC, en la linea de codigo pongo  OSCCON = 0b01110111; pero no funciona, no se si en "Edit Proyect" hay que modificar algo. Pienso que seria en "Oscillator Selection" pero no se que opcion usar.

Gracias por su Atencion!


----------



## D@rkbytes (Jul 8, 2014)

snake137 dijo:


> Buen dia!
> 
> Estoy usando el PIC18F4550, lo que pasa es que no quiero utilizar un Oscilador Externo y quiero usar el Interno.
> Uso el Programa MikroC, en la linea de código pongo  OSCCON = 0b01110111; pero no funciona, no se si en "Edit Proyect" hay que modificar algo. Pienso que seria en "Oscillator Selection" pero no se que opción usar.
> ...


En Edit Project tienes que seleccionar los fuses que se muestran en la imagen adjunta.
La configuración del registro OSCCON para trabajar estable a 8MHz, la tienes bien.

Suerte.


----------



## snake137 (Jul 9, 2014)

Gracias D@rkbytes, ya me funciona!!!

Una Pregunta, es recomendable el usar el Oscilador Interno para comunicacion USB e I2C o SPI o es obligatorio utilizar el cristal de 12MHz????

Lo que vi que tambien me falto mover es el Prescalador y el Power-up.

Si decido utilizar el Oscilador Interno de 4MHz el Prescalador tiene que estar en "No prescale"???

Gracias por resolverme el problema!!!

Una imagen adjunta de lo que estoy realizando.



D@rkbytes dijo:


> En Edit Project tienes que seleccionar los fuses que se muestran en la imagen adjunta.
> La configuración del registro OSCCON para trabajar estable a 8MHz, la tienes bien.
> 
> Suerte.


----------



## D@rkbytes (Jul 9, 2014)

snake137 dijo:


> Gracias D@rkbytes, ya me funciona!!!
> 
> Una Pregunta, es recomendable el usar el Oscilador Interno para comunicación USB e I2C o SPI o es obligatorio utilizar el cristal de 12MHz????
> 
> ...


Nop, con el oscilador interno no puedes usar el módulo USB, las otras funciones si.
Para alcanzar los 48MHz, necesarios para trabajar con el USB, se puede hacer con cristales desde 4MHz hasta 20MHz.

Lee sobre esto en la hoja de datos, ahí están explicados los pasos a seguir.

Saludos.


----------



## hacktek (Jul 20, 2014)

Hola, por necesidad me estoy introduciendo en el mundillo de los pic.  y me eh topado de entrada con un problema, espero alguien me pueda dar alguna sugerencia o solución al problemas ... de ante mano muchas gracias.

Al punto. Después de un rato luchando con mikroc y acompañado de un vídeo tutorial logre que código según creo, pero al grabar y montar en la proto el led tiene un intermitencia muy rápida eh irregular.. 

Desconzco si mi pic se a dañado, o es interferencia.  
Uso un transformador de 12v con un 7805 mas 2 condensadores para estabilizar los 5v. 

Dejo un video de referencia:





y mi codigo: 
	
	



```
void main() {
     CMCON=0X07; // Comparadores apagados, Pines RA<3:0> Cumplen la funcione E/S digital
     RB6_bit=0; // Inicializacion, del pin RB6 como apagado
     TRISB6_bit=0; //Pin RB6 como salida,  0 = salida, 1 = entrada
while (1) // Bucle infinito
     {
          RB6_bit=1;   // Pin RB6, Alto o Encendido
          delay_ms(1500); // Retardo en milisegundos
          RB6_bit=0; // Pin RB6, Bajo o Apagado
          delay_ms(1500); // Retardo en milisegundos
     }
}
```

de antemano muchísimas gracias.


----------



## proteus7 (Jul 20, 2014)

como tienes configuradotu pic?  con oscilador interno? o externo,  la pata de reset debe estar a positivo  y veo que el led lo tienes conectado al led, mejor ponle una resistencia de 220 homs o 330 homs o 470 homs


----------



## dbracho01 (Ago 8, 2016)

Hola. Muy buenas noches. Soy nuevo en la comunidad, estoy aprendiendo a programar en mikroc, en realidad voy empezando y hay un problema en el programa que no me deja avanzar, la verdad les agradecería mucho si me pudiesen ayudar.

Mi problema es el siguiente. Estoy haciendo un programa en c, en el cual quiero que al pasar un switch conectado por el puerto b en el bit rb7 (entrada), al presionar enciende rb4 y rb5, y al presionar rb0 apague solamente rb4 y rb5 quede encendido para después continuar con el programa.

Aquí les envío el código que llevo hasta ahora, espero alguien me pueda orientar.

El programa en la simulación lo que hace cuando paso el switch (rb7)  rb4 queda apagado y rb5 encendido, y cuando presiono el pulsador (rb0) me enciende rb4 y al soltarlo me lo apaga.

Aquí les coloco el código. Saludos y gracias.

```
bit oldstate;                                    // Old state flag

void main() {
  CMCON = 0X07;                                 //PINES DIGITALES
  TRISB = 10000001;                             //BIT RB0 Y RB7 DECLARADOS COMO ENTRADAS DIGITALES (PULSADORES), EL RESTO COMO SALIDAS
  PORTB = 10000001;
  TRISA = 0;                                    // PUERTO A CONFIGURADO COMO SALIDA
  PORTA = 0;                                    // PINES PUERTO B COMO SALIDA
  oldstate = 0;

   do {                                         // LA CONDICION SE EJECUTA UNA VEZ, ANTES DE LA COMPROBACION EN EL WHILE
   
   if (Button(&PORTB, 7, 300, 0))  {              //SWITCH INICIO PROCESO
   oldstate = 1;
   PORTB.F4 = 1;
   PORTB.F5 = 1;
  }
   if (oldstate && Button (&PORTB, 7, 300, 1)) {     // VACUM  port, puerto donde conecto, pin, bit puerto, time 1ms, 0 logis state
   oldstate = 0;
   PORTB.F4 = 0;
   PORTB.F5 = 0;
    }
   if (PORTB.F0=1){
   oldstate = 1;
   PORTB.F4 = 0;
   
   }
   }   while(1);//Bucle infinito.
   }
```


----------



## D@rkbytes (Ago 9, 2016)

dbracho01 dijo:


> Mi problema es el siguiente. Estoy haciendo un programa en c, en el cual quiero que al pasar un switch conectado por el puerto b en el bit rb7 (entrada), al presionar enciende rb4 y rb5, y al presionar rb0 apague solamente rb4 y rb5 quede encendido para después continuar con el programa.


Tu planteamiento es muy sencillo y se puede lograr de la siguiente forma.

Programa en C estándar:

```
void main (void)
{
    trisb = 0b11001111;
    portb = 0;
    
    while (1)
    {
        if(portb.7)
        {
            if(!portb.4 && !portb.5)
            {
                portb.4 = 1;
                portb.5 = 1;
            }
        }
        
        if(portb.0)
        {
            if(portb.4 && portb.5)
            {
                portb.4 = 0;
            }
        }
    }
}
```
Ya nada más falta que determines cuando se debe poner en 0 RB5.


----------



## dbracho01 (Ago 22, 2016)

BUenas tardes hermanaso muchisimas gracias por ayudarme a salir de esa duda que tenia, yo corri el programa en el simulador aunque no me apagaba el led que encendia el otro switch, segun la estructura que hiciste me pude guiar para poder resolver el problema, de antemano muchas gracias por tu ayuda...


----------



## aguevara (Mar 25, 2017)

Recién he descargado la versión demo de mikroC, hice un programa ejemplo muy simple para enviar una variable a un lcd 16X2. el asunto es la sentencia FOR no funciona, pero si yo elimino la linea de sentencia FOR entonces se despliega el valor de la variable (en el caso del programa se ve un 1). Alguien me puede dar una opinion al respecto, el mismo problema tengo en el compilador CCS.
Saludos


----------



## josemaX (Mar 25, 2017)

Donde pones i >=10 pon i <= 10 el bucle se ejecutará mientras que esa condición sea verdadera, lo que pones es falso en la primera iteración.


----------



## aguevara (Mar 25, 2017)

Muchas gracias josemaX un pequeño detalle, creeme que despues de horas de estar viendo, pensando y generando un programa hay momentos en que ya no se percata uno de esos detalles.

Gracias nuevamente.


----------



## josemaX (Mar 25, 2017)

De nada aguevara.


----------



## leemkapoh (Abr 25, 2018)

Hola a todos,
Solo quiero compartir con ustedes chicos, llamé a este proyecto es el foro, puede traer este proyecto a su oficina en su escritorio.
Significa voluntad dada la información cuando usted sale de su escritorio, tal vez quieres ir satisfacer al cliente o simplemente quiere comer.
En el apego hay código MikroC y Proteus, puede cambios que palabra así lo desea, asegúrese de que necesita contar los caracteres.
Adjunta archivos.

Gracias,
Kapoh.


----------



## leemkapoh (Abr 26, 2018)

Hola a todos,
Este es proyecto de la muestra con el botón, este proyecto es encendido y apagado, también hay función momentánea y biestables.
La didiference en este proyecto llama a ON directamente a la conducción de puerta BS170, luego BS170 estará conectado a tierra, una vez conectado la fuente distribuirá a VDD PIC16F628A, bien que deba sostener la puerta BS170, por lo que tengo que hacer alto el puerto al holding BS170 ha Ve a riger.

Gracias,
Kapoh.


----------



## totojava (Jun 4, 2018)

buenas, necesito ayuda para encender un led con un switch programado con mikroc en un pic 18f4550 esto es lo que llevo pero no se por que no funciona, gracias por la colaboración que me pueda ser brindada.


----------



## josemaX (Jun 5, 2018)

Using Push Button Switch with PIC Microcontroller - MikroC


----------



## fabybu (Jun 5, 2018)

totojava dijo:


> buenas, necesito ayuda para encender un led con un switch programado con mikroc en un pic 18f4550 esto es lo que llevo pero no se por que no funciona, gracias por la colaboración que me pueda ser brindada.


Hola, 
Ojo que cuando escribís "PORTA.F0=P;" estás asignando a un bit(un bit dentro del PORTA) un entero (de 2 bytes).
Como cuando ponés "TRISA=1;" estás declarando que solamente A0 será entrada y no todo el puerto, para que las 8 patitas del pto sean entradas deberías asignar el valor 255 o 0XFF etc. Ídem con TRISD.
Tampoco estás inicializando las variables L y P.


----------



## zoder45 (Feb 15, 2021)

Buena tarde tengo un problema

Estoy usando un sensor de temperatura Ds1822 que ya tengo su programación y funciona, pero ahora quiero activar una salida del puerto b y no me activa
quiero que a cierta temperatura se active o lo contario se apague

Uso Pic16f876a y estoy programando con microC

les dejo el codigo para ver que estoy haciendo mal

Saludos


```
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC3_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
// end LCD module connections dim as byte tem
int raw_temp;
char *temp = "000.00 C";

void main() {
  ADCON1 = 0x07;                         //Configura puerto A como digitales
  PORTB = 0xFF;
  INTCON = 0;
  TRISB = 0xff;
  Lcd_Init();                      // Initialize LCD module
  Lcd_Cmd(_LCD_CURSOR_OFF);        // cursor off
  Lcd_Cmd(_LCD_CLEAR);             // clear LCD
  lcd_out(1, 3, "Temperatura:");

  while(1) {

    Ow_Reset(&PORTA, 1);                         // Onewire reset signal
    Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 1, 0x44);                   // Issue command CONVERT_T

    while(Ow_Read(&PORTA, 1) == 0) ;
    Ow_Reset(&PORTA, 1);                         // Onewire reset signal
    Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD

    raw_temp  = Ow_Read(&PORTA, 1);              // Read temperature LSB byte
    raw_temp |= (Ow_Read(&PORTA, 1) << 8);       // Read temperature MSB byte

    if(raw_temp & 0x8000) {                       // If the temperature is negative
      temp[0] = '-';                              // Put minus sign (-)
      raw_temp = ~raw_temp + 1;                   // Change temperature value to positive form
    }
    else {
      if((raw_temp >> 4) >= 100)                  // If the temperatue >= 100 °C
        temp[0] = '1';                            // Put 1 of hundreds
      else                                        // otherwise
        temp[0] = ' ';                            // put space ' '
    }

    // Put the first two digits ( for tens and ones)
    temp[1] = ( (raw_temp >> 4) / 10 ) % 10 + 48;      // Put tens digit
    temp[2] =   (raw_temp >> 4)        % 10  + 48;     // Put ones digit

    // Put the 4 fraction digits (digits after the point)
    // Why 625: because we're working with 12-bit resolution
    temp[4] = ( (raw_temp & 0x0F) * 625) / 1000 + 48;          // Put thousands digit
    temp[5] = (((raw_temp & 0x0F) * 625) / 100 ) % 10 + 48;    // Put hundreds digit
    temp[6] = 223;                                // Put degree symbol ( ° )
    lcd_out(2, 4, temp);                          // Display temperature

    delay_ms(1000);                               // Wait 1 second
  }
if(raw_temp>40)                                   // cuando llegue a mas de 40
    {
    PORTB.rb0 = 0;                                // se activa portb .0
    }
    if(raw_temp<40)                               // cuando es menor de 40
    {
    PORTB.rb0 = 1;                                  // se apaga portb .0
    }
}
// End of code
```


----------



## DJ T3 (Feb 15, 2021)

Tenes la sentencia de los if que activan o desactivan el puerto B, fuera del bucle (while)


----------



## zoder45 (Feb 16, 2021)

Perfecto*, *muchas gracias*,* era eso*,* no lo había notado*,* estoy empezando con *M*icroc

Pregunta*,* ahora lo que tengo que hacer que presionando un botón me lleve a un menú

Ejemplo :

If port.rb1 = 1

Else

If portb.rb1= 0   se regresa a*_*la pantalla principal


La lcd mostrará
Configurar temperatura " 35°C " tem

If portb.rb2 = 1   el botón incrementa en 1
Tem + 1

If portb.rb3 = 1 el botón baja en 1
Tem - 1


*¿*Como seria para crear las variables y poder hacer ese menú*?*

Muchas gracias y saludos.


----------



## zoder45 (Feb 18, 2021)

Buenos días tengo el siguiente problema y ya e buscado y no encuentro como hacerlo les comento.
Es un control de de Temperara
tengo una variable de inicio llamada tem1=35; 
con esta variable inicia el programa y que si es menor a 35 se activa si es mayor a 35 de desactiva
hasta ahí esta bien.
ahora  tengo que incluir un botón o selector que al momento sea =1 en la lcd me muestre ajustes y me muestre la variable tem1=35
para si con unos pulsadores poder modificar esa variable ya sea que incremente o disminuye

hasta el momento no e podido como hacer que me muestre la variable en la lcd
y cuando el pulsador esta en 1 me muestra ajustes pero no me muestra la variable

les dejo el código que tengo hasta el momento




```
// Lcd pinout settings
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D4 at RC4_bit;
sbit led at RB0_bit;
sbit mas at RB1_bit;
sbit menos at RB2_bit;
sbit men at RB3_bit;
// Pin direction
sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC3_bit;
sbit LCD_D7_Direction at TRISC7_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit led_dir at TRISB0_bit;

char tem1;
int raw_temp;
char *temp = "000.00 C";

void main() {
  ADCON1 = 0x07;                         //Configura puerto A como digitales
  led_dir = 0;
  Lcd_Init();                      // Initialize LCD module
  Lcd_Cmd(_LCD_CURSOR_OFF);        // cursor off
  Lcd_Cmd(_LCD_CLEAR);             // clear LCD
  lcd_out(1, 3, "TEMPERATURA");
  led = 0;
  tem1  = 35;
  men = 0;
  mas = 0;
  menos = 0;

  while(1) {
    Ow_Reset(&PORTA, 1);                         // Onewire reset signal
    Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 1, 0x44);                   // Issue command CONVERT_T
    while(Ow_Read(&PORTA, 1) == 0) ;
    Ow_Reset(&PORTA, 1);                         // Onewire reset signal
    Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD
    raw_temp  = Ow_Read(&PORTA, 1);              // Read temperature LSB byte
    raw_temp |= (Ow_Read(&PORTA, 1) << 8);       // Read temperature MSB byte
    if(raw_temp & 0x8000) {                       // If the temperature is negative
      temp[0] = '-';                              // Put minus sign (-)
      raw_temp = ~raw_temp + 1;                   // Change temperature value to positive form
    }else {
     if((raw_temp >> 4) <= tem1){
      Lcd_Cmd(_LCD_CLEAR);             // clear LCD
     lcd_out(1, 3, tem1);
       led = 1;
       }else {
      Lcd_Cmd(_LCD_CURSOR_OFF);        // cursor off
       Lcd_Cmd(_LCD_CLEAR);             // clear LCD
       lcd_out(1, 3, "Tem Estable:");
       led = 0;
      }
      if((raw_temp >> 4) >= 100)                  // If the temperatue >= 100 °C
        temp[0] = '1';                            // Put 1 of hundreds
      else                                        // otherwise
        temp[0] = ' ';                            // put space ' '

    }
    // Put the first two digits ( for tens and ones)
    temp[1] = ( (raw_temp >> 4) / 10 ) % 10 + 48;      // Put tens digit
    temp[2] =   (raw_temp >> 4)        % 10  + 48;     // Put ones digit
    // Put the 4 fraction digits (digits after the point)
    // Why 625: because we're working with 12-bit resolution
    temp[4] = ( (raw_temp & 0x0F) * 625) / 1000 + 48;          // Put thousands digit
    temp[5] = (((raw_temp & 0x0F) * 625) / 100 ) % 10 + 48;    // Put hundreds digit
    temp[6] = 223;  // Put degree symbol ( ° )
    lcd_out(2, 4, temp);   // Display temperature

    delay_ms(500);


   }
    }
```


----------



## zoder45 (Abr 27, 2021)

Que tal buena tarde a todos.

tengo un proyecto con una pantalla stone de 7 pulgas para visualizar temperatura y humedad y set point.
la programación con MicroC ya la tengo hecha y puedo visualizar los valores via serial 

El problema que tengo es lo siguiente, no e podido hacer la comunicación o como es la programación para mandarla a la pantalla  le dejo mi código que estoy ocupando e leído pero no le entiendo 
Le dejo la hoja de datos de la pantalla 

si me podrían ayudar se los agradeceré mucho saludos 


```
// Lcd pinout setting FUNCIONA SIN ERRORES EN PROTEUS funcionando al 100 en proto con sensor


#include "floattostr_.h"



 sbit CALEFACTOR at RB0_bit;
 int tem1;
 char Text[10]; //Cadena de caracteres para impresión de datos.
 char fracc;
 char hume;
 char texto[30];
 unsigned int HUM1;
 unsigned char  Check, T_byte1, T_byte2, RH_byte1, RH_byte2, Ch ;
 unsigned Temp, RH, Sum ;
 unsigned be, me,ne, Sum2,h1,h2 ;

 //////////////////////////////
 
 void Uart1_write_text_const(const char *info)
{
 while(*info) UART1_Write(*info++);
}

 //////////////////////////////
 void StartSignal(){
 TRISA.F0 = 0;    //Configure RD0 as output
 PORTA.F0 = 0;    //RD0 sends 0 to the sensor
 delay_ms(18);
 PORTA.F0 = 1;    //RD0 sends 1 to the sensor
 delay_us(30);
 TRISA.F0 = 1;    //Configure RD0 as input
  }
 //////////////////////////////
 void CheckResponse(){
 Check = 0;
 delay_us(40);
 if (PORTA.F0 == 0){
 delay_us(80);
 if (PORTA.F0 == 1)   Check = 1;   delay_us(40);}
 }
 //////////////////////////////
 char ReadData(){
 char i, j;
 for(j = 0; j < 8; j++){
 while(!PORTA.F0); //Wait until PORTD.F0 goes HIGH
 delay_us(30);
 if(PORTA.F0 == 0)
       i&= ~(1<<(7 - j));  //Clear bit (7-b)
 else {i|= (1 << (7 - j));  //Set bit (7-b)
 while(PORTA.F0);}  //Wait until PORTD.F0 goes LOW
 }
 return i;
 }
 //////////////////////////////

 void main() {
  UART1_Init(9600);
 Uart1_write_text_const("INICIANDO\r\n");
  TEM1=350;
 ADCON1 = 0x07;   //Configura puerto A como digitales
 while(1){
  StartSignal();
  CheckResponse();
  if(Check == 1){
  RH_byte1 = ReadData();
  RH_byte2 = ReadData();
  T_byte1 = ReadData();
  T_byte2 = ReadData();
  Sum = ReadData();
  if(Sum == ((RH_byte1+RH_byte2+T_byte1+T_byte2) & 0XFF)){
  Temp = T_byte1;
  Temp = (Temp << 8) | T_byte2;
  RH = RH_byte1;
  RH = (RH << 8) | RH_byte2;
  delay_ms(500);

  

    sprinti(texto,"HUMEDAD=%u \r\n",rh);
    UART1_Write_Text(texto);
    
    sprinti(texto,"Temperatura=%u \r\n",TEMP);
    UART1_Write_Text(texto);
     delay_ms(500);
 } else {
    CALEFACTOR=0;






   }
}
}
```


----------

