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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
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 »

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

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