Створюємо новий проект, як ми робили це раніше, який я назву conv Напишемо програму:

#include <pic16f887h> typedef unsigned int word

word at 0x2007 CONFIG1 = 0x2FF2

char text [4] / / Масив для зберігання тексту unsigned int dat = 1023 / / Ціле для перетворення char tmp = 0 / / Тимчасова змінна

void main(void) {

tmp = dat/1000 / / Скільки тисяч в числі

if (tmp == 0) text [3] = 48 / / Якщо нуль, то нуль і запишемо else text [3] = tmp + 48 / / Інакше переведемо в символ цифри

if (tmp = 0) dat = dat – 1000 * tmp / / Видалимо тисячі з числа tmp = dat/100 / / Скільки сотень в числі

if (tmp == 0) text [2] = 48 / / Якщо нуль, то нуль і запишемо else text [2] = tmp + 48 / / Інакше переведемо в символ цифри

if (tmp = 0) dat = dat – 100 * tmp / / Видалимо тисячі з числа tmp = dat/10 / / Скільки десятків в числі

if (tmp == 0) text [1] = 48 / / Якщо нуль, то нуль і запишемо else text [1] = tmp + 48 / / Інакше переведемо в символ цифри

if (tmp = 0) dat = dat – 10 * tmp / / Якщо не нуль, то видалимо десятки text [0] = dat + 48 / / Переведемо залишок на символ цифри

for ( ) {/ / нескінченний цикл

}

}

Після трансляції програми і запуску відладчика я додам спостереження за змінною text Оскільки ця змінна (масив) з чотирьох байтів, я зміню розмір змінної (клацання правою клавішею мишки по змінної):

Рис 515 Перевірка роботи програми в MPLABX

Як і у випадку зміни розміру змінної, якщо натиснути правою клавішею мишки за значенням цієї змінної, то з випадаючого меню можна вибрати вид відображення На малюнку символьне відображення значення

Коли я дійшов до цього місця в оповіданні, мені захотілося перевірити перетворення інших чисел Я змінив значення змінної dat на 750, почав було показувати, як все чудово вийшло, але ..

Рис 516 Дивний результат при конвертації числа 750

Я багато разів повторював програму в різних варіантах, повторював з іншими числами, виводив і в символьному вигляді, і в шістнадцятковому .. Я перевірив налагодження початкової програми в MicroC і не виявив дивацтв Отриманий результат не тільки спантеличив мене, а й заінтригував Програма досить проста, щоб у ній не розібратися, а розібратися в що відбувається не виходить

Щоб позбутися від деяких сумнівів, я в програмі MicroC додав висновок на РКІ Результат роботи програми я порівняв з виведенням на РКІ програми (нагадаю, програма одна і та ж) оттранслірованном в MPLABX

Рис 517 Результат роботи hex-файлу з MicroC

Будь-які числа, що привласнюються в цьому випадку змінної dat, правильно відображаються після трансляції на РКІ

Рис 518 Результат роботи hex-файлу з MPLABX

Не хочу вас втомлювати подробицями експериментів, наведу тільки результат

Формально операція tmp = dat/100 може не викликати сумнівів, при тому, що перша змінна має байтовий тип, а друга беззнакове ціле Після розподілу виходить число в діапазоні 0-9, яке вміщується в байт Мова Сі не надто вимогливий до застосування типів даних, залишаючи це на совісті програміста Але різні компілятори можуть інтерпретувати події по-різному

Досить у програмі, яка транслюється компілятором SDCC, змінити тип даних змінної:

unsigned int tmp = 0

щоб отриманий hex-файл правильно відображав будь-які числа

Рис 519 Остаточна перевірка програми в режимі налагодження Той же результат дає і програма, що виводить число на РКІ

Можна було б не розповідати про цей казус, але це хороший приклад того, що слід бути дуже уважним при використанні мови Сі, і не залишати без уваги будь дивацтва і неполадки

Повернемося до первісної завданню

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012