With the Hitachi protocol LCDs you are supposed to check the busy flag before doing any writes.
That should be done in your LCD library.
Maybe your library doesn't do that correctly, maybe your simulator doesn't handle the busy flag correctly.
Why don't you just try it with real hardware?
I don't like your ascii_to_int()
First of all, it's really int_to_ascii or even scancode_to_keycode.
You don't need a break if you have return.
You don't need to set pulsador just to return it, return 55.
You shouldn't use ASCII numeric values when a char is clearer, return '7'.
A lookup table is shorter, more efficient and clearer:
const char keys[16]={'7', 8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', 'C', '0', '=', '+'};
Edit: I forgot 7.