Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
viael
Чето я туплю млин...
Какой префикс в кейле для записи двоичных чисел, а в хелпе не нахожу blink.gif
zltigo
Цитата(viael @ Aug 18 2006, 00:26) *
Какой префикс

В "C" не предусмотрено использование двоичных форматов, что в принципе правильно, поскольку достаточно тяжело для глаз. Для наглядности удобнее, например, дефинировать BIT0....BIT63
и писать в стиле BIT1|BIT7|BIT12.
viael
Цитата(zltigo @ Aug 18 2006, 02:14) *
Цитата(viael @ Aug 18 2006, 00:26) *

Какой префикс

В "C" не предусмотрено использование двоичных форматов, что в принципе правильно, поскольку достаточно тяжело для глаз. Для наглядности удобнее, например, дефинировать BIT0....BIT63
и писать в стиле BIT1|BIT7|BIT12.

О... glare.gif
Привык что в CVAVR a=0b11011111;
zltigo
Цитата(viael @ Aug 18 2006, 01:43) *
Привык что в CVAVR a=0b11011111;

Ну так и выдерите из *.h дефиниции (не думаю, что там компилятор такое понимает)
или напишите сами
#define 0b00000000 0
#define 0b00000001 1
.....
#define 0b11111111 255

Но лучше не надо глаза ломать... Особенно для 32 бит
0b00001000000001000000000001000000
Про 64 вообще молчу :-)
viael
Цитата(zltigo @ Aug 18 2006, 03:27) *
Цитата(viael @ Aug 18 2006, 01:43) *

Привык что в CVAVR a=0b11011111;

Ну так и выдерите из *.h дефиниции (не думаю, что там компилятор такое понимает)
или напишите сами
#define 0b00000000 0
#define 0b00000001 1
.....
#define 0b11111111 255

Но лучше не надо глаза ломать... Особенно для 32 бит
0b00001000000001000000000001000000
Про 64 вообще молчу :-)

Надо только для 8 бит.Очень удобно кодировать таблицу для семисегментных индикаторов. a14.gif
rezident
Цитата(viael @ Aug 18 2006, 09:48) *
Надо только для 8 бит.Очень удобно кодировать таблицу для семисегментных индикаторов. a14.gif


Обозначьте сегменты дефайнами
Код
#ifndef _I_SEG7_DEF_
  #define SEG7_A              0x01  //разряд соответствующий сегменту A
  #define SEG7_B              0x02  //разряд соответствующий сегменту B
  #define SEG7_C              0x04  //разряд соответствующий сегменту C
  #define SEG7_D              0x08  //разряд соответствующий сегменту D
  #define SEG7_E              0x10  //разряд соответствующий сегменту E
  #define SEG7_F              0x20  //разряд соответствующий сегменту F
  #define SEG7_G              0x40  //разряд соответствующий сегменту G
  #define SEG7_H              0x80  //разряд соответствующий сегменту H
  #define _I_SEG7_DEF_    1
#endif _I_SEG7_DEF_

и пишите строки вида

Код
const unsigned char seg7TabNum[]=
{
    SEG7_A+SEG7_B+SEG7_C+SEG7_D+SEG7_E+SEG7_F,    // 0
    SEG7_B+SEG7_C,                                // 1
    SEG7_A+SEG7_B+SEG7_G+SEG7_E+SEG7_D,           // 2
    SEG7_A+SEG7_B+SEG7_C+SEG7_D+SEG7_G,           // 3
    SEG7_F+SEG7_G+SEG7_B+SEG7_C,                  // 4
    SEG7_A+SEG7_F+SEG7_G+SEG7_C+SEG7_D,           // 5
    SEG7_A+SEG7_F+SEG7_E+SEG7_D+SEG7_C+SEG7_G,    // 6
    SEG7_A+SEG7_B+SEG7_C,                         // 7
    SEG7_A+SEG7_B+SEG7_C+SEG7_D+SEG7_E+SEG7_F+SEG7_G, // 8
    SEG7_A+SEG7_B+SEG7_C+SEG7_D+SEG7_F+SEG7_G    // 9
};

По-моему так гораздо понятнее и удобнее. Даже если индикатор перевернете вверх ногами, то достаточно будет поменять дефайны соответствия сегментов и пинов управления ими и не трогать таблицу.
VAI
Автор, по моему, Аскольд Волков. Я немного дополнил до 16 бит, желающие могут дополнить и до 32-х :-)
Код
#define _bitset(bits)\
  ((unsigned int)(\
  (bits%010)|\
  (bits/010%010)<<1|\
  (bits/0100%010)<<2|\
  (bits/01000%010)<<3|\
  (bits/010000%010)<<4|\
  (bits/0100000%010)<<5|\
  (bits/01000000%010)<<6|\
  (bits/010000000%010)<<7|\
  (bits/0100000000%010)<<8|\
  (bits/01000000000%010)<<9|\
  (bits/010000000000%010)<<10|\
  (bits/0100000000000%010)<<11|\
  (bits/01000000000000%010)<<12|\
  (bits/010000000000000%010)<<13|\
  (bits/0100000000000000%010)<<14|\
  (bits/01000000000000000%010)<<15))
#define BINARY( bits ) _bitset(0##bits)

// использование
  P3DIR |= BINARY( 00001111 );
  а =   BINARY( 1010101000001111 );
Halfback
VAI
Keil пишет ошибку деления на нуль sad.gif
VAI
У меня для MSP, для ARM (в кейле), для Винды применяются эти макросы. проблем нет.
Приведите текст, где у Вас дает ошибку.
scifi
Цитата(Halfback @ Apr 3 2007, 22:59) *
VAI
Keil пишет ошибку деления на нуль sad.gif


Переполнение не возникает? В Кейле размер инта какой? Попробуйте подправить макросы: вместо 010...0 везде сделать 010...0UL.
kolobok0
Цитата(viael @ Aug 17 2006, 22:26) *
Чето я туплю млин...
Какой префикс в кейле для записи двоичных чисел, а в хелпе не нахожу blink.gif


для азма - как всегда..
на хвостике h - шестнадцатиричное значение...
на хвостике b - двоичное...


(круглый)
SiMM
Цитата(Halfback @ Apr 4 2007, 01:59) *
VAI
Keil пишет ошибку деления на нуль sad.gif
Если заменить операции деления и взятия модуля числа на более подходящие, получим макрос, работающий при любых условиях:
Код
#define BINARY(bits)\
  ((unsigned int)(\
  (0##bits&7)|\
  ((0##bits>>3)&7)<<1|\
  ((0##bits>>6)&7)<<2|\
  ((0##bits>>9)&7)<<3|\
  ((0##bits>>12)&7)<<4|\
  ((0##bits>>15)&7)<<5|\
  ((0##bits>>18)&7)<<6|\
  ((0##bits>>21)&7)<<7|\
  ((0##bits>>24)&7)<<8|\
  ((0##bits>>27)&7)<<9|\
  ((0##bits>>30)&7)<<10|\
  ((0##bits>>33)&7)<<11|\
  ((0##bits>>36)&7)<<12|\
  ((0##bits>>39)&7)<<13|\
  ((0##bits>>42)&7)<<14|\
  ((0##bits>>45)&7)<<15))
MiklPolikov
Раньше мой Programmers Notepad понимал запись
PORTB=0b00000001;
А теперь почему-то не понимает. Старые программы перестали компилироватся.

Так как записывать цифры по битам ?

Пробовал PN 2.0.5.18 , PN 2.0.6.1


Заранее благодарю.
С уважением, Михаил.
=AVR=
Предлагаю выдать человеку Шнобелевскую премию за компиляцию посредством PN smile.gif
rezident
В стандарте Си нет записи бинарных чисел. Эта видимо была особенность вашего конкретного компилятора, которую ликвидировали для лучшего соответствия его стандарту ANSI C.
=L.A.=
Цитата(MiklPolikov @ Oct 31 2007, 20:59) *
Раньше мой Programmers Notepad понимал запись
PORTB=0b00000001;
А теперь почему-то не понимает. Старые программы перестали компилироватся.
Так как записывать цифры по битам ?



можно написать header с содержанием типа

#define _0b_00000000 (0x00)
.................
#define _0b_00000011 (0x03)
.................
.................
#define _0b_11111111 (0xff)

и включить в проект.
MiklPolikov
Огромное спасибо =L.A.= !!! biggrin.gif
alexander55
Цитата(=L.A.= @ Oct 31 2007, 23:09) *
можно написать header с содержанием типа

#define _0b_00000000 (0x00)
.................
#define _0b_00000011 (0x03)
.................
.................
#define _0b_11111111 (0xff)

и включить в проект.

Ещее 255 ведер и ключик в наших руках (Золотой ключик). biggrin.gif
bzx
Цитата(MiklPolikov @ Oct 31 2007, 19:59) *
Пробовал PN 2.0.5.18 , PN 2.0.6.1

07.gif Что сие значит?
Цитата(MiklPolikov @ Oct 31 2007, 19:59) *
Так как записывать цифры по битам ?
Либо макросы написать наподобии этих:
Код
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
#define bitswitch(var,bitno) ((var) ^= (1 << (bitno)))
#define bittest(var,bitno) ((var) & (1 << (bitno)))

Либо через сдвиг препроцессора:
Код
#define    scl    9
#define    sda    0
#define    led    31
#define    bit2    2
#define    bit1    1
#define    bit7    7
....
DWORD x,y;
x |= (1<<scl)|(1<<sda)|(1<<led); // Выставление бит
y &= ~((1<<bit1)|(1<<bit7)|(1<<bit2)); // Сброс бит
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.