Ir ao conteúdo
  • Cadastre-se

Como mostrar leitura RS232 em um LCD 16x2 ou 20x4


Posts recomendados

Olá galera... Estou precisando da ajuda de vocês...Preciso ler a entrada RS232 e mostrar a informação em um lcd16x2 ou 20x4...a informação seria +/- do tipo 20 20 0A 20 0D 20 73 ...  Gostaria de receber o código todo, principalmente os números.   Estou programando no CCS, e simulando no Proteus, o Pic é o 16F876...alguém já teve esta honrável experiencial ou algo semelhante....Até +..

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

já tive sim amigo. de fato tenho um projeto exatamente assim. pena não poder te passar pois é de uso interno da empresa. e infelizmente não ccs. Mas não é difícil. A essência é (a que eu fiz): receber um pacotinho de bytes que contenha: byte "começador" - "palavra" propriamente dita - byte "finalizador", bastando escrever a "palavra" no display. você pode p.ex. usar uma matriz[32] (o que eu fiz) para alojar os dados dentro da interrupção da serial. Bem, a essência é essa. você pode rebuscar um pouco com um protocolo mais complexo com checksum e tal. Mas isso sugiro numa outra etapa. Aguarde programadores nível ccs.

Link para o comentário
Compartilhar em outros sites

@terraviva,

 

Eu usava o velho conceito de buffer circular, com dois ponteiros, e procurava sempre os códigos 0D e 0A em ASCII, que significam fim de linha e retorno de carro, e assim sabia que havia recebido o final a mensagem e então exibia no display LCD. Mas tem de tomar cuidado para tratar o tamanho máximo de linhas e colunas de seu display.

 

Creio que uma boa olhada nas velhas tabelas ASCII e comunicação Baudot podem te esclarecer o funcionamento completo quando aos 0D's e 0A's.

 

Aguarde alguém que programe em CCS, pois eu fiz isso em Basic...

 

Paulo

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

Olá, o programa abaixo recebe dados pela serial, quando recebe o valor 249 (0xF9), entende que é o inicio da recepção de uma string de caracteres, quando recebe 254 (0xFE) entende que o byte seguinte será um comando para ser enviado ao LCD. 

A string de caracteres é enviada ao LCD caracter por caracter conforme vai recebendo, então, caso queira armazenar, será preciso criar um array.

 

Dúvidas retorne.

 

Programa de recepção:

#include <main.h>#include <lcd.h>#define LIGA output_high#define DESLIGA output_low#define PWM2 PIN_C3#byte RCSTA = 0X18#byte RCREG = 0x1A //posição que contém dado recebido pela serial//Variáveis globaisint1 bComandoLcd, bRecebeCmd, bR;int iValor, iComando, iDado, iSLcd;int16 iCont;#int_RDA //Interrupção de dado na serialvoid  RDA_isr(void){       iDado = RCREG;      if(iDado == 249 && !bR){      //bR - Flag q habilita recepção de uma string de caracteres      bR = 1;      iDado = 0;      return;   }      if(iDado == 249 && bR){      bR = 0;      iDado = 0;      return;   }      if(bR){      iSLcd = iDado;      iDado = 0;      return;   }         //Se receber 254 (0xFE) liga flag de recepção de comando p LCD   if(iDado == 254 && !bRecebeCmd){      iValor = iDado;      iDado = 0;      bRecebeCmd = 1;      return;   }      //Recebe o comando a ser enviado ao LCD   If(iValor == 254 && bRecebeCmd){      bRecebeCmd = 0;      iValor = 0;      iDado = 0;      bComandoLcd = 1;      iComando = RCREG;      return;   }         }void main(){    enable_interrupts(INT_RDA);   enable_interrupts(GLOBAL);      lcd_ini();    limpa_tela();   cursor(1);     bComandoLcd = 0;   iComando = 0;   iValor = 0;   iCont = 0;        for(;{            if(bComandoLcd){         bComandoLcd = 0;         lcd_envia_byte(0, iComando);         iComando = 0;      }               if(iSLcd && bR){         if(iSLcd >= 32 && iSLcd <= 126){             printf(lcd_escreve, "%c", iSLcd);                     }         iSLcd = 0;      }           }}

Programa de transmissão:

#include <628TX.h>#include <teclas.h>int iTeclaAtu;void main(){      for(;{            iTeclaAtu = teclas();            if(iTeclaAtu == 1){         putc(249);         printf("Teste");         putc(249);         iTeclaAtu = 0;      }               if(iTeclaAtu == 2){         putc(0xFE);         putc(1);         iTeclaAtu = 0;      }   }}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

um teste extremamante simples é avaliar o flag de recepção sem interrupção nem nada

você já deve saber como acertar o hw do mc ,né?!

for(;{if (RCIF) puchar_no_lcd(RCREG); //também a função de escrever no lcd é por sua conta}

mais absolutamente nada. Faça isso pra ve se entendeu o conceito e se está comunicando direito. É o seu hello world. Use o terminal do proteus. tecle algo e veja no display. A fase do buffer vem depois

  • Curtir 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!