Últimos assuntos
Quem está conectado?
Há 378 usuários online :: 3 registrados, 0 invisíveis e 375 visitantes :: 2 motores de busca#finofliperama, adamoa1, gamemaniaco
O recorde de usuários online foi de 1034 em Sex 24 Jul 2015, 10:41
Tópicos semelhantes
Anuncios
Nenhum anúncio
PIC16F628 - Display e teclado no mesmo PORT (resolvido)
2 participantes
Página 1 de 1
PIC16F628 - Display e teclado no mesmo PORT (resolvido)
Pessoal aos poucos estou aprendendo a programar PICs com o PIC C Compilerseguindo video aulas e foi passado um exemplo aonde se mostra um display alfanumérico e um teclado 4x3 juntos no mesmo PORT mas fiz tudo exatamente como se pede mas não funciona de forma alguma.
Print do projeto
Código
Segundo o próprio instrutor, o display é automaticamente definido para o PORTD mas em MCUs que não tem ele que é o caso do 16F628A o display já é definido automaticamente para o PORTB
Já tentei de tudo, mudei de display do LM044L para o LM016L, mudei de PIC do 16F628A para o F88 (refazendo claro todo o código) mas não adianta, o PIC C Compiler compila sem erros, o Isis simula sem erros mas ao pressionar o teclado nada acontece.
Print do projeto
Código
- Código:
#include <16F628A.h>
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=4000000)
#define use_portb_kbd TRUE //Teclado definido para o port B
#include <KBD.C>
char tecla;
#include <lcd.c>
void main()
{
kbd_init();
lcd_init();
while(TRUE)
{
tecla=kbd_getc();
delay_ms(1);
if (tecla!=0){ //tecla diferente de zero, foi pressionada
printf(lcd_putc, "%c", tecla);
delay_ms(200);
}
}
}
Segundo o próprio instrutor, o display é automaticamente definido para o PORTD mas em MCUs que não tem ele que é o caso do 16F628A o display já é definido automaticamente para o PORTB
Já tentei de tudo, mudei de display do LM044L para o LM016L, mudei de PIC do 16F628A para o F88 (refazendo claro todo o código) mas não adianta, o PIC C Compiler compila sem erros, o Isis simula sem erros mas ao pressionar o teclado nada acontece.
Última edição por CACÁ em Dom 08 Out 2017, 14:14, editado 1 vez(es)
_________________
CACÁ- Administrador Auxiliar
- DESCRIÇÃO: : Técnico em Eletrônica e informática
TEMPO DE EXPERIÊNCIA : 17 anos/ 9 anos
Sexo :
Número de Mensagens : 19804
Idade : 44
Cidade/Estado: : Ritápolis Minas Gerais
Humor : Bom
Data de inscrição : 25/03/2010
Re: PIC16F628 - Display e teclado no mesmo PORT (resolvido)
Você precisa declarar qual port será utilizado para o LCD!!!
#define LCD_DATA_PORT getenv("SFR:PORTB");
#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
Exemplo
Para não haver ruídos no display, aterre os pinos D0~D3!!!
Pino RW também pode ser aterrado, utilizando um pino a menos para o display. Porém terá que editar o arquivo LCD.C, mas é melhor deixá-lo sem modificações para não haver problemas com a biblioteca.
Para isso, recomendo o uso da biblioteca flex_lcd.c ... é melhor para ser utilizada do que a padrão do CCS C Compiler. Além dela já vir com o RW desabilitado!!!
Utilizando a biblioteca flex_lcd:
Salve uma cópia acima dentro de seu projeto!!!
Meus arquivos download:
Flw...
#define LCD_DATA_PORT getenv("SFR:PORTB");
#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
Exemplo
- Código:
#include <16F628A.h>
#use delay(internal=4000000)
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#define use_portb_kbd TRUE //Teclado definido para o port B
#include <KBD.C>
char tecla;
#define LCD_DATA_PORT getenv("SFR:PORTB");
#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>
void main()
{
kbd_init();
lcd_init();
lcd_putc("\fTeste de LCD\r\n"); // \f limpa a tela, \r\n muda de linha
while(TRUE)
{
tecla=kbd_getc();
delay_ms(1);
if (tecla!=0){ //tecla diferente de zero, foi pressionada
printf(lcd_putc, "%c", tecla);
delay_ms(200);
}
}
}
Para não haver ruídos no display, aterre os pinos D0~D3!!!
Pino RW também pode ser aterrado, utilizando um pino a menos para o display. Porém terá que editar o arquivo LCD.C, mas é melhor deixá-lo sem modificações para não haver problemas com a biblioteca.
Para isso, recomendo o uso da biblioteca flex_lcd.c ... é melhor para ser utilizada do que a padrão do CCS C Compiler. Além dela já vir com o RW desabilitado!!!
- Código:
//*****************************************************************************
// CCS C Compiler for PIC
//*****************************************************************************
// flex_lcd.c
// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver. Change these
// pins to fit your own board.
#define LCD_RS PIN_B1
#define LCD_E PIN_B0
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.
// #define USE_LCD_RW 1
//========================================
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.
#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_cycles(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
return(retval);
}
#endif
//---------------------------------------
// Read a byte from the LCD and return it.
#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high<<4) | low);
}
#endif
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------
void lcd_init(void)
{
int8 i;
output_low(LCD_RS);
#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif
output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 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(c)
{
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;
}
}
//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
return(value);
}
#endif
Utilizando a biblioteca flex_lcd:
Salve uma cópia acima dentro de seu projeto!!!
- Código:
#include <16F628A.h>
#use delay(internal=4000000)
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#define use_portb_kbd TRUE //Teclado definido para o port B
#include <KBD.C>
char tecla;
#define LCD_DATA_PORT getenv("SFR:PORTB")
#include "flex_lcd.c"
void main()
{
kbd_init();
lcd_init();
lcd_putc("\fTeste de LCD\r\n"); // \f limpa a tela, \r\n muda de linha
while(TRUE)
{
tecla=kbd_getc();
delay_ms(1);
if (tecla!=0){ //tecla diferente de zero, foi pressionada
printf(lcd_putc, "%c", tecla);
delay_ms(200);
}
}
}
Meus arquivos download:
- Código:
https://www.4shared.com/rar/0uszaj12ei/LCD_e_KEYBD.html
Flw...
_________________
No mundo só existem 10 tipos de pessoas: as que conhecem binário e as que não conhecem!!!
nagkiller- Moderador do fórum
- DESCRIÇÃO: : Técnico em Eletrônica e informática
TEMPO DE EXPERIÊNCIA : Desde 1990
Sexo :
Número de Mensagens : 2997
Idade : 44
Cidade/Estado: : Garça - São Paulo
Humor : Depende
Data de inscrição : 23/11/2011
Re: PIC16F628 - Display e teclado no mesmo PORT (resolvido)
Opa, valeu mesmo, eu achava que pelo que o próprio instrutor disse no vídeo, o display já vinha definido automaticamente para o PORT D mas se usar PICs de 18 pinos e dois ports ele era definido automaticamente para o PORT D.
Vou simular aqui, mais uma vez muito obrigado.
Vou simular aqui, mais uma vez muito obrigado.
_________________
CACÁ- Administrador Auxiliar
- DESCRIÇÃO: : Técnico em Eletrônica e informática
TEMPO DE EXPERIÊNCIA : 17 anos/ 9 anos
Sexo :
Número de Mensagens : 19804
Idade : 44
Cidade/Estado: : Ritápolis Minas Gerais
Humor : Bom
Data de inscrição : 25/03/2010
CACÁ- Administrador Auxiliar
- DESCRIÇÃO: : Técnico em Eletrônica e informática
TEMPO DE EXPERIÊNCIA : 17 anos/ 9 anos
Sexo :
Número de Mensagens : 19804
Idade : 44
Cidade/Estado: : Ritápolis Minas Gerais
Humor : Bom
Data de inscrição : 25/03/2010
Tópicos semelhantes
» erro no display com projeto usando pic16f628
» Resolvido-dica:Microondas Britânia-BM22PR-teclado bloqueado e display c/segmentos cortado.
» Microondas pifa o Display e trava o teclado.
» Resolvido-dica:Microondas Britânia-BM22PR-teclado bloqueado e display c/segmentos cortado.
» Microondas pifa o Display e trava o teclado.
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
Hoje à(s) 16:02 por SEBCICM
» PS2 Slim 90k testar entradas do memory card
Hoje à(s) 11:51 por gamemaniaco
» Procuro a placa lateral do sistema de som Sony MHC-GTX88 e Ci BD3451KS
Hoje à(s) 10:16 por Silas Silva Nogueira
» Caixa de Som Amplificada CSR 4000A Som Distorcido e Pouca Potência!!!
Hoje à(s) 08:18 por jailton da silva santos
» Tv lcd,marca Aoc, modelo- LE 39D0330 -defeito,só liga depois de um tempo(quando aquece)
Hoje à(s) 08:06 por jailton da silva santos
» fonte taramps tef 60 amperes ci estourado
Ontem à(s) 19:27 por antonio carlos bitti
» [Resolvido] TV PLASMA SAMSUNG PL51F4900AG Não liga , led stand by piscando ( RESOLVIDO )
Ontem à(s) 13:28 por Paranista
» TV LG MODELO 42LB5600 ACENDE O LED MAS NÃO LIGA
Qua 20 Nov 2024, 18:27 por Tales g
» TV STI DL3270 A W , sem audio
Qua 20 Nov 2024, 15:02 por valdircp
» Compro placa principal da LG 42lh45ed ou 42lh40ed
Seg 18 Nov 2024, 11:22 por Paulo Costa II
» Som Philips fw c 505 Ajuda entender o esquema
Sáb 16 Nov 2024, 10:03 por nagkiller
» (Resolvido) AIWA NSXF959 SEM SOM MÉDIOS AGUDOS
Sáb 16 Nov 2024, 00:31 por ZACREAL
» como descartar TRC
Sex 15 Nov 2024, 08:32 por jailton da silva santos
» cliente que não busca os aparelhos consertados, o que fazer
Sex 15 Nov 2024, 00:59 por MARIO Y. SEGAWA
» compro placa pricipal tv lg 50pb560
Qua 13 Nov 2024, 11:11 por Eletronica Manoel
» Modulo Taramps t800.1 com os resistores r32 e r5 torrados
Seg 11 Nov 2024, 10:41 por prisma eletronica
» Akai AA-A35 Seletor de Tensão
Seg 11 Nov 2024, 08:34 por city2010
» [RESOLVIDO] TV LCD UN50FH5303G Componentes danificados
Seg 11 Nov 2024, 00:54 por nagkiller
» TV PANASONIC TC- 32A400B Imagem travando
Dom 10 Nov 2024, 16:01 por ramon figueiredo
» ATENÇÃO de todos os usuários da 2002! (Nova regra).
Dom 10 Nov 2024, 12:00 por robsonseixas
» Microondas MEF-41 Eletrolux, não acende luz da porta quando abre, e quando fecha não liga
Sex 08 Nov 2024, 22:30 por joaquimrosadesouza
» Caixa som Ciclotron mult 500 Preciso do esquema
Sex 08 Nov 2024, 21:34 por prisma eletronica
» Pessoal tenho placa barato.
Sex 08 Nov 2024, 20:47 por francisco carlos de jesus
» PLACA PWM dos Módulos Roadstar RS-10000D Earthkaque e RS-6800D Agressive SPL
Sex 08 Nov 2024, 19:23 por NITRO
» Projetor LG BS 275 Liga e logo da mensagem de cooler bloqueado
Sex 08 Nov 2024, 13:05 por Paranista
» Cd Player Carrossel Sony - Não fecha a gaveta nem gira o carrossel
Qui 07 Nov 2024, 14:15 por Denisson Ventura
» OU O FÓRUM ACABOU OU NINGUÉM PARTICIPA DO FÓRUM MAIS.
Qui 07 Nov 2024, 12:09 por Paranista
» TV PHILCO TP1452N TELA ESCURA
Qua 06 Nov 2024, 17:36 por jailton da silva santos
» TV LED LE3256(A)w dados da flash Resolvido
Qua 06 Nov 2024, 12:12 por everardes
» Procuro esquema elétrico da fonte TV lg 42lb5800 EAX65423701(2.1)
Seg 04 Nov 2024, 12:22 por joaquimrosadesouza