Ir ao conteúdo

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


terraviva

Posts recomendados

Postado

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

  • Membro VIP
Postado

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.

Postado

Certo...Bom ... se poder me ajudar eu agradeço...Como posso exibir então uma variavel ou uma mensagem qualquer  por inteira, vindo por rs232 no formato char, isto para fins de estudos...mais uma vez, te agradeço se poder me ajudar...

Postado

@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

Postado

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;      }   }}
  • Membro VIP
Postado

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

Postado

Amigos ...a todos agradeço a atenção desde já...farei sim os testes e breve retornarei com mais detalhes.....acredito que com a ajuda de vocês agora conseguirei sim....

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!