Not that I can think of. That function could be a bit neater, though, in which case you might not object to using it:
// Reserve all-caps for macros
// "const" helps ensure you don't try to modify the string by mistake, you'll get a compiler error if you do
void lcd_print (const char *st, uint8_t x, uint8_t y)
{
uint8_t i;
// No need to count the string's length twice. strlen() just looks for a NUL character at the end, which you
// can do in your loop
// stl = strlen(st);
x=((disp_y_size+1)-(stl*cfont.x_size))/2; // What about this line? Why are you setting X when it's been passed in?
for (i=0; st[i]; i++) // Go until st[i] is no longer nonzero (NUL is zero)
PrintChar(st[i], x + (i*(cfont.x_size)), y); // Indent for clarity
}
So we have:
void lcd_print (const char *st, uint8_t x, uint8_t y)
{
uint8_t i;
x=((disp_y_size+1)-(stl*cfont.x_size))/2; // Still not sure what's going on here
for (i=0; st[i]; i++) // Go until st[i] is no longer nonzero (NUL is zero)
PrintChar(st[i], x + (i*(cfont.x_size)), y);
}
Which is a perfectly serviceable C function in just three lines plus variable declaration.
Alternately, you might investigate writing an LCD output backend for the built-in IO functions like printf(). It's not hard, but it depends on the implementation and I don't know Atmel's C library. You can use a simple cursor in that case and include a set_cursor() function.
Edit: I noticed your other use of stl. Hold on, might need a bit of an adjustment...
How does PrintChar() work - what are the parameters supposed to be? I'm not sure what the x variable is supposed to be.