как реализовать меню в Термодатчике

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

как реализовать меню в Термодатчике

Сообщение Nixon83 »

Доброго времени суток! Я начинающий в програмировании.У меня к Вам вопросик. Хочу сделать термодатчик на Atmega8, семисегментник и 3 кнопки "+", "-", "set". в проге "+" и "-" работают хочу реализовать в ход в меню кнопкой set установка верхнего и нижнего порога и при ее же нажатии выход с установки на считывание температуры. Подскажите как реализоать такое меню.
Заранее спасибо!
Пишу на C
Реклама
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Re: как реализовать меню в Термодатчике

Сообщение Arlleex »

Ищите по запросу "Конечный автомат".
На "электроника для всех" есть.
Не умеешь - не берись, но не взявшись не научишься...
Реклама
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: как реализовать меню в Термодатчике

Сообщение Nixon83 »

Спасибо посмотрю!
Аватара пользователя
s_black
Мучитель микросхем
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория
Контактная информация:

Re: как реализовать меню в Термодатчике

Сообщение s_black »

Nixon83 писал(а):Доброго времени суток! Я начинающий в програмировании.У меня к Вам вопросик. Хочу сделать термодатчик на Atmega8, семисегментник и 3 кнопки "+", "-", "set". в проге "+" и "-" работают хочу реализовать в ход в меню кнопкой set установка верхнего и нижнего порога и при ее же нажатии выход с установки на считывание температуры. Подскажите как реализоать такое меню.
Заранее спасибо!
Пишу на C
Вот один из вариантов http://www.embed.com.ua/raznoe/upravlen ... revatelem/
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: как реализовать меню в Термодатчике

Сообщение zhu4er »

Nixon83 писал(а):Доброго времени суток! Я начинающий в програмировании.У меня к Вам вопросик. Хочу сделать термодатчик на Atmega8, семисегментник и 3 кнопки "+", "-", "set". в проге "+" и "-" работают хочу реализовать в ход в меню кнопкой set установка верхнего и нижнего порога и при ее же нажатии выход с установки на считывание температуры. Подскажите как реализоать такое меню.
Заранее спасибо!
Пишу на C
Вот тут глянь: http://mklab.net.ua/razrab004.html код только доработать надо!
Даже у стен есть уши...
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как реализовать меню в Термодатчике

Сообщение urry »

вот как-то так я попробовал решить Вашу задачу...
Под руками был открытый проект с хайтеком, то я на нем.
Для меги чуть отличается, но не особо - си, он и в африке си, только черный...
Проект прилагаю - на 877 пике. Комментов много, думаю, разберетесь.

Код: Выделить всё

#define  kSet  RB7
#define  kPlus RB6
#define  kMinus RB5
static char cFree;// переменная, используемая для выхода
//
static char cLow; // переменные, значения которых меняем в меню
static char cHi;
//
#define  FREEMAX 3 // количество щелчков на сет для выхода из меню
// прототипы функций, используемых в меню
void Inc(void);
void Dec(void);
void Free(void);
//---------------------------------------
//       структура меню
typedef struct menu // ярлык структуры 
{
	const  char  *txt; // текст текущего положения меню
	struct menu	*Set;// указатель на структуру меню при нажатии кнопки сет
	struct menu	*Inc;// указатель на структуру меню при нажатии кнопки увеличить 
	struct menu	*Dec;//// указатель на структуру меню при нажатии кнопки уменьшить
	void (*Func)(void); // функция, которая выполняется в текущем положении меню
}menu;// определение структуры как  типа 

 /*--------------------------------------------------------------------------------------------
№ стр      !  текст        	   !     кнопка сет ! кнопка увеличить ! кнопка уменьшить ! функция
-----------------------------------------------------------------------------------------------
0          Set Low Temp                 &Menu[3]       &Menu[1]              &Menu[2]     Free
1          Increment Low Temp           &Menu[3]       &Menu[1]              &Menu[2]     Inc
2          Decrement Low Temp           &Menu[3]       &Menu[1]              &Menu[2]     Dec
3          Set Hi Temp                  &Menu[0]       &Menu[4]              &Menu[5]     Free
4          Increment Hi Temp            &Menu[3]       &Menu[4]              &Menu[5]     Inc
5          Decrement Hi Temp            &Menu[3]       &Menu[4]              &Menu[5]     Dec
-----------------------------------------------------------------------------------------------*/
// переносим в полный массив структур 
	menu Menu[6]={\
{" Set Low Temp",&Menu[3],&Menu[1],&Menu[2],Free},
{" Inc Low Temp",&Menu[3],&Menu[1],&Menu[2],Inc},
{" Dec Low Temp",&Menu[3],&Menu[1],&Menu[2],Dec},
{" Set Hi Temp",&Menu[0],&Menu[4],&Menu[5],Free},
{" Inc Hi Temp",&Menu[3],&Menu[4],&Menu[5],Inc},
{" Dec Hi Temp",&Menu[3],&Menu[4],&Menu[5],Dec}};	

struct menu   *pMenu = 0; //  Указатель на активное меню						  	
void fnTextOut(menu   *pMenu);// функция вывода текста на экран

void main()
{
	lcd_init();
	lcd_puts("-----Work-----");	
	cFree=0;
	// прочитать из  еепром  значения сHi cLow
	cLow=20;
	cHi=40;
	// 
	for(;;)                               // Главный цикл
	{
		//--------------------------------------------------
		if(!kSet) // Кнопка "сет"
		{
			// Вход в меню
			if (pMenu == 0)
			{
				pMenu=&Menu[0];
			}
			// мы уже в меню
			else 
			{
				if(pMenu->Set != 0)
				{
					pMenu=pMenu->Set;
				}	    	   
			}
			fnTextOut(pMenu);// выводим надпись
			pMenu->Func();// выполняем функцию активного меню
			//--------------------------------------------------
			while(!kSet);// ждем отпускания кнопки   	  
		}
		//--------------------------------------------
		if(!kPlus) // Кнопка "Plus"
		{
			if(pMenu != 0)
			{	
				pMenu=pMenu->Inc;
				fnTextOut(pMenu);// выводим надпись
				pMenu->Func();// выполняем функцию активного меню
				//--------------------------------------------------
				while(!kPlus);// ждем отпускания кнопки
			}
		}
		//-----------------------------------------
		if(!kMinus) // Кнопка "Minus"
		{
			if(pMenu != 0)
			{
				pMenu=pMenu->Dec;
				fnTextOut(pMenu);// выводим надпись
				pMenu->Func();// выполняем функцию активного меню
				//--------------------------------------------------
				while(!kMinus);// ждем отпускания кнопки
			}
		}	 	
		DelayMs(80);

	}// конец фор
}// конец мейн	  
//-------------------------------------------------------------------


void Inc(void)
{
	if(pMenu == &Menu[1])
	{
		cLow++;
		fnCharToStr(cLow);		
	}
	if(pMenu == &Menu[4])
	{
		cHi++;
		fnCharToStr(cHi);	
	}
	lcd_goto(0x44);	
	lcd_putsram( str);
}
//-------------------------	
void Dec(void)
{
	if(pMenu == &Menu[2])
	{
		cLow--;
		fnCharToStr(cLow);		
	}
	if(pMenu == &Menu[5])
	{
		cHi--;
		fnCharToStr(cHi);	
	}
	lcd_goto(0x44);	
	lcd_putsram( str);		
}	
//-----------------------------
void Free(void)
{
	cFree++;
	if(	cFree == FREEMAX)
	{
		// записать в еепром новые значения сHi cLow
		cFree=0;
		pMenu=0;
		lcd_clear();
		lcd_goto(0);	
		lcd_puts("-----Work-----");	
	}	
}
//---------------------------------------
void fnTextOut(menu   *pMenu)
{
	lcd_clear();
	lcd_goto(0);	
	lcd_puts(pMenu->txt);

	if(	pMenu == &Menu[0])
	{
		fnCharToStr(cLow);	
		lcd_goto(0x44);	
		lcd_putsram( str);	
	}
	if(	pMenu == &Menu[3])
	{
		fnCharToStr(cHi);	
		lcd_goto(0x44);	
		lcd_putsram( str);	
	}		
}
//---------------------------------------	
void fnCharToStr(unsigned char c)
{
	unsigned char i,atemp;//
	unsigned char val,temp;//
	val=c;//
	for (i=0; i<digit; i++)//
	{
		temp=step[i];
		atemp=0;//
		while(val >= temp)//  
		{
			atemp++;//
			val-=temp;//
		}
		str[i]=atemp+0x30; 
	}
	str[digit]=0;// формируем завершающий нуль  
}
//------------------------------------------
Вложения
lcd_test.zip
(82.06 КБ) 166 скачиваний
Реклама
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: как реализовать меню в Термодатчике

Сообщение Nixon83 »

Спасибо огромное всем, что откликнулись! Буду разбираться.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»