Logo Hardware.com.br
henriqueberthem
henriquebert... Super Participante Registrado
819 Mensagens 13 Curtidas

Construir menu com botões para PIC no MikroC

#1 Por henriquebert... 17/12/2011 - 16:51
Bom galera, estou montando um projeto que possui 3 botões: CIMA, BAIXO, MENU/ENTER.
Esses botões estão ligados na porta B do PIC (RB0, RB1, RB2).
O menu possui:
Temperatura 1
Temperatura 2
Temperatura 3

O PIC inicia mostrando o menu, cai o usuário escolhe qual temperatura quer visualizar e aperta o botão "menu/enter". Caso o usuário queira voltar para o menu e escolher outra temperatura deverá aperta o botão "menu/enter" para volta ao menu.

O problema é que não estou conseguindo fazer este laço de escolha, já possuo as funções temp1(), temp2() e temp3().
Estou usando o PIC 18F4550 e usando o compilador mikroC e simulando o circuito com o ISIS 7

Alguém poderia me ajudar ?
Athlon II 240 2.8GHz l ASUS M4A785-M l 2x 2GB DDR2 1066 G.Skill PI Black @ 1066 5-5-5-15 l GeForce 9600GT (600/1800) l 1TB Seagate 7200.12 + 500GB Seagate 7200.12 l Corsair 650TX l Monitor 19" LG W1952TQ

Win 7 Ultimate PT-BR x64

Home Theather Samsung HT-Z210

visaodupla.com - WebHost
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#4 Por OfflineUser
18/12/2011 - 14:12
Certo, não acho que seja necessário usar um micro controlador tao grande e com tantos pinos, sem contar o preço, para fazer o tal, mas enfim vamos a sua pergunta:

Como eu não quiz explicar muito eu escrevi mais ou menos como voce pode fazer, e uma das opções:



unsigned char FLAG //registrador de flag
unsigned char INDICE //contem o que mostra na tela

#define F_ENTER FLAG.0


void inicializacao_uc()
{
//...inicia o uc
F_ENTER=0; //zera a flag do enter
INDICE=0; //incia mostrando temp0
}


void atualiza_dados()
{
switch INDICE
{
case 0:
temp0(); //mostra temp0
break;
case 1:
temp1(); //mostra temp1
break;
case 2:
temp2; //mostra temp2
break;()

}
}

void main()
{
inicializacao_uc();
while(1)
{
if (chave_enter) F_ENTER=1;

while (F_ENTER)
{
if (chave_up) ++INDICE;
if (chave_down) --INDICE;
if (INDICE==255) INDICE=2; //se o indice for -1 mostra temp3
if (INDICE>=3) INDICE=0; //se o indice for 3 mostra temp0
if (chave_enter) F_ENTER=0; //se pressionar enter novamente sai dos ajustes
}

/*
.....
.....
.....
...
*/
}
}



faz os testes com as cheves e tals, e cria um indice e seleciona ele, conforme for o valor ele mostra tal temperatura.
henriqueberthem
henriquebert... Super Participante Registrado
819 Mensagens 13 Curtidas
#5 Por henriquebert...
21/12/2011 - 20:34
Não estou conseguindo fazer. Segue meu programa:
O esquema de ligação é o mesmo !

// Pinagem do display LCD
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD2_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD2_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// Pinagem do display LCD
// Inicio Caracter Especial
const char character[] = {31,31,31,31,31,31,31,31};
void character_cheio(char pos_row, char pos_char) {
char i;
Lcd_Cmd(64);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
}

const char character1[] = {7,5,7,0,0,0,0,0};

void character_ponto(char pos_row, char pos_char) {
char i;
Lcd_Cmd(73);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character1[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 1);
}
// Fim Caracter Especial

// DECLARAÇÃO DE VARIÁVEIS
int temp1; float temp1_float; char temp1_conv[7];
int temp2; float temp2_float; char temp2_conv[7];
int temp3; float temp3_float; char temp3_conv[7];
char posicao_menu = '0';

void funcao_temperatura(){
character_cheio(1,1);character_cheio(1,2);character_cheio(1,3);
character_cheio(1,17);character_cheio(1,18);character_cheio(1,19);character_cheio(1,20);
lcd_out(1,5,"TEMPERATUAS&quot;
lcd_out(2,1,"TEMP1:&quot;
character_ponto(2,19);
lcd_out(2,20,"C&quot;
lcd_out(3,1,"TEMP2:&quot;
character_ponto(3,19);
lcd_out(3,20,"C&quot;
lcd_out(4,1,"TEMP3:&quot;
character_ponto(4,19);
lcd_out(4,20,"C&quot;
while(1){
temp1 = adc_read(0);
temp1_float = ((temp1 * 0.0049) / 0.01);
IntToStr(temp1_float,temp1_conv);
lcd_out(2,13,temp1_conv);

temp2 = adc_read(1);
temp2_float = ((temp2 * 0.0049) / 0.01);
IntToStr(temp2_float,temp2_conv);
lcd_out(3,13,temp2_conv);

temp3 = adc_read(2);
temp3_float = ((temp3 * 0.0049) / 0.01);
IntToStr(temp3_float,temp3_conv);
lcd_out(4,13,temp3_conv);
}
}

void main(){
// ADCON1 = 0x00; //define pinos como digital
CMCON = 7; //desliga comparadores internos
TRISD = 0; // 0 Define pino como saída
TRISA = 1; // 1 Define pino como entrada (leitura do LM35)
TRISB = 1; // 1 Define pino como entrada (leitura dos push button)

Lcd_Init(); // inicializa display LCD
lcd_cmd(_LCD_CLEAR); // limpa display
lcd_cmd(_LCD_CURSOR_OFF);// cursor off
lcd_out(1,1,"Henrique de Berthem&quot;

delay_ms(1000);
lcd_cmd(_LCD_CLEAR); // limpa display
lcd_cmd(_LCD_CURSOR_OFF);// cursor off
funcao_temperatura();
}
Athlon II 240 2.8GHz l ASUS M4A785-M l 2x 2GB DDR2 1066 G.Skill PI Black @ 1066 5-5-5-15 l GeForce 9600GT (600/1800) l 1TB Seagate 7200.12 + 500GB Seagate 7200.12 l Corsair 650TX l Monitor 19" LG W1952TQ

Win 7 Ultimate PT-BR x64

Home Theather Samsung HT-Z210

visaodupla.com - WebHost
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#6 Por OfflineUser
21/12/2011 - 21:14
Eu não estou entendendo o que você não consegue fazer, veja bem, eu programa em CCS não mikroC , você usa algumas coisas que eu não costumo usar. Mas enfim, não entendo o lance de selecionar a temperatura com chaves se o display exibe todas elas.

Olhando por cima, vejo que sua inicialização esta com poucas coisas adicionadas, por exemplo o TRISB=1 é o mesmo que por "00000001" em binário no registrador do PORTB, portanto, somente o RB0 será entrada, os demais são saidas, para fazer todas como entradas você colocaria 255, ou em bin, 0b11111111.

OBS: Vou baixar um compilador C para mim fazer uns testes aqui, não lembro mais muito bem como se escreve cada um, estou acostumado com basic, e asm.

Me passa esse teu esquema desenhado, o arquivo dsn do proteus, para eu simular aqui, no decorrer assim que eu tenho tempo eu vo tentar de ajudar, mas não conte com isso.
henriqueberthem
henriquebert... Super Participante Registrado
819 Mensagens 13 Curtidas
#7 Por henriquebert...
21/12/2011 - 22:17
Sim, tive que adaptar o LCD para exibir todas as temperaturas.

LINK do esquema:
http://www.megaupload.com/?d=3TQ5Z59B
Athlon II 240 2.8GHz l ASUS M4A785-M l 2x 2GB DDR2 1066 G.Skill PI Black @ 1066 5-5-5-15 l GeForce 9600GT (600/1800) l 1TB Seagate 7200.12 + 500GB Seagate 7200.12 l Corsair 650TX l Monitor 19" LG W1952TQ

Win 7 Ultimate PT-BR x64

Home Theather Samsung HT-Z210

visaodupla.com - WebHost
henriqueberthem
henriquebert... Super Participante Registrado
819 Mensagens 13 Curtidas
#9 Por henriquebert...
22/12/2011 - 01:15
A idéia é ele exibir as temperaturas em uma tela.
Ai quando o usuário apertar o botão ele troca para a exibição de tensões (menu 2).
Caso o usuário aperte novamente ele troca para exibir informações gravas dentro do PIC (menu 3).
E por último quando o usuário apertar ele volta para exibir as temperaturas (menu 1).
Athlon II 240 2.8GHz l ASUS M4A785-M l 2x 2GB DDR2 1066 G.Skill PI Black @ 1066 5-5-5-15 l GeForce 9600GT (600/1800) l 1TB Seagate 7200.12 + 500GB Seagate 7200.12 l Corsair 650TX l Monitor 19" LG W1952TQ

Win 7 Ultimate PT-BR x64

Home Theather Samsung HT-Z210

visaodupla.com - WebHost
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#10 Por OfflineUser
23/12/2011 - 21:40
Para fazer isso podes usar uma interrupção, onde você fica checando alguma variavel, atualizando os dados de temperatura, em conjunto com a leitura do teclado e claro, ao pressionar alguma tecla tu alteras o valor da variavel que citei antes, usa um switch checando ela junto com a atualização e tal, e assim tu seleciona outra rotina, ou sei la, depende de voce o que quiser tratar, não sei se me entendes.
henriqueberthem
henriquebert... Super Participante Registrado
819 Mensagens 13 Curtidas
#11 Por henriquebert...
24/12/2011 - 00:18
Mas é exatamente isso que eu pensei em fazer.
O problema é escrever o código que faz a função de "alterar" a variável ao apertar o switch.
Pois daí eu criaria diversar funções secundárias onde estariam os dados que eu queira exibir, e na main() eu faria um while eterno testando o precionamento dos switch e gravando isso numa variável e depois cairia num switch-case onde ele testaria o valor dessa varíavel e chamaria a função que vai escrever no LCD.
Athlon II 240 2.8GHz l ASUS M4A785-M l 2x 2GB DDR2 1066 G.Skill PI Black @ 1066 5-5-5-15 l GeForce 9600GT (600/1800) l 1TB Seagate 7200.12 + 500GB Seagate 7200.12 l Corsair 650TX l Monitor 19" LG W1952TQ

Win 7 Ultimate PT-BR x64

Home Theather Samsung HT-Z210

visaodupla.com - WebHost
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal