variavel=952; milhar=variavel/1000; // -> milhar = 952 / 100 = 0 centena=(variavel-milhar*1000)/100; // -> centena = (952 - 1000 * 0) / 100 = 9 dezena=variavel-milhar*1000-centena*100; // -> dezena = 952 - 0 * 1000 - 9 * 100 = 52 dezena=dezena/10; // dezena = 52 / 10 = 5 (dezena/=10) unidade=variavel%10; // -> unidade = 952 % 10 = 2 (pega o resto da divisão) string[0]=milhar+48; // 0 + 48 = 48 = '0' string[1]=centena+48; // 9 + 48 = 57 = '9' string[2]=dezena+48; // 5 + 48 = 53 = '5' string[3]=unidade+48; // 2 + 48 = 50 = '2' string[4]=0; //NULL TERMINATION
Dica:
Se estiver simulando no Proteus carregue o PIC com o arquivo .cof e realize o passo a passo do código (usando o pause, step into e step over), assim você descobrirá onde está o erro.
Não tenho certeza mas acho que o código do Isadora possui um erro. Ele usa um dado em CHAR para realizar uma operação com dados em INT... A milhar fica Ok mas a partir daí ocorrem erros por causa do uso de um dado já convertido para CHAR em outras operações...
Edit:
Outra forma (citada pelo Isadora):
variavel=952;sprintf(string,"%04lu",variavel);
variavel=952; milhar=variavel/1000; // -> milhar = 952 / 100 = 0 centena=(variavel-milhar*1000)/100; // -> centena = (952 - 1000 * 0) / 100 = 9 dezena=variavel-milhar*1000-centena*100; // -> dezena = 952 - 0 * 1000 - 9 * 100 = 52 dezena=dezena/10; // dezena = 52 / 10 = 5 (dezena/=10) unidade=variavel%10; // -> unidade = 952 % 10 = 2 (pega o resto da divisão) string[0]=milhar+48; // 0 + 48 = 48 = '0' string[1]=centena+48; // 9 + 48 = 57 = '9' string[2]=dezena+48; // 5 + 48 = 53 = '5' string[3]=unidade+48; // 2 + 48 = 50 = '2' string[4]=0; //NULL TERMINATION
Dica:
Se estiver simulando no Proteus carregue o PIC com o arquivo .cof e realize o passo a passo do código (usando o pause, step into e step over), assim você descobrirá onde está o erro.
Não tenho certeza mas acho que o código do Isadora possui um erro. Ele usa um dado em CHAR para realizar uma operação com dados em INT... A milhar fica Ok mas a partir daí ocorrem erros por causa do uso de um dado já convertido para CHAR em outras operações...
Edit:
Outra forma (citada pelo Isadora):
variavel=952;sprintf(string,"%04lu",variavel);
Então, tipo eu usei seu exemplo da tabela ascii, de soma 48, vou anexar meu programa pra você entender
char l,c;
void limpa_3()
{
for(l=99;l<116;l++)
{
for(c=55;c<64;c++)
{
glcd_pixel(l,c,0);//limpa posição de temperatura
}
}
}
void main()
{
char hora[] = "10:55";// assim imprime corretamente no display..
char data[] = "22/05/15";
char temp[];// aqui eu preciso modificar, aqui é a variavel que recebe o valor para imprimir no display
long temperatura;
float valor;
int temp_2 [3] = "29";// abaixo apenas variaveis de teste...
char km[] = "110";
char un[] = "Km/h";
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_VREF_VREF);
set_adc_channel(0);
glcd_init(ON); //inicializa o display
glcd_fillScreen(0); //limpa display inteiro
glcd_fillScreen(0); //limpa display inteiro
glcd_imagem(1);
glcd_line(0,43,128,43,1);// linha horizontal, linhas que fiz de moldura no meu projeto
glcd_line(37,43,37,64,1);//primeira linha vertical
glcd_line(90,43,90,64,1);// segunda linha vertical
while(1)
{
temperatura = read_adc();//lendo o conversor AD
valor = (temperatura*0.0488);//logica realizada para pegar uma referência de +5V para o conversor do LM35
valor = valor+48;// exemplo citado pelo test man do forum Clube do Hardware
temp =(char)valor;// conversão float para char, peguei de uma apostila de uma faculdade...
glcd_text57(3,55,hora,1,1);
glcd_text57(40,55,data,1,1);
glcd_text57(100,55,temp,1,1);// mostra valor de temp.
glcd_circle(117,51,2,0,1);
delay_ms(1500);
printf("%f \n \n \n \n \n",valor);
printf("%c",temp);
delay_ms(500);
printf("\f");
limpa_3();//aqui seria o while onde limpa os visores inferiores
valor=0;
temp=0;
// O programa assim esta funcionando para imprimir o 9
//, mas o resto dos caracteres não...
//porém no hiperterminal que coloquei no proteus a variavel temp assume o valor correto..
//só o display que imprime umas coisas nada a ver
// à o programa ta meio bagunçado porque to testando ainda...
tipo o hiperterminal do proteus ta dando o resultado certinho so que o display grafico nao, começa a imprimi umas coisas nada a ver quando varia a temperatura do lm35, só o 9 graus que ele imprime certo....
só pra ressaltar os printf... é da função rs232 que usei o hiperterminal para ver se tava certo a variavel que converte em char, o display é a função GLCD_text57 que imprime... como disse pelo hiperterminal ta tudo certooo