Эта функция вызывается только из прерывания или из основной программы тоже? Если из двух мест, то надо делать либо две разных функции, либо объявлять ее реентерабельной (в документации написано как). А вообще-то у Кейла-51 это такая фича - компилированный стек в памяти.
Дело в том, что в наборе команд MCS-51 отсутствуют эффективные методы работы с переменными на стеке. Поэтому компилятор заранее выделяет в ОЗУ ячейки для передачи параметров в функцию. Если функция вызывается рекурсивно или из основной программы и прерывания, то эта память затирается вложенным вызовом.