Ir ao conteúdo
  • Cadastre-se

Pic 18f4550 barras de niveis no display lcd


Visitante

Posts recomendados

ola pessoal gostaria de uma ajuda para colocar aquelas barras de niveis no display de lcd

preciso do comando para inserir elas para medir o nivel da carga de uma bateria.ou seja 6 barras 100% 5 barras 90% etc.

Link para o comentário
Compartilhar em outros sites

O segredo é usar a memória CGRAM do display para armazenar as barras. Dá para armazenar os 8 níveis da barra. Não sei se o driver que você usa tem suporte para escrever na CGRAM do lcd, mas é bem simples fazer isso:

Envie o comando 0x40 (pino RS em 0) para o lcd para escrever no endereço 0 da CGRAM, depois envie 8 bytes (pino RS em 1) com o caracter que se deseja formar:

tabelacgram.jpg

Envie o comando 0xC0 (pino RS em 0) para terminar a gravação na CGRAM.

barGraphPatterns.jpg

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

#include <p18F4550.h>
#include <delays.h>

#pragma config PLLDIV=1, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=XTPLL_XT//, FCMEM=OFF //CPUDIV=OSC1_PLL2=48MHz
#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF
#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG=OFF
//////////////// DEFINA AQUI QUAL OS PINOS A USAR ///////////////////////////////////////////////
#define D7 LATBbits.LATB7
#define D6 LATBbits.LATB6
#define D5 LATBbits.LATB5
#define D4 LATBbits.LATB4
#define E LATBbits.LATB0
#define RS LATBbits.LATB1
////// PROTÓTIPOS DAS FUNÇÕES ,EXIGENCIA ANSI C ///////////////
void Setup(void);
void entryMode(void);
void displayOn(void);
void sendChar(char c);
void Habilita(void);
void Envia_String(const far rom char *str);
void Segunda_Linha(void);
///////////////////////////////////////////////////////////
// 0010 - 4 bit
void Setup(void)
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 1;
D4 = 0;
Habilita();
Delay10TCYx(80);
Habilita();
D7 = 1;
Habilita();
Delay10TCYx(80);
}
//.....................................................
void Habilita(void)
{
E = 1;
Delay10TCYx(1);
E = 0;
}
//....................................................
void entryMode(void) //0000 0110, increment with no shift
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 0;
D4 = 0;
Habilita();
D6 = 1;
D5 = 1;
Habilita();
Delay10TCYx(80);
}
//.................................................
void displayOn(void) //0000 1111. cursor on. blinking on.
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 0;
D4 = 0;
Habilita();
D7 = 1;
D6 = 1;
D5 = 1;
D4 = 1;
Habilita();
Delay10TCYx(80);
}
//................................................
void Envia_String(const far rom char *str)
{
int index = 0;
while (str[index] != '\0')
{
sendChar(str[index]);
index++;
}
}
//.................................................
void sendChar(char c)
{
RS = 1;
D7 = (c >> 7) & 1;
D6 = (c >> 6) & 1;
D5 = (c >> 5) & 1;
D4 = (c >> 4) & 1;
Habilita();
D7 = (c >> 3) & 1;
D6 = (c >> 2) & 1;
D5 = (c >> 1) & 1;
D4 = (c & 1);
Habilita();
Delay10TCYx(80);
}
//.................................................
void Segunda_Linha(void) //1100 0000 -
{
RS = 0;
D7 = 1;
D6 = 1;
D5 = 0;
D4 = 0;
Habilita();
D7 = 0;
D6 = 0;
Habilita();
Delay10TCYx(80);
}
///////////////////////////////////////////////////
void main(void)
{
TRISB = 0;
Delay10TCYx(80);
Setup();
entryMode();
displayOn();
Envia_String(" LINHA UM ");
Segunda_Linha();
Envia_String(" LINHA DOIS ");
while(1);
}

Projetos_afg, divirta-se...

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

ola,

tentei colocar este comando e nao consegui

meu codigo e este pode me ajudar a fazer funcionar

/** I N C L U D E S **********************************************************/
#include <p18cxxx.h> // Necessário para que o compilador adicione a biblioteca
// com as definições do PIC selecionado no projeto, neste
// caso, o modelo 18F4550.

#include <delays.h> // Biblioteca com funções de delay do compilador C18

#include "displayLCD.h"
#include <adc.h>
#include <string.h>
/** D E F I N E S ************************************************************/
#define LED_VERDE PORTCbits.RC2
#define LED_AMARELO PORTDbits.RD0
#define LED_VERMELHO PORTDbits.RD1
#define buzer PORTCbits.RC1
#define LVM TRISDbits.TRISD1
#define LAM TRISDbits.TRISD0
#define LVD TRISCbits.TRISC2
#define buz TRISCbits.TRISC1
#define rel TRISCbits.TRISC0
#define RELE PORTCbits.RC0
/** V A R I A V E I S G L O B A I S ****************************************/

/** P R O T O T I P O S P R I V A D O S ***********************************/
void ConfiguraSistema(void);

/** F U N C O E S ************************************************************/
/******************************************************************************
* Funcao: void main(void)
* Entrada: Nenhuma (void)
* Saída: Nenhuma (void)
* Descrição: Função principal do programa.
*****************************************************************************/
void main(void)
{
char string1[15]="BATERIA:";
char string2[15]=" VOLTS";
int resultado;
float resultadovolts=0.0;
float resolucao =5.0/1023;



ConfiguraSistema(); // Configura as portas e periféricos do PIC.

PosicaoCursorLCD(1,1);

EscreveFraseRamLCD(string1);

SelChanConvADC(ADC_CH4);

while(1) // Laço infinito que executa o funcionamento principal do projeto.
{
if(BusyADC())
{

}
else
{
resultado=ReadADC();
resultadovolts=(resultado*resolucao);
PosicaoCursorLCD(2,1);
EscreveInteiroLCD(resultadovolts);
PosicaoCursorLCD(2,2);
putrsXLCD(".");
PosicaoCursorLCD(2,3);
EscreveInteiroLCD((int)(resultadovolts*10)%10);
PosicaoCursorLCD(2,4);
putrsXLCD("V");
ConvertADC();

}


if(resultadovolts>4.8)
{
PosicaoCursorLCD(1,9);
putrsXLCD("100% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|||||||||||");
RELE=0;
}

if(resultadovolts>4.6)

{
if(resultadovolts<4.8)
{
PosicaoCursorLCD(1,9);
putrsXLCD("90% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|||||||||| ");
RELE=0;
}
}

if(resultadovolts>4.4)

{
if(resultadovolts<4.6)
{
PosicaoCursorLCD(1,9);
putrsXLCD("80% ");
PosicaoCursorLCD(2,6);
putrsXLCD("||||||||| ");
RELE=0;


}
}

if(resultadovolts>4.2)

{
if(resultadovolts<4.4)
{
PosicaoCursorLCD(1,9);
putrsXLCD("70% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|||||||| ");
RELE=0;
}
}

if(resultadovolts>4.0)

{
if(resultadovolts<4.2)
{
PosicaoCursorLCD(1,9);
putrsXLCD("60% ");
PosicaoCursorLCD(2,6);
putrsXLCD("||||||| ");
RELE=0;

}
}

if(resultadovolts>3.8)

{
if(resultadovolts<4.0)
{
PosicaoCursorLCD(1,9);
putrsXLCD("50% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|||||| ");
RELE=0;
}
}

if(resultadovolts>3.6)

{
if(resultadovolts<3.8)
{
PosicaoCursorLCD(1,9);
putrsXLCD("40% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|||| ");
RELE=0;

}
}

if(resultadovolts>3.4)

{
if(resultadovolts<3.6)
{
PosicaoCursorLCD(1,9);
putrsXLCD("30% ");
PosicaoCursorLCD(2,6);
putrsXLCD("||| ");
RELE=0;
}
}

if(resultadovolts<3.4)

{

PosicaoCursorLCD(1,9);
putrsXLCD("20% ");
PosicaoCursorLCD(2,6);
putrsXLCD("|| ");

RELE=1;

}










}//end while(1)

}//end main

/******************************************************************************
* Funcao: void ConfiguraSistema(void)
* Entrada: Nenhuma (void)
* Saída: Nenhuma (void)
* Descrição: ConfiguraSistema é a rotina de configuração principal do PIC.
* Seu objetivo é configurar as portas de I/O e os periféricos
* do microcontrolador para que os mesmos trabalhem da maneira
* desejada no projeto.
*****************************************************************************/
void ConfiguraSistema(void)
{
ADCON1 |= 0x0F; // configura todas as portas como digitais


// Configura os pinos do display 7 segmentos
ConfiguraLCD();
OpenXLCD();

LVD=0;
LVM=0;
LAM=0;

rel=0;


OpenADC(ADC_FOSC_64&
ADC_RIGHT_JUST&
ADC_2_TAD,
ADC_CH4&
ADC_INT_OFF&
ADC_REF_VDD_VSS,
ADC_4ANA);










}//end ConfiguraSistema

/** V E C T O R R E M A P P I N G ******************************************/
// Rotina necessária para o compilador C18 saber onde é o início do vetor de
// "reset".
// Copiar na íntegra esta parte do código dentro do arquivo "main.c" de TODO
// projeto usado com o Bootloader no PIC.

extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
_asm goto _startup _endasm
}
/** FIM DO ARQUIVO main.c ***************************************************************/

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
Alguem poderia me ajudar com o código.

 

não consigo gerar o bargraph em forma de caracteres no meu programa..

 

Gostaria de realizar em % da variavel L = 0 ~90 = 0 ~100 e os graficos a parti da linha 90L (2,7)em porcentagem do L.

 

mas não consigo de jeito nehum.

 

Coloquei uma foto como exemplo do que estou tentando fazer.

 

está indicada com sustenido para ter uma ideia

 

mas quero que acenda caracteres de 5x8 em 10 pontos, pela porcentagem.

 

estou usando um pic16f88

 

lcd 16x2

 

programa no ccs.

 

 

 

#include <nivel.h>

 

#include <LCD.C>

#define LCD_ENABLE_PIN PIN_B0

#define LCD_RS_PIN PIN_B1

#define LCD_RW_PIN PIN_B2

#define LCD_DATA4 PIN_B4                

#define LCD_DATA5 PIN_B5

#define LCD_DATA6 PIN_B6

#define LCD_DATA7 PIN_B7

 

#include <lcd.c> 

 

#define ADC=10

 

#ifndef __CUSTOMCHAR_H

 

 

#define __CUSTOMCHAR_H

 

unsigned   

#define ptr

 

#FUSES NOWDT                    //No Watch Dog Timer

#FUSES PUT                      //Power Up Timer

#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

 

#use delay(internal=4MHz)

// Constants used in READ_ADC() are:

 

int32 L;                                                                                                               

                                        

                    

void main()                                                                                                    

{

   setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4);

   setup_adc(ADC_CLOCK_DIV_8);

   set_adc_channel(0);

   delay_us(30);                                                                                            

   

   lcd_init();

                                

   while(TRUE)                         

   {                                                                           

   

   read_adc(ALL_ANALOG);

   L = read_adc();

   

   L=L*0.08797653958944281524926686217009;                          

 

   Printf(lcd_putc,"\fNivel TQ \n%1luL   ##########",L,);

   delay_ms(1000);

 

   }                                            

{                          

 lcd_set_cgram_char(2,5); 

  for(L=0; L<90; L++);                                                 

 

}                           

            

}

 

 

Obrigado pela atenção.

 

 

post-590528-0-14844600-1445030662_thumb.

Link para o comentário
Compartilhar em outros sites

Vê se dá para você tirar uma ideia deste código:

#include <16F883.h>#device ADC=10 #FUSES PUT                      //Power Up Timer#FUSES MCLR                     //Master Clear pin enabled#FUSES NOPROTECT                //Code not protected from reading#FUSES NOCPD                    //No EE protection#FUSES BROWNOUT                 //Reset when brownout detected#FUSES IESO                     //Internal External Switch Over mode enabled#FUSES FCMEN                    //Fail-safe clock monitor enabled#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES BORV21                   //Brownout reset at 2.1V#FUSES NOWRT                    //Program memory not write protected #use delay(crystal=8MHz) #define LCD_DATA_PORT getenv("SFR:PORTC")#include <LCD.C> #define LED PIN_B0#define DELAY 1000 void main() {   int vet[8];                setup_oscillator( OSC_8MHZ );        lcd_init();   printf(lcd_putc,"teste.");    vet[0] = 0b00000;   vet[1] = 0b00000;   vet[2] = 0b00000;   vet[3] = 0b00000;   vet[4] = 0b00000;   vet[5] = 0b00000;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(0, vet);      vet[0] = 0b00000;   vet[1] = 0b00000;   vet[2] = 0b00000;   vet[3] = 0b00000;   vet[4] = 0b00000;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(1, vet);      vet[0] = 0b00000;   vet[1] = 0b00000;   vet[2] = 0b00000;   vet[3] = 0b00000;   vet[4] = 0b11111;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(2, vet);      vet[0] = 0b00000;   vet[1] = 0b00000;   vet[2] = 0b00000;   vet[3] = 0b11111;   vet[4] = 0b11111;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(3, vet);      vet[0] = 0b00000;   vet[1] = 0b00000;   vet[2] = 0b11111;   vet[3] = 0b11111;   vet[4] = 0b11111;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(4, vet);      vet[0] = 0b00000;   vet[1] = 0b11111;   vet[2] = 0b11111;   vet[3] = 0b11111;   vet[4] = 0b11111;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(5, vet);      vet[0] = 0b11111;   vet[1] = 0b11111;   vet[2] = 0b11111;   vet[3] = 0b11111;   vet[4] = 0b11111;   vet[5] = 0b11111;   vet[6] = 0b11111;   vet[7] = 0b00000;   lcd_set_cgram_char(6, vet);       lcd_gotoxy(1,2);   lcd_putc("\0");   lcd_putc("\1");   lcd_putc("\2");   lcd_putc("\3");   lcd_putc("\4");   lcd_putc("\5");   lcd_putc("\6");      while(true) {}}

xi5dXxS.png

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Boa noite.. 

 

tentei utilizar seu código mas não consegui.

 

tente rodar meu código. eu não consigo fazer as barra.

 

gostaria de movelas conforme a entra analogica an0 aumentasse, conforme as barras que você postou.

 

estou usando ccs c compiler e protheus 8

 

o pic utilizado é um 16f88

 

#include <nivel tq.h>          

#include <LCD.C>     
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4          
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7 
#use delay(internal=4MHz) 
#define adc=(10)

#include <lcd.c>

int NIVEL0[8]={     
0b00000,                                                
0b00000,                           
0b00000, 
0b00000, 
0b00000,        
0b00000, 
0b11111,                 
0b11111                                      
};                                                    
                                  
int NIVEL1[8]={                             
0b00000,                                                
0b00000,                           
0b00000,
0b00000,
0b00000,
0b11111, 
0b11111,
0b11111
};     

int NIVEL2[8]={  
0b00000,                                                               
0b00000,               
0b00000,
0b00000,
0b11111,
0b11111,            
0b11111,
0b11111
}; 

int NIVEL3[8]={  
0b00000,
0b00000,
0b00000,
0b11111,
0b11111,
0b11111,  
0b11111,
0b11111
};

int NIVEL4[8]={  
0b00000,
0b00000,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,   
0b11111,
};     
        
int NIVEL5[8]={  
0b00000,
0b11111,
0b11111, 
0b11111,
0b11111,
0b11111,
0b11111,
0b11111                
};


int NIVEL6[8]={  
0b11111,
0b11111,
0b11111,                       
0b11111,    
0b11111,      
0b11111,
0b11111,  
0b11111 
};

void main()
{
   setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4);
   setup_adc(ADC_CLOCK_DIV_4);
   lcd_init(); 
   printf(lcd_putc,"\f");
   
   // caracteres display
   
   
   lcd_set_cgram_char(0,NIVEL0);             
   lcd_set_cgram_char(1,NIVEL1);     
   lcd_set_cgram_char(2,NIVEL2);
   lcd_set_cgram_char(3,NIVEL3);                  
   lcd_set_cgram_char(4,NIVEL4);
   lcd_set_cgram_char(5,NIVEL5);                                
   lcd_set_cgram_char(6,NIVEL6);

   
   
   // variaveis de conversão
   
   float n;
   
   float c;
   
   int16 r;                   
  

                       
   while(TRUE)               
   {                                                         
  
  // leitura porta analogica
  
  set_adc_channel (0);
  read_adc();                    
  n=read_adc();
                    
  //calculo conversão
                          
  c= n * 90 / 1023;
  
  r=c;
                                         
  // escreve no lcd
  lcd_gotoxy (1,1);                // escreve na coluna 1 e linha 1                     
  delay_ms(10);                        
  printf(lcd_putc"\NIVEL TQ COMBUSTIVEL");
  delay_us(6);
  
  // escreve no lcd       
   
  lcd_gotoxy (0,2);                // escreve na coluna 0 e linha 2                                                                            
  printf(lcd_putc"\ %2ld",r);
  delay_us(6);
  delay_us (5);                  
  lcd_gotoxy (3,2);                                               
  printf(lcd_putc"\ Lts");                                                  
  delay_us (6);                           
  lcd_gotoxy (11,2);                
  printf(lcd_putc"\ 1/2");
  delay_us (6);                                                 
  lcd_gotoxy (19,2);                                                 
  printf(lcd_putc"\ C");                    
  delay_us (6);                               
  lcd_gotoxy (26,1);                                                               
  printf(lcd_putc"\ V"); 
  delay_us (6);                           
  
                                      
  // BARRA DE NIVEL.                   
  
                                            
   lcd_gotoxy (26,2);                         
      printf(lcd_putc,"\ %c",0);                    
      delay_ms (100);                                       
      lcd_gotoxy (27,2);                      
      printf(lcd_putc,"\ %c",1);                    
      delay_ms (100);                                   
      lcd_gotoxy (28,2);                      
      printf(lcd_putc,"\ %c",2);                    
      delay_ms (100);                         
      lcd_gotoxy (29,2);                      
      printf(lcd_putc,"\ %c",3);                    
      delay_ms (100);
      lcd_gotoxy (30,2);                      
      printf(lcd_putc,"\ %c",4);                    
      delay_ms (100);
      lcd_gotoxy (31,2);                      
      printf(lcd_putc,"\ %c",5);                    
      delay_ms (100);
      lcd_gotoxy (32,2);                      
      printf(lcd_putc,"\ %c",6);                    
      delay_ms (100);   
      lcd_gotoxy (33,2);                      
      printf(lcd_putc,"\ %c",6);                    
      lcd_gotoxy (33,1);                      
      printf(lcd_putc,"\ %c",0);                       
      delay_ms (100);        
      lcd_gotoxy (34,2);                      
      printf(lcd_putc,"\ %c",6);                    
      lcd_gotoxy (34,1);                                  
      printf(lcd_putc,"\ %c",1);                    
      delay_ms (100);    
      lcd_gotoxy (35,2);                      
      printf(lcd_putc,"\ %c",6);                                            
      lcd_gotoxy (35,1);                      
      printf(lcd_putc,"\ %c",2);                    
      delay_ms (100);                   
      lcd_gotoxy (36,2);                      
      printf(lcd_putc,"\ %c",6);                                          
      lcd_gotoxy (36,1);                           
      printf(lcd_putc,"\ %c",3);
      delay_ms (100);                      
      lcd_gotoxy (37,2);                           
      printf(lcd_putc,"\ %c",6);                         
      lcd_gotoxy (37,1);                      
      printf(lcd_putc,"\ %c",4);                    
      delay_ms (100);                         
      lcd_gotoxy (38,2);                      
      printf(lcd_putc,"\ %c",6);
      lcd_gotoxy (38,1);                      
      printf(lcd_putc,"\ %c",5);                    
      delay_ms (100);    
      lcd_gotoxy (39,2);
      printf(lcd_putc,"\ %c",6);
      lcd_gotoxy (39,1);                      
      printf(lcd_putc,"\ %c",6);                    
      delay_ms (100);     
 
      delay_us(50); 
   }

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...