Ir ao conteúdo
  • Cadastre-se

Mudar ports na Biblioteca LCD


Posts recomendados

Bom Dia!

 

Não estou conseguindo visualizar a porta que esta sendo usada nessa biblioteca:

 

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc©  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        © Copyright 1996,2007 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////
 
// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.
 
// Un-comment the following define to use port B
// #define use_portb_lcd TRUE
 
 
struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;
 
 
#if defined use_portb_lcd
 // #locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif
 
#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif
 
#define lcd_line_two 0x40    // LCD RAM address for the second line
 
 
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.
 
 
                             // The following are used for setting
                             // the I/O port direction register.
 
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
 
 
 
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
 
 
void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}
 
 
void lcd_send_byte( BYTE address, BYTE n ) {
 
      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
 
 
void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING);
}
 
 
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;
 
   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}
 
void lcd_putc( char c) {
   switch © {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
 
char lcd_getc( BYTE x, BYTE y) {
   char value;
 
    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
 
Link para o comentário
Compartilhar em outros sites

 

Bom Dia!

 

Não estou conseguindo visualizar a porta que esta sendo usada nessa biblioteca:

é o port D porém  vai desencardia efeito cascata tudo que se refere ao port D será  trocado porém deve se saber  qual pic ira usar e estuda-lo  ver as portas que  podem e que não podem ser alteradas devido uma serie de coisas  tipo existe  porta que são analógica existe  pic que  dependendo da porta  é so saída existe em fim  ta muito vago  ok 

Link para o comentário
Compartilhar em outros sites

/ As defined in the following structure the pin connection is as follows:

//     D0  enable

//     D1  rs

//     D2  rw

//     D4  D4

//     D5  D5

//     D6  D6

//     D7  D7

 

Aqui está como vem por "padrão" mas observe que estas linhas estão comentadas. 

O que você deve fazer é copiar esta parte do código e colar no seu main()

Daí se não quiser usar a porta D é só alterar ali para outra porta (no main())

Link para o comentário
Compartilhar em outros sites

Estou querendo mudar para o PIC 16F628A

 

Vou postar o programa:

 

#include <16F877A.h>

 
#FUSES NOWDT                     //No Watch Dog Timer
#FUSES XT                               //Clock <=4Mhz
#FUSES PUT                           //Power Up Timer
#FUSES NOPROTECT          //Code not protected from reading
#FUSES NOBROWNOUT      //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
 
#use delay(clock=4000000)
 
#include <ds1307.c>
#include <lcd.c>
 
#define botao_incremento PIN_C6
#define botao_decremento PIN_C7
 
BYTE sec;
BYTE min;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;
 
int8 modo;
 
 
int8 tempo;
 
char dia_da_semana[7][8]=
{
   "DOMINGO",
   "SEGUNDA",
   "TERCA",
   "QUARTA",
   "QUINTA",
   "SEXTA",
   "sábado",
};
 
#int_timer1
void trata_tempo()
{
   tempo++;
   
   if (tempo == 10)
   {
      output_toggle (PIN_C5);
      tempo=0;
      disable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
   }
   set_timer1 (3036);
}
 
#int_ccp1
void trata_ccp_1()
{
   if ((modo == 0) && (tempo ==0))
   {
      output_toggle (PIN_C5);
      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
      set_timer1 (3036);
   }
}
 
#int_ccp2
void trata_ccp_2()
{
   modo++;
   if (modo == 1)
   {
      disable_interrupts(INT_TIMER1);               //Habilita interrupção timer1
      output_high (PIN_C5);
   }   
   
   if (modo > 7 )
   {      
      modo = 0;
   }
   
   if (modo == 0 )
   {
      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1      
   }
}
 
void main()
   output_high (PIN_C5);
   setup_ccp1(CCP_CAPTURE_RE);
   setup_ccp2(CCP_CAPTURE_RE);
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);   //Configuração do Timer1 para clock interno = 1E6 dividido por 8
   set_timer1 (3036);                           //Preload do Timer1
   
   enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
   enable_interrupts (int_ccp1);
   enable_interrupts (int_ccp2);
   enable_interrupts (global);
   
   delay_us(20);                 //Espera um pouco, obrigatório!
      
   ds1307_init();
   lcd_init();
   modo = 0;
   
   while(1)
   {
      switch (modo)
      {
         case 1:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               hrs++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               hrs--;
            }
            
            if (hrs > 23 )
            {
               hrs = 0;
            }
            
            /*if (hrs == 255 )
            {
               hrs = 23;
            }*/
            
            printf(lcd_putc,"\fAdj. Hora:\n%u",hrs);            
            delay_ms (100);
            break;
         }
         
         case 2:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               min++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               min--;
            }
            
            if (min > 59 )
            {
               min = 0;
            }
            
            /*if (min == 255 )
            {
               min = 59;
            }*/
            
            printf(lcd_putc,"\fAdj. Min:\n%u",min);            
            delay_ms (100);
            break;
         }
         
         case 3:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               sec++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               sec--;
            }
            
            if (sec > 59 )
            {
               sec = 0;
            }
            
            /*if (sec == 255 )
            {
               sec = 59;
            }*/
            
            printf(lcd_putc,"\fAdj. Seg:\n%u",sec);            
            delay_ms (100);
            break;
         }
         
         case 4:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               day++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               day--;
            }
            
            if (day > 31 )
            {
               day = 1;
            }
            
            if (day == 0 )
            {
               day = 31;
            }
            
            printf(lcd_putc,"\fAdj. Dia:\n%u",day);            
            delay_ms (100);
            break;
         }
         
         case 5:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               month++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               month--;
            }
            
            if (month > 12 )
            {
               month = 1;
            }
            
            if (month == 0 )
            {
               month = 12;
            }
            
            printf(lcd_putc,"\fAdj. Mes:\n%u",month);            
            delay_ms (100);
            break;
         }
         
         case 6:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               yr++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               yr--;
            }
            
            if (yr > 99 )
            {
               yr = 1;
            }
            
            if (yr == 0 )
            {
               yr = 99;
            }
            
            printf(lcd_putc,"\fAdj. Ano:\n%u",yr);            
            delay_ms (100);
            break;
         }
         
         case 7:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (75);
               dow++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (75);
               dow--;
            }
            
            if (dow > 7 )
            {
               dow = 1;
            }
            
            if (dow == 0)
            {
               dow = 7;
            }
            
            printf(lcd_putc,"\fDia Sem:\n%s",dia_da_semana[dow-1]);            
            delay_ms (100);            
            ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);         
            
            break;
         }
         
         default:
         {  
            ds1307_get_date(day,month,yr,dow);
            ds1307_get_time(hrs,min,sec);
            
            printf(lcd_putc,"\f%02d:\%02d:\%02d\ %s \n%02d/\%02d/\%02d ",hrs,min,sec,dia_da_semana[dow-1],day,month,yr);              
            delay_ms(1000);
         }
      }
   }
}
 

 

 

No programa não aparece o port D.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

acho que o amigo @Rafael Del Pino está ligeiramente enganado. Aquele método não deve ajudar muito o amigo...

... @Bruno R Ruinho , escrever no lcd é muito simples e não precisa desta parafernalha toda. To com preguiça de procurar mas já postei recentemente um exemplo completo que vem com o hitech-c. Mó moleza. Mas mesmo assim se não se sentir a vontade com ele, tente o exemplo vem com o mikro-c que é ainda mais fácil. Neste caso vai ter que compilar só com ele

abç

Link para o comentário
Compartilhar em outros sites

@Bruno R Ruinho

 

Veja aqui para mudar para o Port B:

 

http://forum.clubedohardware.com.br/forums/topic/1057725-ajuda-projeto-pic-16f628a-com-lcd-20x2/?p=5791644

 

Esse código que você está tentando passar para o 16F628A foi eu quem fez. Não é só o LCD que deverá ser alterado.

 

Veja que usei os dois CCPs para detectar os botões.

 

E tem as linhas de comunicação como DS1307. Provavelmente são diferentes do 877A.

 

Falou

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

Exatamente.

Estou enganado.

corrija-me se eu estiver errado, mas tu tens que DEFINIR  (#define) no teu código aqueles comandos:

 

#define D0  enable

#define D1  rs
#define D2  rw
 
....
 
caso queria usar a porta B, tem que descomentar o comando 
// #define use_portb_lcd TRUE
 
Se quiser usar outras portas tem um macete pra fazer isso, mas nessa biblioteca não consegui achar direito como é.
 
ACHO que é isso, sou um aprendiz de feiticeiro também hahaha
 
Qualquer coisa estamos aí
Link para o comentário
Compartilhar em outros sites

@MatheusLPS 

 

esse programa e o seu mesmo!! :P , mas pelo que vi o 16F628A nao suporta, so tem 1 - CCP e poucas portas.

 

Vou utilizar no carro, em um LCD de 8x2 o dia da semana nao vai aparecer, e a temperatura estava pensando assim:

 

 

1 - quando der nivel logico alto em um pino sobrando (12V da chave) o backlight acende, so tirar o CCP de temp do backlight.. penso eu..

 

2 - quando der nivel logico alto em outro pino sobrando(12v do ventilador do ar) ele mostra a temp no lugar da data e fica alternado a cada 2s - a hora fica fixo.

 

 

Circuit e Rafael Del Pino e exatamente isso, testei aqui e funcionou!

 

Obriagdo!

 

Link para o comentário
Compartilhar em outros sites

Agumas coisas que consegui fazer e ao mesmo tempo nao consegui:

 

 

No pino B7 que e a saida do BACKLIGHT (CCP) nao consegui fazer ele acender colocando A1 em nivel alto (positivo da chave).. então fiz uma adapracao de um diodo que sai de B6 e vai para o led:

 

      if(!input(pin_a1))
         output_high(pin_b6);
       else
         output_low(pin_b6);

 

Funciona (claro no pino em paralelo) mas eu sei que nao esta ideal..

 

 

Na leitura da temperatura no lugar da data, quando colocado A2 (positivo do ventilador) em nivel alto  a data some e aparece a temperatura ASSIM:

 

 while(!input(pin_a2)){
            ds1307_get_date(day,month,yr,dow);
            ds1307_get_time(hrs,min,sec);
            printf(lcd_putc,"\f%02d:\%02d:\%02d \n %2.0f%cC  ",hrs,min,sec,temperatura,0xdf);
            delay_ms(1000);
     }

porém o programa fica preso dentro do meu while e quando volta ele esta dando umas travadas, e caso eu queira ajutar o relogio com A2 ativado ele nao aparece pois esta preso, esta funcionando porém preso.

Se usar o IF a atualizacao dos segundos atrasa de 2 em 2 segundos.... nao sei porque...

 

 

 

Segue o final do programa completo:

 

default:
         { 
            adc = read_adc();               //Lê canal 0
            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.
           
            if(!input(pin_a1))
            output_high(pin_b6);
            else
            output_low(pin_b6);  
           
         
            ds1307_get_date(day,month,yr,dow);
            ds1307_get_time(hrs,min,sec);
           
            printf(lcd_putc,"\f%02d:\%02d:\%02d \n%02d/\%02d/\%02d",hrs,min,sec,day,month,yr);
           

            while(!input(pin_a2)){
            adc = read_adc();               //Lê canal 0
            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.
           
            ds1307_get_date(day,month,yr,dow);
            ds1307_get_time(hrs,min,sec);
           
            printf(lcd_putc,"\f%02d:\%02d:\%02d \n %2.0f%cC  ",hrs,min,sec,temperatura,0xdf);
            delay_ms(1000);
           
           }
           
         
            delay_ms(1000);

         }
      }
   }

 

 

Alguem poderia me ajudar?

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...