Всем GD!
To VOVA080808 .
Владимир, у Вас ошибки начинаются с самой первой операции с массивом.
MP[15]=S/0x8000 ; Результат этой операции будет всегда 0.
Вам Геннадий уже указал на то, что во всех операциях происходит переполнение разрядной сетки. И именно по этой причине результат того, что он предложил, тоже всегда будет равен 0.
MP [15] = (S & 0x8000) != 0; MP [15] будет всегда 0, потому, что результат логического умножения 0b11111111 & 0b1000000000000000=0 ;
Z5=0b001000010000000 0;
Результат этой операции совсем не тот, что Вы хотите, у Вас все переменные объявлены как unsigned short (unsigned char или 8 бит).
После этой операции будет Z5=0b00000000; , потому что Z5 объявлена как 8-битная переменная, компилятор под эту переменную выделит только ОДИН байт в памяти переменных, и старшие биты 0b00100001 первоначального значения при присваивании будут потеряны - надо разместить 16 бит, а места только под 8 выделено;
Все переменные у Вас объявлены как unsigned short Z1 , Z2 , Z3 , Z4 , Z5 , MP[16];Это значит что значения , которые они могут принимать лежат между 0 и 255. Если в результате операции над этими числами будет получено число более 255, то все значащие разряды старше 8-го в (в двоичной системе исчисления) будут потеряны. Если образно — то это выглядит как мультик у дяди билла, когда удаляешь файл — летит и испаряется в воздухе.
К точно такому же результату приведет попытка операций когда идет арифметика 16 битных чисел с 8 битными числами (если компилятор не предусматривает автоматическое преобразование типов).
MP[15]=S/0x8000 ;
Именно поэтому, когда даже S=255 (максимальное значение) делить на 0х8000(32768d) получим число меньше 1, в целочисленной арифметике это 0.
Поэтому, первое, что Вам надо сделать, это разобраться с ТИПАМИ целых переменных и преобразованием одного типа в другой. Всегда следить за возможностью переполнения разрядной сетки.
В Шпаке это все есть, прочтите раз 30, на 31 раз наступит прояснение. Пока не наступит прояснение, дальнейшие действия будут напоминать блуждание в потемках.
Для начала попробуйте все переменные объявить как unsigned int. Правда это не исключит возможность переполнения, т.к. у Вас числа очень большие, да и потом, когда наступит необходимость посылки в порт, который обычно в контролёре 8 бит, придется чтобы компилятор не ругался, делать преобразование типов:
PORTC= (unsigned short) MP[k];
Либо, если хотите работать в пределах unsigned short, то следите, чтобы на любом этапе вычислений операнды и результат не превышал 255d (0xFF).
Изучите операции выделения отдельных битов (логическое умножение в Булевой алгебре, в СИ оператор &). Похоже, Вам именно эти операции так необходимы в Ваших исканиях.
Николай.