Views: 1664
Работа с многобайтными переменными.
Например, нам необходимо получить данные из таймера (16 разрядный режим) TMR0 и записать в 16 разрядной переменной «i».
Сделать это можно так:
i = TMR0L; // загружаем значение младшего байта (при этом с таймера загружается регистр TMR0H) i += TMR0H << 8; // сдвигается на 8 бит и загружается старший байт
Преобразование типов. Обратите внимание, если вам необходимо будет производить загрузку в переменную i-длиной 24 бита, то при загрузке будет ошибка. Для правильной загрузки создайте временную переменную в 16 бит, а потом её перегрузите в 24 битную.
temp=TMR1L;
temp+=TMR1H<<8;
i =temp;
Формат данных
Целые типы данных
XC8 MPLAB компилятор поддерживает целые типы данных с 1, 2, 3 и 4 байта размеров, а также один тип бита. В таблице приведены типы данных и их соответствующий размер и арифметический тип. Тип по умолчанию для каждого типа указывается.
| Тип | Размер (в битах) | Арифметический тип | Диапазон |
| bit | 1 | Целое без знака | 8 (от 1 до 8 бит занимает в памяти 1 байт) |
| signed char | 8 | Целое со знаком | -127 +127 |
| unsigned char | 8 | Целое без знака | 0-255 |
| signed short | 16 | Целое со знаком | -32 767 + 32 767 |
| unsigned short | 16 | Целое без знака | 0-65 535 |
| signed int | 16 | Целое со знаком | -32 767 + 32 767 |
| unsigned int | 16 | Целое без знака | 0-65 535 |
| signed short long | 24 | Целое со знаком | -8 388 607 + 8388607 |
| unsigned short long | 24 | Целое без знака | 16 777 215 |
| signed long | 32 | Целое со знаком | -2 147 483 647 +2 147 483 647 |
| unsigned long | 32 | Целое без знака | 0-4 294 967 295 |
| signed long long | 32 | Целое со знаком | -2 147 483 647 +2 147 483 647 |
| unsigned long long | 32 | Целое без знака | 0-4 294 967 295 |
int data = 0x54;
bit bitvar;
bitvar = data;
//------------------------------------
int func(void) {
static bit flame_on;
// ...
}
Числа с плавающей запятой
| Type | Size (bits) | Arithmetic Type |
| float | 24 or 32 | Real |
| double | 24 or 32 | Real |
| long double | same as double | Real |
| Format | Number | Biased exponent | 1.mantissa | Decimal |
| 32-bit | 7DA6B69Bh | 11111011b | 1.0100110101101101 0011011b |
2.77000e+37 |
| (251) | (1.302447676659) | |||
| 24-bit | 42123Ah | 10000100b | 1.001001000111010b | 36.557 |
| (132) | (1.142395019531) |
Диапазон значений чисел с плавающей точкой
| Symbol | Meaning | 24-bit Value | 32-bit Value |
| XXX_RADIX | Radix of exponent representation | 2 | 2 |
| XXX_ROUNDS | Rounding mode for addition | 0 | 0 |
| XXX_MIN_EXP | Min. n such that FLT_RADIXn-1 is a normalized float value |
-125 | -125 |
| XXX_MIN_10_EXP | Min. n such that 10n is anormalized float value | -37 | -37 |
| XXX_MAX_EXP | Max. n such that FLT_RADIXn-1 is a normalized float value |
128 | 128 |
| XXX_MAX_10_EXP | Max. n such that 10n is a normalized float value |
38 | 38 |
| XXX_MANT_DIG | Number of FLT_RADIX mantissadigits | 16 | 24 |
| XXX_EPSILON | The smallest number which added to 1.0 does not yield 1.0 |
3.05176e-05 | 1.19209e-07 |
volatile float myFloat; myFloat = 95002.0; if(myFloat == 95001.0) // value will be rounded PORTA++; // this line will be executed!
Формат ввода чисел (литералов)
| Литерал | Формат | Пример цветом признак формата |
| Двоичный | 0b<число> или 0B<число> | 0b10011001 |
| Восьмеричный | 0<число> | 0345 |
| Десятичный | <число> | 129 |
| Шестнадцатеричный | 0x<число> или 0X<число> | 0x2F |