cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 5, 3 & 1 MCU

Anonymous
Not applicable

Hi guys. I am doing a project for the University that deals with PSoC 1, specifically CY8C27443-24 PXI. Here is the thing, I'm trying to print a float value on a 16x2 LCD with LCD_PrString() function, this function accepts as parameter a char *. Here is an example of how I print in the LCD.

   

float var_float=1.235456829;    // this is the result of a mathematical operation, I do not know the exact value, this is an example.

   

char* var=ftoa(var_float, &status);   // this function converts from float to char* in order to show the number on the LCD

   

LCD_1_PrString(var);  // this is the function for printing on the LCD.

   

The problem is that the number displayed on the LCD has several decimals and I want to round it only in 2 or 3 decimals. The result I have in the LCD is, for example: 15,12399999999 (always with a lot of 9s at the end of the number). How Can I solved this, I've tried with several examples from internet and it does not work.

   

Thanks in advanced and sorry for my English, I am from Cuba.

0 Likes
1 Solution
JoMe_264151
Expert II

I would

   

separate fractional part from the integer part.

   

print the integer part

   

Rounding to 3 digits precision is done by (fractional part + 0.0005) * 1000 and taking the integer part.

   

Print decimal point

   

Convert integer part to string and expand with leading zeroes (0) until the length is 3

   

Print the string.

   

 

   

Or

   

Get a CY8CKIT-043 PSoC4-M Prototyping Kit and use sprintf()

   

 

   

Bob

View solution in original post

0 Likes
7 Replies
JoMe_264151
Expert II

I would

   

separate fractional part from the integer part.

   

print the integer part

   

Rounding to 3 digits precision is done by (fractional part + 0.0005) * 1000 and taking the integer part.

   

Print decimal point

   

Convert integer part to string and expand with leading zeroes (0) until the length is 3

   

Print the string.

   

 

   

Or

   

Get a CY8CKIT-043 PSoC4-M Prototyping Kit and use sprintf()

   

 

   

Bob

View solution in original post

0 Likes
Anonymous
Not applicable

The kit is out of the question, jaja. I am lucky of having this PSoC in my hands. On the other hand, I tried to do what you say and did not work. The number printed is a wrong number, I've read that with float variables this can happen. Any other ideas???

0 Likes
JoMe_264151
Expert II

Do it piece-by-piece: there are no issues in float calculations.

   

print the integer part of your float. Correct??

   

Get the fractional part. Multiply with 10, print integer part. Correct?

   

Multiply by 100. print integer part. Correct?

   

Multiply by 1000. print integer part. Correct?

   

 

   

Happy coding

   

Bob

cadi_1014291
Valued Contributor

Hi,

   

I had never used PSoC1 but the following works with PSoC4 and 5LP, you can convert the float into a character array using sprintf function, in your case it can be:

   

 

   

float var_float = 1.235456829; // This is your float

   

char string_to_print[10] = { 0 }; // Character array, here sprintf will place the conversion

   

sprintf(string_to_print, "%.2f", var_float); // The %.2f notation is what you are looking for, sprintf will take var_float and   // "convert" it into a character array with 2 decimals, you want three decimals instead? use "%.3f"

   

LCD_PutString(string_to_print); // Print the result on the LCD

   

 

   

Let us know if this works, if not you can search for PSoC Latinoamerica in Facebook and there you can post questions on our beautyful mother language spanish, un saludo :).

   

 

   

Carlos

0 Likes
JoMe_264151
Expert II

@Carlos, sprintf() was not introduced for PSoC1.

   

 

   

Bob

0 Likes
cadi_1014291
Valued Contributor

Damn, i knew it was to easy to solve xD, as i said i had never used PSoC1 ( i though it was very simmilar to PSoC4 or 5 ).

   

To the OP: use the Bob solution 🙂

0 Likes
Anonymous
Not applicable

Hi guys:

   

Well, I had to do my own method. I multiplied by 100 the float, and then I divided by 100 and stored the data in an integer, so I kept the integer part, and then I had to separate the fractional part into "one digit" pieces in order to show them on the LCD, I did it that way because otherwise I cannot show the 05 of the number 3.05 on the LCD for example, it skips the 0. So it is functioning perfectly. Thanks a lot for your help.

   

PS Carlos, ok, i will search for that page jajaja.

   

Ale.