Перейти к содержанию

Управление Семисегментным Индикаторм С Помощью Мк


Рекомендуемые сообщения

Мне вот интересно что за "конструкция"... const i = ((PINB & (1<<PINB1))==0)<<i;

Она типа записывает в переменную i состояние порта B1(может глупо но по ходу это так)

Изменено пользователем roninen
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 92
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Мдя.. Нет слов... От Вас только слышно - "походу", "типа того" и т.д...

Вы тупо делаете методом тыка. Дай попробую так, потом так... Не получается - на форум...

Почитайте какю-нибудь книжку по Си. Вы пишете какую-то фигню, и откуда Вы её берёте - хз.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

#define Bit(n) (1 << (n))

unsigned char key_code;
#define COUNT_ON_KEY 20
void KeyInput()
{
 static unsigned char tmp_key_count = 0;
 static unsigned char tmp_key_code = 0;

	if((PinB & Bit(PinB1))==0)
  {
	tmp_key_code = 1;
	tmp_key_count++;
  }
  else
       {
       	tmp_key_code = 0;
 		tmp_key_count = 0;
       }

 if((PinB & Bit(PinB2))==0)
  {
	tmp_key_code = 2;
	tmp_key_count++;
  }
  else
       {
       	tmp_key_code = 0;
 		tmp_key_count = 0;
       }

  if(tmp_key_count > COUNT_ON_KEY)
  	{
  		key_code = tmp_key_code;
		tmp_key_code = 0;
 		tmp_key_count = 0; 
  	}	
}

Вот самый простой способ работать с клавишами.

key_code - глобальная переменная где будем хранить какая кнопка нажата

0 - не нажато

1 - первая кнопка

2 - вторая кнопка

KeyInput() - функция которую надо постоянно вызывать, например по таймеру раз сто в секунду.

теперь в основном цикле пишем

void main()
{
switch(key_code)
{
 case 1:{ увеличиваем значение;key_code = 0; break;} 
 case 2:{ уменьшаем значение; key_code = 0;break;}
}
}

Вопросы?

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Тогда для чего создали раздел для начинающих А???Модератор???
Ну точно не для того, чтобы каждую строчку сюда выкладывать и спрашиывать почему она не работает. А не работает потому, что Вы пишете херню. И откуда она к Вам в голову залезла не понятно
Ссылка на комментарий
Поделиться на другие сайты

#define MAX_VALUE_VIRTUAL_TIMER 1000
unsigned int virtual_timer;
void main()
{
virtual_timer = 0;
do
{
switch(key_code)
{
 case 1:{ увеличиваем значение;key_code = 0; break;} 
 case 2:{ уменьшаем значение; key_code = 0;break;}
}

virtual_timer++;
if(virtual_timer >= MAX_VALUE_VIRTUAL_TIMER)
{
  KeyInput();
  virtual_timer = 0;
}

}while(1)
}

А вот реализация главного цикла без таймера.

MAX_VALUE_VIRTUAL_TIMER - значение выбирается исходя из тактовой частоты МК и времени выполнения главного цикла

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Конкретно пишите, что пишет компилятор, у меня в голове такая каша с разными подмножествами языка Си, что могу подсказать только увидев сообщение об ошибки:rolleyes:

>> if((PinB & Bit(PinB1))==0)

if((PINB & Bit(PINB1))==0)

может так

P.S.

так же не забываем, что этот if рассчитан, что кнопка реализована так: при нажатии она замыкает порт на землю, а когда не нажата на порте присутствует лог. 1 (подключены либо внутренние либо внешние резисторы на питание)

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Про порты написал выше редактируя своё сообщение.

теперь по остальному

unsigned char key_code;
#define COUNT_ON_KEY 20
void KeyInput()
{
 static unsigned char tmp_key_count = 0;
 static unsigned char tmp_key_code = 0;

       if((PINB & Bit(PINB1))==0)
  {
               tmp_key_code = 1;
               tmp_key_count++;
  }
  else
       {
               tmp_key_code = 0;
               tmp_key_count = 0;
       }

 if((PINB & Bit(PINB2))==0)
  {
               tmp_key_code = 2;
               tmp_key_count++;
  }
  else
       {
               tmp_key_code = 0;
               tmp_key_count = 0;
       }

  if(tmp_key_count > COUNT_ON_KEY)
       {
               key_code = tmp_key_code;
               tmp_key_code = 0;
               tmp_key_count = 0; 
       }   	
}
unsigned char mydata[] = {0x00,0x10,0x08,0x18,0x04,0x14,0x0C,0x1C,0x02,0x12};
#define MAX_VALUE_VIRTUAL_TIMER 1000
unsigned int virtual_timer;
unsigned char value_current_led;
int main()
{
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0xff;

value_current_led = 0;
virtual_timer = 0;
do
{
switch(key_code)
{
 case 1:{  value_current_led++;key_code = 0; break;} 
 case 2:{ value_current_led--; key_code = 0;break;}
}

PORTC = mydata[ value_current_led];
virtual_timer++;
if(virtual_timer >= MAX_VALUE_VIRTUAL_TIMER)
{
  KeyInput();
  virtual_timer = 0;
}

}while(1)
}

и что я сегодня добрый такой :D

P.S. нет у меня на домашнем компе ни одной среды разработки, а в блокноте писать не гуд :D так что без подсветки синтаксиса мог еще чего не заметить, пишете что теперь говорит компилятор

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Вот рабочий код. Верней компилироваться должен:rolleyes:

#include <avr/io.h>

#define Bit(n) (1 << (n))

unsigned char key_code;
#define COUNT_ON_KEY 20
void KeyInput()
{
 static unsigned char tmp_key_count = 0;
 static unsigned char tmp_key_code = 0;

   	if((PINB & Bit(PINB1))==0)
  {
           	tmp_key_code = 1;
           	tmp_key_count++;
  }
  else
   	{
           	tmp_key_code = 0;
           	tmp_key_count = 0;
   	}

 if((PINB & Bit(PINB2))==0)
  {
           	tmp_key_code = 2;
           	tmp_key_count++;
  }
  else
   	{
           	tmp_key_code = 0;
           	tmp_key_count = 0;
   	}

  if(tmp_key_count > COUNT_ON_KEY)
   	{
           	key_code = tmp_key_code;
           	tmp_key_code = 0;
           	tmp_key_count = 0; 
   	}   	
}

unsigned char mydata[] = {0x00,0x10,0x08,0x18,0x04,0x14,0x0C,0x1C,0x02,0x12};

#define MAX_VALUE_VIRTUAL_TIMER 1000
unsigned int virtual_timer;
unsigned char value_current_led;
int main()
{
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0xff;

value_current_led = 0;
virtual_timer = 0;
do
{
switch(key_code)
{
 case 1:{  value_current_led++;key_code = 0; break;} 
 case 2:{ value_current_led--; key_code = 0;break;}
}

PORTC = mydata[ value_current_led];
virtual_timer++;
if(virtual_timer >= MAX_VALUE_VIRTUAL_TIMER)
{
  KeyInput();
  virtual_timer = 0;
}

}while(1);
}

#include <avr/io.h>

#define Bit(n) (1 << (n))

#define COUNT_ON_KEY 20
#define MAX_VALUE_VIRTUAL_TIMER 1000

unsigned char mydata[] = {0x00,0x10,0x08,0x18,0x04,0x14,0x0C,0x1C,0x02,0x12};
unsigned int virtual_timer;
unsigned char value_current_led;
unsigned char key_code;

void KeyInput()
{
 static unsigned char tmp_key_count = 0;
 static unsigned char tmp_key_code = 0;

 if((PINB & Bit(PINB1))==0)
  {
           	tmp_key_code = 1;
           	tmp_key_count++;
  }
  else
   	{
           	tmp_key_code = 0;
           	tmp_key_count = 0;
   	}

 if((PINB & Bit(PINB2))==0)
  {
           	tmp_key_code = 2;
           	tmp_key_count++;
  }
  else
   	{
           	tmp_key_code = 0;
           	tmp_key_count = 0;
   	}

  if(tmp_key_count > COUNT_ON_KEY)
   	{
           	key_code = tmp_key_code;
           	tmp_key_code = 0;
           	tmp_key_count = 0; 
   	}   	
}

void IncrementValueLed()
{
if (value_current_led <= 9)
 {
	value_current_led++;
key_code = 0;
 }
}

void DecrementumValueLed()
{
if(value_current_led >= 0)
 {
  value_current_led--;
  key_code = 0;
 }
}


int main()
{
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0xff;

value_current_led = 0;
virtual_timer = 0;
do
{
switch(key_code)
{
 case 1:{ IncrementValueLed() ; break;} 
 case 2:{ DecrementumValueLed();break;}
}

PORTC = mydata[ value_current_led];
virtual_timer++;
if(virtual_timer >= MAX_VALUE_VIRTUAL_TIMER)
{
  KeyInput();
  virtual_timer = 0;
}

}while(1);
}

Вот крайнея версия, чуть более преблеженная к реальности

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

У меня нет протеуса.

И к сожалению я уезжаю в крайнею командировку в этом году, так что дальше без меня.

читаем мои комментарии по

#define COUNT_ON_KEY 20

#define MAX_VALUE_VIRTUAL_TIMER 1000 значение взял с потолка

и по

if((PINB & Bit(PINB1))==0) не видел вашей схемы

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

У Вас сейчас в коде не определен точный тип МК, посмотрите как его определить.

Кнопки должны замыкать на землю.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

таймер ... а где же целесообразность? Опрос кнопки это неприоритетная задача, незачем на нее тратить такой ценный ресурс как таймер. Он может пригодится для динамической индикации и других целей.

Кстати, раз упомянули сразу про таймер, индикацию и кнопки, вопрос.

Если таймер работает для динамической индикации, а в этом же таймере после вывода индикации висит счетчик задержек для кнопок.

Суть вобщем такая, с каждым прерыванием таймера, переменная для задержки кнопки декрементируется, когда появляется "0", срабатывает действие кнопки.

Так вообще люди делают, или есть особые методы?

Изменено пользователем Spruce
Ссылка на комментарий
Поделиться на другие сайты

Откуда ж МЫ знаем почему она у тебя не работает? Лучше ответь самому себе подробно по каждому пункту почему схема должна работать. Все ли ты сделал как надо? установлена ли нужная конфигурация контроллера?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Как программно путём задержки портов устранить дребезг контактов на портах B1 и B2(а лучше приведите пример программы)???

Изменено пользователем roninen
Ссылка на комментарий
Поделиться на другие сайты

Считывай состояние порта не чаще чем один раз за 10-100мс и никакого дребезга не будет.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Что неправильно в моём программном коде???:

#include <avr/io.h>

unsigned char mydata[] = {0x00,0x10,0x08,0x18,0x04,0x14,0x0C,0x1C,0x02,0x12};
unsigned char key;
unsigned char led;

void main()
{
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0xff;

while(1)
{
KeyInput();

 if(key==1)
 {
  IncrementValueLed();
 }
 PORTC = mydata[led];
}
}

void KeyInput()
{
  unsigned char count = 0;
  unsigned char code = 0;

 if(!(PINB & (1<<PINB1)))
  {
               code = 1;
               count++;
  }
  else
       {
               code = 0;
               count = 0;
       }

   if(count == 1000000)
       {
               key = code;
               code = 0;
               count = 0; 
       }       
}

void IncrementValueLed()
{
 if (led < 10)
 {
       led++;
       key = 0;
 }
}

post-131485-0-10726900-1293463096_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

>>Что неправильно в моём программном коде???:

void KeyInput()

{

unsigned char count = 0;

unsigned char code = 0;

а я как этот кусок написал???

использовал модификатор "static" и в этом весь прикол

>>

if(count == 1000000)

ой ....

Вы точно что то читали по СИ? если да, то как эта строчка с этой "unsigned char code = 0"; пересекается?

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...