Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как побитно послать число на порт МК?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
renni
Такой вопрос.
Есть комманда (16 битная) которую нужно отправлять на один вывод порта. Я реализовал это следующим образом, но мне не нравится. Может кто то делал это иначе и более компактно.

void tx_data(char command)
{
unsigned int i=0, a = 0x01H;
for (i=0; i<15;i++)
{
P1_1= command&(a>>i);
}
}

Если не сложно предложите более рациональный вариант.
Спасибо.
rezident
Не будет работать ваша программа правильно smile.gif
Во-первых, если команда 16-и битная, то почему вы передаете в программу char? У вас тип char как 16-и битный определен?
Во-вторых, зачем вы сдвигаете маску на i бит в каждом цикле? Сдвигать нужно только на один бит за каждый проход цикла.
В-третьих, что такое P1_1? Битовая переменная или адрес порта? Если адрес порта, то у вас будет вывод на всем пинам этого порта, а не в один требуемый.
В-четвертых, а после вывода каждого бита разве не нужно временной интервал выдерживать? "Молотите" с максимальной частотой?
В общем вот вариант. Макросы SET_BITCMD, RESET_BITCMD, CMD_DELAY сами определите. Ну и функцию задержки delay тоже.

Код
#define SET_BITCMD
#define RESET_BITCMD
#define CMD_DELAY

void tx_data(unsigned int command)
{ unsigned int i, mask = 0x01;
  for (i=0; i<16; i++)
  {  if  ((command&mask)==0) RESET_BITCMD;
     else SET_BITCMD;
     mask<<=1;
    delay(CMD_DELAY);
  }
}
renni
В кратце использую Кеил и МК АТ89С2051. Данные отпраляю на один пин порта.
В приведенном выше "коде" опустил всю оставшуюся часть чтобы передать исключительно суть.
Пост писал на работе по памяти по этому не соблюдал "хороший тон", за что прошу прощения.
P1_1 это адрес пина порта.
При написании кода стараюсь его максимально минимизировать.(Очень редко находится время для написания и когда написанно коротко легко вспомнить и понять что делал).
Написанное мною (при исправлении некоторых моментов) работает правильно.
Меня интересует есть ли другой более короткий вариант написания онного.

Благодарю за замечания.
Сергей Борщ
Код
#include   <stdint.h>
void tx_data(uint8_t command)
{
     uint_fast8_t i;
      for (i = 0; i < sizeof(command) * __CHAR_BITS__; i++)
     {
       P1_1 = command & (1 << 0);
       command >>= 1;
     }
}
Aesthete Animus
Лично я делаю так:

Код
/******************************************************
*   Преобразует в строку length младших битов         *
*   слова word. Строка dest должна иметь размер       *
*   по меньшей мере length + 1                        *
******************************************************/
char* bitwise(uint32_t word, char* dest, uint8_t length)
{
    register uint8_t i;
    for (i = 0; i < length; i++)
        dest[length - i - 1] = word & (1UL << i) ? '1' : '0';          
    dest[length] = '\0';
    return dest;
}


Потом уже полученную строку пишу в терминал с необходимыми пояснениниями:
Код
char s[17];
uint16_t word = 0xAB;

printf_P(PSTR("Bitwise output of word: %s\n"), bitwise(word, s, 16));
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.