Думаю тут не в компиляторе проблема. Если 18-й пик, то нужно LATD использовать. Если 16-й, я бы ввёл дополнительную переменную, можно всё красиво в виде структуры с соответствующими полями сделать, менял сначала нужный бит в этой переменной и записывал её в порт. Точно помню, что так делал с PORTA. Он тоже "не запоминает" биты.