Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Vlad0o писал(а):Но если подставить вместо "LED1 = 1;" вывод на экран произвольного текста при нажатии, то ничего хорошего не получается....
Вы издеваетесь, или я вас не так понимаю? Вы хотите выводить текст, когда одна из 4 шин обмена данными с экраном у вас куда-то притянута нопкой???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

я именно так над собой и издевался. Благо быстро сообразил что так не получится.

Поэтому я в конце и написал что конкретно я хотел бы реализовать. А именно "сделать счетчик нажатий кнопки. Нажимаешь - 1, еще раз - 2 на экране единицу сменяет двойка...".
Если подробнее то: Кнопка нажимается и отпускается - на экране появляется единица, кнопка еще раз нажимается и отпускается - на экране появляется двойка, кнопка нажимается и отпускается - на экране - тройка.
Как то так. Сейчас сижу пытаюсь это сделать.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Vlad0o писал(а):Сейчас сижу пытаюсь это сделать.
Задумался над вашей схемой... это пипец. У вас каждая кнопка подключена к выводу МК, а вы делаете динамический опрос кнопок? :shock:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Вопросы по С/С++ (СИ)

Сообщение МитяРа »

Жаль схему с радикала посмотреть не могу, а то-бы как сказанул.. :))
Vlad0o писал(а):Как то так. Сейчас сижу пытаюсь это сделать.
Если просто потренироваться, то ищи свободный вывод МК, настраивай его на ввод, а потом два цикла:
1 - ждём нажатия кнопки,
2 - ждём отжатия кнопки,
а потом инкремент переменной и вывод её значения на экран...
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Реклама
Эиком - электронные компоненты и радиодетали
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

Такой принцип опроса кнопок древний очень и кажется называется "сдвиг регистра", видел в какой то старой книжке. (но я могу полностью ошибаться).
Реклама
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Вопросы по С/С++ (СИ)

Сообщение МитяРа »

Vlad0o писал(а):кажется называется "сдвиг регистра",
Не обижайся, но тут похоже не регистр сдвинулся, а у тя в голове каша образовалась..

Сам-же хотел сделать счётчик с выводом на экран... :roll:

P.S. Определись точно, что ты хочешь, а то мечешься из стороны в сторону...
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Реклама
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

Да я вот сейчас как раз и делаю счетчик, разгребая кашу)
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Вопросы по С/С++ (СИ)

Сообщение МитяРа »

Vlad0o писал(а):как раз и делаю счетчик,
А при чём тут "сдвиг регистра"?
Сдвиг, когда данные в последовательном виде вводятся/выводятся с/в одну линию порта..
А у тя надо ждать события нажатия/отжатия кнопки..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Vlad0o писал(а):Такой принцип опроса кнопок древний очень и кажется называется "сдвиг регистра", видел в какой то старой книжке. (но я могу полностью ошибаться).
При таком подключении кнопок
Изображение
Надо на время опроса кнопок настраивать Р3.0 на выход с лог "0", а Р3.1 ... Р3.4 настраивать на вход и считывать с них состояния ("0" — нажата, "1" — не нажата).
На время передачи данных — Р3.0 на вход (тогда нажатие одной кнопки не будет искажать данные ЖКИ), Р3.1 ... Р3.4 — на выход.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

8) Считать научил) Спасибо, всем :)) Я могу гарантировать, что это не последнее мое сообщение :))) потому что дальше я буду делать меню :lol:

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

while (1)
{

P3MDOUT = 0; //
P3 = 0xFF;
B1 = 0;
B2 = 1;
B3 = 0;
B4 = 0;

if (B0 == 1)
{Delay(10000);
Delay(5000);
}
if (B0 == 1)
{status = 1;}
else {status = 0;}
currentButton = status;
if (lastButton == 0 && currentButton == 1)
{LED2 = !LED2;
//LED1 = !LED1;
LED3 = !LED3;
LED4 = !LED4;

T = T+1;
itoa(T, sT); 

write_1(1, sT);}

lastButton = currentButton;
}
}
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение slavokhire5 »

Доброго времени суток:) я как всегда с дурацкими вопросами)

есть такой-себе цикл... в нем должны проверяться данные на совпадение с хранимыми в массиве. если не совпадает - выполнять пару действий и перезаписывать элемент массива. массивы объявлены глобально, volatile unsigned char, в них забиты начальные данные, которые 100% не могут совпадать с тем, что будет высчитывать процессор. Однако после полного прохода цикла они уже совпадают. Программа должна ускориться.
но что-то мне подсказывает, что проверка выполняется как-то не так. на выполнение этого куска кода при частоте 8МГц контроллер тратит около 8 мсек! кто может подсказать, где я накосячил? :)

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

	unsigned char adr = 0x80;
	char z = 0;
	unsigned long int div = 100000;
	unsigned char num = 0;
	
	while(z < 6)	
	{	
		dat = (km_full / div) % 10; 
		if (massiv[num] != dat) 
		{
			lcd_com(adr);					
			lcd_dat (dat + 0x30);			
			massiv[num] = dat;
		}
		div = div/10;
		adr++;
		num++;
		z++;
	}
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

канечно тратит - деление ресурсоемкая операция. Всего кода нет не могу предложить ничего простого.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Не, ну нормально ? Вы показываете кусок кода, в котором вызываются необъяснимые и никому непонятные функции и спрашиваете "где косяк ?".
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Вопросы по С/С++ (СИ)

Сообщение BerZerK-ku »

slavokhire5 писал(а): Однако после полного прохода цикла они уже совпадают. Программа должна ускориться.
но что-то мне подсказывает, что проверка выполняется как-то не так. на выполнение этого куска кода при частоте 8МГц контроллер тратит около 8 мсек! кто может подсказать, где я накосячил? :)
Прогнал в симуляторе вашу функцию .С отключенным выводом на экран (закоментировав lcd_com(adr); lcd_dat (dat + 0x30);) время выполнения функции составило порядка 1.4мс, соответственно 6.5мс у вас отнимает вывод на экран и вам надо убрать его в другое место.
Вот такой код, позволит сократить время рассчетов раза в 1.5:

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

static void vFunc1(void)
{
	uchar adr = 0x80 + 6 - 1;		// 6 - кол-во символов
   	ulong div = km_full;
	uchar dat;
   
	for(uchar i = 0; i < 6; i++, adr--)
	{
		if (km_full > 0)
		{
			dat = div % 10;
			div /= 10;
		}
		else
		{
			dat = 0;
		}
		
		if (massiv[5 - i] != dat)
		{
			massiv[5 - i] = dat;
			//lcd_com(adr);               
			//lcd_dat (massiv[5 - i] + '0');
		}
	}
}
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

Здравствуйте.
у меня возникло непонимание с конструкцией switch case.
куски кода:

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

void main (void)
{

while(1)
{
	if (button2() == 2)
		{JumpToCase2();} // если нажали кнопку 2 то переходит в case2
	if (button1() == 1)
   		{JumpToCase1();} // если 1 то в case1

switch(Su) //Su - глобальная переменная 
{   
   case 1: Case1();
   break;
   
   case 2: Case2(); 
   break; 
}

}

}

А это функции case() и jumptocase№()

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

void JumpToCase1(void)
{  Su = 1;	 } 

void JumpToCase2(void)
{ Su = 2; }

void Case1(void)
{
T=T-1;// к глобальной переменной, которая изначально равна 0, отнимается 1
if (T == 0) 
		{write_1(1, "0");} //эт чтоб ноль на экран выводить. почему без этого ноль не выводится.
		else
		{itoa(T, sT); 
		write_1(1, sT);} //вывод на экран
   if(button2() == 2) //если нажать кнопку то произойдет переход в касе2
   {JumpToCase2();}
}

void Case2(void)
{
T=T+1; // к глобальной переменной прибавляется 1
if (T == 0) 
		{write_1(1, "0");}
		else
		{itoa(T, sT); 
		write_1(1, sT);}
   if(button1() == 1) //если нажать кнопку то произойдет переход в касе1
   {JumpToCase1();} 
}
Надеюсь код не очень сильно запутанный.
Так вот я предполагал, что если я нажимаю к примеру кнопку 1, то на экране будет -1 и будет это число до тех пор пока я не нажму кнопку номер 2. а нажав кнопку 2 (после кнопки 1) на экране будет 0. еще нажимаю вторую кнопку и на экране жду уже 1.

На самом же деле получается так что вот эта конструкция case() зациклена в ожидании нажатия кнопки. получается бесконечный цикл. на экране цифры летят. нажимаю первую кнопку и идет ооочень быстрый отсчет в минус, нажимаю два - отсчет в плюс.

Так вот как сделать так чтоб в функции case() произошло, к примеру, Т=Т+1 (всего лишь один раз) и потом функция ожидал б нажатия кнопки.

Я предполагаю что это довольно таки просто, но пока я не понял как это сделать)


PS Это я хочу использовать switch case для меню. Так бы я сделал это с помощью if else.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Вопросы по С/С++ (СИ)

Сообщение BerZerK-ku »

В функции Case1 и Case2 добавьте Su = 0;
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

BerZerK-ku, спасибо за простое решение :)
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

А вообще зачем так анально ?)

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

void main (void)
{

while(1)
{
   if (button2() == 2)
      {Case2();} // если нажали кнопку 2 то переходит в case2
   if (button1() == 1)
       {Case1();} // если 1 то в case1

void Case1(void)
{
T=T-1;// к глобальной переменной, которая изначально равна 0, отнимается 1
if (T == 0) 
      {write_1(1, "0");} //эт чтоб ноль на экран выводить. почему без этого ноль не выводится.
      else
      {itoa(T, sT); 
      write_1(1, sT);} //вывод на экран
   if(button2() == 2) //если нажать кнопку то произойдет переход в касе2
   {Case2();}
}

void Case2(void)
{
T=T+1; // к глобальной переменной прибавляется 1
if (T == 0) 
      {write_1(1, "0");}
      else
      {itoa(T, sT); 
      write_1(1, sT);}
   if(button1() == 1) //если нажать кнопку то произойдет переход в касе1
   {Case1();} 
}
и еще зачем разные функции для опроса кнопок?

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

   if (button2() == 2)
      {JumpToCase2();} // если нажали кнопку 2 то переходит в case2
   if (button1() == 1)
         {JumpToCase1();} // если 1 то в case1
Nixie
Потрогал лапой паяльник
Сообщения: 337
Зарегистрирован: Пн май 04, 2009 17:45:33
Откуда: Киев

Re: Вопросы по С/С++ (СИ)

Сообщение Nixie »

Пишу менюшку для LCD на HD44780...В общем : котролеер--ATMega48 дисплей--смотри выше :) , имеется 3 кнопки для управления меню : "влево" ,"вправо" , "enter" Меню на 3 пункта , циклическое. Пункты менрю названы move, heat, mixing . При нажатии кнопки enter при выведеном на экран соотв. пункте меню зажигается доп. символ во в второй строке, типа выполняется действие сотв. этому пункту. При повторном нажатии в этом же пункте на enter действие прекращается , значек исчезает .
Все работает , пока в качестве действия просто зажигаются/гаснут светодиоды . А если нужно так: действие 1 пункта--светодиод мигает , переходим на 2-й пункт , светодиод продолжает мигать , включаем/выключаем другой СД. Вот с миганием как раз-то и не
получается :( СД мигает до тех пор пока находимся в соотв пункте меню , а после перехода в другой---перестает. Как правильнее сделать обработку, чтобы СД продолжал мигать при переходе в другие пункты ? Привожу полный текст кода, постарался все прокомментировать :)

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

#include <avr/io.h>//Стандартная библиотека ввода/вывода
#include <avr/interrupt.h>//Библиотека прерываний
#include "bits_macros.h"  //макросы для работи с битами , в кавычках т.к. нах. в папке 
                           //с проектом
unsigned char mode=0;//Переменная пункта меню
int enter=0;//Переменная нажатия кнопки Enter
 unsigned char ON0=1;  //Переменная вывода значка и действия для  пункта меню  1
unsigned char ON1=1;   //Переменная вывода значка и действия для  пункта меню  2
unsigned char ON2=1;   //Переменная вывода значка и действия для  пункта меню  3
int flag=0;//Флаг вывода на экран пункта меню
 
#define RS 2 //Вывод RS ЖКИ на вывод PD2 МК
#define E 3 //Вывод E ЖКИ на вывод PD3 МК
#define TIME 10//10 

//вращение мотора влево , для L293D
#define left()   SetBitVal(PORTB,1,1);\
                 SetBitVal(PORTB,2,0); 
//вращение мотора вправо , для L293D
#define right()  SetBitVal(PORTB,1,0);\
                 SetBitVal(PORTB,2,1); 
//остановка мотора, для L293D
#define stop()   SetBitVal(PORTB,1,0);\
                 SetBitVal(PORTB,2,0);
void lcd_init (void);//Инициализация ЖКИ
void lcd_dat (unsigned char lcd);//Программа записи данн
void lcd_com (unsigned char lcd);//Программа записи комманд в ЖКИ
void pause (unsigned int a);//Переменная для программы задержки(паузы)
void l_pause (unsigned int b); // длинная пауза
void MOVE (void);//Двигаем каретку
void HEAT (void); //Греем воду
void MIXING (void);//Перемешиваем воду
void l_r_move (void);//двигаемся туда-сюда
//Обработчик прерываний по таймеру 0, в нем опрашиваем кнопки
ISR(TIMER0_OVF_vect)
   {
   if ((PINC &(1<<PC0))==0)//Если низкий уровень на PC0 есть
   {
     pause(1000); //Ждем 0.01с
     pause(1000);
	
	 if ((PINC &(1<<PC0))==0)//Если низкий уровень на PC0 есть
   {
      while ((PINC &(1<<PC0))==0);//Ждем отжатия клавиши
      mode=(mode+1)%3;//Меняем переменнюу пункта меню в +1
	   flag=0;//Меняем флаг на 0
       
		}
        TCNT0=0x00;//Очищаем счетчик таймера 0
        TIFR0=0x00; //и флаг переполнения
        }
 
        else //Если на PC0 нет низкого уровня
 
        if ((PINC &(1<<PC1))==0)//проверяем низкий уровень на PC1
        {
         pause(1000); //Если есть Ждем 0.01 с
         pause(1000);
	
		if ((PINC &(1<<PC1))==0) //проверяем низкий уровень на PC1 еще раз
        {
         while ((PINC &(1<<PC1))==0); //Ждем отжатия клавиши
         
		 mode=(mode-1)%3;////Меняем переменнюу пункта меню в - 1?      	 
		 if (mode==255)//(0-1)%3=255, если этого условия не проверять, то при переходе
	     mode=mode-1;//из п3 в п1 (при следовании назад), нужно нажать кнопку 2 раза
		 flag=0;//Меняем флаг на 0         
		}
         TCNT0=0x00;//Очищаем счетчик таймера0
         TIFR0=0x00; //И флаг переполнения

           }
         else 
		 if ((PINC &(1<<PC2))==0)//Если низкий уровень на PC2 есть (кн. enter)
        { 
       pause(1000);
	   pause(1000);
	      
		   if ((PINC &(1<<PC2))==0)
		   {
		   while ((PINC &(1<<PC2))==0);//Ждем отжатия клавиши
           {enter=1 ;//enter нажат
		   
		  if (mode==0) //при каком пункте на экране нажат,то действие и вкл...
		     {ON0=!ON0;}//прекидываем флаг действия делать\не делать , триггер
		                 //для каждого пункта меню соотв.
		  if (mode==1)
		     {ON1=!ON1;}
          if (mode!=0 && mode!=1)//третий пункт меню
		     {ON2=!ON2;}   
		   }
		   }
		   
         TCNT0=0x00;//Очищаем счетчик таймера0
         TIFR0=0x00; //И флаг переполнения
		   }
        return;
        } 
    //Программа вывода строки на ЖКИ
     void lcd_string( char *s )
       { 
        while( *s ) //цикл пока указатель существует
         lcd_dat( *s++ ); //выводить строку
          }
        //Программа инициализации таймера 0
       void init_timer (void)
       {
       TIMSK0=(1<<TOIE0); //Разрешить прерывания по переполнению таймера 0
       TCCR0B=(0<<CS00)|(1<<CS01)|(0<<CS02); //Делитель =/64
        }
       //Программа обработки переменной меню
       void menu(void)
          {
        if (mode==0)//Если переменная меню=0
          {
        if (flag== 0)//Если флаг=0
          {
         // lcd_com(1);//Чистим экран ЖКИ 0x80
          lcd_com(0b10000100);//курсор на 04 позицию.......

          lcd_string("<MOVE>");//Выводим название первого пункта меню 1	   
		   lcd_dat(0b00100000) ;//затираем символ от <MIXING>
           lcd_com(0b10001011);//курсор на 0B позицию..
             lcd_dat(0b00100000) ;//затираем символ от <MIXING>

			
			flag=1;//Переключаем флаг=1           
          enter=0; //Переключаем enter=0,т.к еще не нажат enter при таком номере меню
          
		  MOVE();//идем ф-цию  действия  для этого пункта меню		     
         }
         } 
         else //иначе
        if (mode==1)//Если переменная меню=1
        {
        if (flag==0)//Если флаг=0
         {
     //  lcd_com(1);//Чистим экран
		  lcd_com(0b10000100);//курсор на 04 позицию.
         lcd_string("<HEAT>");//Выводим название первого пункта меню 2  
		   lcd_dat(0b00100000) ;//затираем символ от <MIXING>
           lcd_com(0b10001011);//курсор на 0B позицию..
            lcd_dat(0b00100000) ;//затираем символ от <MIXING>        
		 flag=1;//Переключаем флаг=1
		 enter=0; //Переключаем enter=0, т.к еще не нажат enter при таком номере меню
        HEAT();//идем ф-цию  действия  для этого пункта меню
		 }
         }
  
         else //В любом другом случаи
 
          {
             if (flag==0)//Если флаг=0
          {
         //    lcd_com(1);//Чистим экран ЖКИ
		   
             lcd_com(0b10000100);//курсор на 04 позицию.
           lcd_string("<MIXING>");//Выводим название первого пункта меню 3
           //lcd_dat(0b11110101);
		   flag=1;//Переключаем флаг=1
          enter=0;//Переключаем enter=0, т.к еще не нажат enter при таком номере меню
       MIXING();//идем ф-цию  действия  для этого пункта меню
		  }
          }
          }
    //Программа формирвоания задержки
    void pause (unsigned int a)
    { unsigned int i;
     
    for (i=a;i>0;i--);
    }
    //Программа передачи команд в ЖКИ
    void lcd_com (unsigned char lcd)
    { unsigned char temp;
     
    temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда
    PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи команды
     
    temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда
    PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи команды
     
    pause (10*TIME); //Пауза для выполнения команды
    }
    //Программа записи данных в ЖКИ
    void lcd_dat (unsigned char lcd)
    { unsigned char temp;
     
    temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные
    PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи данных
     
    temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные
    PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E
    asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
    PORTD=temp&~(1<<E); //Сигнал записи данных
     
    pause(5*TIME); //Пауза для вывода данных
    }
    //Программа иниализации ЖКИ
    void lcd_init (void)
{
lcd_com(0b101011); //4-проводный интерфейс, 5x8 размер символа 101011
pause(100*TIME);
lcd_com(0b1100); //Показать изображение, курсор не показывать 
pause(100*TIME);
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00    1
pause (100*TIME);
}
//При переключении кнопок продолжает выполняться предыдущее действие ,пока не нажат
//enter в меню этого действия (отключение)
void HEAT(void)

 { while (mode==1)
   if(enter==1)
   {  
     if (ON1==1)
	 {
           lcd_com(0b11000100);//курсор на 44 позицию..

          lcd_dat(0b00100000);  //пробел

	 SetBitVal(PORTB,3 ,0)  ;// выкл диод
     SetBitVal(PORTB,4 ,0)  ;// выкл диод
	 }

	 if (ON1!=1)
	 {
 lcd_com(0b11000100);//курсор на 44 позицию..
  lcd_dat(0b11110101);//значек "пузырьки",нагрев
	  SetBitVal(PORTB,4 ,1)  ; 
 	 	 }
   }
  }
void MIXING (void)
  { while (mode!=0 && mode!=1)
  
  if(enter==1)
  {
     if (ON2==1)
	    {
         lcd_com(0b11000111);//курсор на 47 позицию..
         lcd_dat(0b00100000);  //пробел
 
		 SetBitVal(PORTB,5,0);//выкл. диод
      

		}
     if (ON2==0)
	    {

       lcd_com(0b11000111);//курсор на 47 позицию..
       lcd_dat(0b01111110);//значек "перемешивание"
	SetBitVal(PORTB,5,1);// вкл диод
		}    
  }
   
}
void MOVE (void)
 { while  (mode==0 )
     
	 if(enter==1)
   {  
     if (ON0==1)
	 {  
           lcd_com(0b11000010);//курсор на 44 позицию..

          lcd_dat(0b00100000);  //пробел
 
	 }	 
	 if (ON0==0)
	 {  
           lcd_com(0b11000010);//курсор на 44 позицию..

           lcd_dat(0b11111100);//перемешивание  

            SetBitVal(PORTB,1,1);
		    pause(10000);
			pause(10000);
            SetBitVal(PORTB,1,0);
            pause(10000);
			pause(10000);     
	 }} }               
    //Основная программа
    int main(void)
    {
    DDRD=0xFC;; //Инициализация портов
    PORTD=0x00;
   DDRC=0x00;
	PORTC=0xFF;
	DDRB=0xFF;
	PORTB=0x00;

                 	  //Задержка, чтобы ЖКИ успел включиться
    pause(1000);	
    lcd_init(); //Инициализация ЖКИ
    pause(1000);   
  init_timer();//Инициализация таймера 0
 
sei();//Глобально разрешаем прерывания
	while(1)//Вечный цикл      
	{
      menu();//Запуск обработки пунктов меню
	}   }
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

ошибка в идеологии. Не нужно ничего тулить в прерывание, взведи там флаг на системный тик, который обрабатываешь в основном цикле. Необходимые задержки получаешь с помощью дополнительных счетчиков, которые считают этот тик.
Сейчас ты наглухо виснешь в прерывании, если не отпущена кнопка.
Ответить

Вернуться в «Разные вопросы по МК»