Desculpe a demora, mas fiquei extremamente ocupado nessas últimas horas.
A boa notícia é que consegui o meu intento.
Fiquei estudando e questionando porque o código do Andre que deveria estar funcionando corretamente não estava.
Então descobri que o problema estava na linha do 'printf'. Percebi de pronto que alterando o valor do "%LU"para combinar alguns dígitos e também acrescentando e arbitrando valores a variavel 'valor' na mesma linha do printf, finalmente consegui que o contador do B5 funcionasse. Porém os valores do contador iniciavam com um offset de 10 em todos os 'cases'. Ex. 1010, 1510, etc. Então estipulei 'valor-10' na linha e tudo se resolveu. Quando finalmente comprovei que estava funcionando corretamente, parti para o intento de fazer com que o pino B6 atuasse como decremento de 15 unidades. Copiei as instruções correspondentes, compilei e quando fui testar, vi que apesar do decremento estar funcionando corretamente, o valor inicial do case 1 por exemplo não era mais '1000' e sim '1521'. Os outros cases também estavam com offset de +521. Então realizei o mesmo procedimento descrito anteriormente e escrevi na linha 'valor-531". E tudo se resolveu.
Só que no decremento de 15, ao invés de mostrar 985, o display está mostrando 1085. E assim procede com os outros cases, ou seja com decremento somente nas duas últimas casas (unidade e dezena) e mantendo centena e milhar inalterados.
Estou disponibilizando o código abaixo para que os experts andre e ze me expliquem porque tive que utilizar um offset de -10 no primeiro caso para o incremento de B5 e de -531 no segundo caso para o decremento de B6. De onde o compilador 'tirou' esses valores que iniciaram no simulador do PROTEUS, pois não consigo ver nenhuma pista no código escrito que referencie a esses valores? E como fazer para que de 1000-15 ele vá para 985 e não para 1085 (case 1), 1500-15=1485 e não 1585 (case 2), etc.?
Abçs e muito obrigado.
- Código: Selecionar todos
#include <hung1.h>
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
#int_rb
INT1 SW1;
INT1 SW2;
INT1 SW3;
BOOLEAN ISPRESSED_KEY1=FALSE; // Boolean logic=0;
BOOLEAN ISPRESSED_KEY2=FALSE; // Boolean logic=0;
BOOLEAN ISPRESSED_KEY3=FALSE; // Boolean logic=0;
void main()
{
port_B_pullups(0xFF);
setup_adc_ports(AN0);
lcd_init();
int8 cont;
cont = 0;
Int16 valor;
while (true)
{
SW1=INPUT(PIN_B4); // Positive inputs
SW2=INPUT(PIN_B5);
SW3=INPUT(PIN_B6);
SET_ADC_CHANNEL(0); // INPUT AN0
DELAY_MS(10);
if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3) )
{
DELAY_MS(10);
if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000
{
if(++cont >= 4) cont = 1;
ISPRESSED_KEY1=TRUE ;
}
if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
{
valor+=10;
ISPRESSED_KEY2=TRUE;
}
if ( (SW3 && !ISPRESSED_KEY3) ) // incrementa valor padrao em passos de 10 unidades
{
valor-=15;
ISPRESSED_KEY3=TRUE;
}
switch(cont)
{
case 1:
if ( ISPRESSED_KEY1 )
lcd_putc("\fTEXTO1");
lcd_gotoxy(7,2);
if ( ISPRESSED_KEY2 )
printf(lcd_putc," 1%03LU ",valor-531);
break;
case 2:
if ( ISPRESSED_KEY1 )
lcd_putc("\fTEXTO2");
lcd_gotoxy(7,2);
printf(lcd_putc," 25%02LU ",valor-531);
break;
case 3:
if ( ISPRESSED_KEY1 )
printf(lcd_putc,"\f");
lcd_gotoxy(2,1);
lcd_putc("TEXTO3");
lcd_gotoxy(7,2);
printf(lcd_putc," 15%03LU ",valor-531);
break;
}
delay_ms(10); // Required for button() function
}
if (!SW1) ISPRESSED_KEY1=FALSE; // This line must be here
if (!SW2) ISPRESSED_KEY2=FALSE;
if (!SW3) ISPRESSED_KEY3=FALSE;
}
}