Палыч 10 18 декабря, 2010 Опубликовано 18 декабря, 2010 · Жалоба Подскажите и я вам буду очень благодарен :) PS: кстати, прочтите мои комментарии к моей программе, правильно ли я понимаю как работает программа? Поскольку из Ваших коментариев трудно понять, что же вы хотели сделать, то написанное ниже - мои фантазии на эту тему... char a[3]; //переменная "а" будет содержать 3 символа? или состоит из матрицы с 3 столбцами? Массив с именем а состоит из трёх элементов, каждый из которых - символ. Imho, сюда Вы ходели поместить некие символы, соответствующие нажатым клавишам. char b[3]={'1','6','8'}; //это вроде как значение кода, но он не работает или это что-то другое? переменная, то для чего? Наверное, этот массив, с которым нужно бы сравнить массив а после нажатия трёх клавиш. inception: P0=0; P1=0;//inception я придумал название, это же переменная? Это - не переменная, это - метка. Как лучше оформлять бесконецный цикл - см. мой предыдущий пост: тогда сразу видно, что этот цикл - бесконечный. while(k!=3) //почему "k" не равно 3??? когда будет больше нажатий то обнулиться? Imho, не равно 3, потому, что Вы ожидаете нажатие трёх кнопок. Значение переменной k изменяется в цикле (операторы k++), обнулять эту переменную нужно самому (автоматически это не делается). if (P1_0==0) {k++; while(P1_0==0) a[k]='1'; //указали строку, нажата 1 клавиша, добавили к "k" единичку, далее пока клавиша нажата, то что? переменная "а" равна 1 кодовому символу? Вы, вероятно путаете символ '1' со значением 1... Поскольку в начале переменная k равнялась нулю (и то, потому, что эта переменная - глобальная; хорошо бы явно присваивать ей начальное значение), то увеличивать её значение нужно было бы после a[k]='1' (индексы массивом начинаются с нуля, т.е. первый элемент массива а[0]). Оператор while спользуется, по-видимому, для ожидания отпускания кнопки. Всё это следовало бы записать, наверное так: if (P1_0==0) { a[k]='1'; k++; // или так: a[k++]='1'; P0_3=1; P0_2=0; P0_1=0; P0_0=0; while(P1_0==0); } //тут охота чтобы после третьей нажатой клавиши загорались все 4 светодиода и продолжали гореть пока не нажму на любую другую клавишу Здесь, наверное, нужно сравнить Ваши массивы a и b, и, если они совпадают, то зажечь четвертый светодиод. Здесь же, наверное, нужно ещё и обнулить переменную k, раз Вы переходите на начало Вашего бесконечного цикла... P.S. Кнопки имеют нехорошее свойство, которое называют "дребезг контактов". Ваша программа от него не защищена! И, возможно (даже - вероятнее всего), будет улавливать нажатие одной кнопки как множественное нажатие на одну и ту же кнопку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djumper 0 18 декабря, 2010 Опубликовано 18 декабря, 2010 (изменено) · Жалоба sfr P0=0x80; sfr P1=0x90; sbit P0_0=0x80; //1 светодиод sbit P0_1=0x81; //2 светодиод sbit P0_2=0x82; //3 светодиод sbit P0_3=0x83; //4 светодиод sbit P0_4=0x84; //1 столбец клавиатуры матричного типа sbit P0_5=0x85; //2 столбец sbit P0_6=0x86; //3 столбец sbit P1_0=0x90; //1 строка sbit P1_1=0x91; //2 строка sbit P1_2=0x92; //3 строка sbit P1_3=0x93; //4 строка int k, c; char a[3]; main() { char b[3]={'1','6','8'}; inception: P0=0; P1=0; while(k!=3) { P0_4=0; P0_5=1; P0_6=1; if (P1_0==0) {k++; while(P1_0==0) a[k]='1'; P0_3=1; P0_2=0; P0_1=0; P0_0=0;} P0_4=1; P0_5=1; P0_6=0; if (P1_1==0) {k++; while(P1_1==0) a[k]='6'; P0_3=0; P0_2=1; P0_1=0; P0_0=0;} P0_4=1; P0_5=0; P0_6=1; if (P1_2==0) {k++; while(P1_1==0) a[k]='8'; P0_3=0; P0_2=0; P0_1=1; P0_0=0;} } for (c=0; c<4; c++) //ввёл переменную "c": сначала "с" равно "0", пока "с" меньше 4-х то выполняется программа, правильно? if (b[c]!=a[c]) //тут сравниваем: если "b" не равно "а" то гоу в начало, правильно? goto inception; } Всё равно не могу сообразить как четыре светодиода включить и сбросить. Изменено 18 декабря, 2010 пользователем Djumper Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 19 декабря, 2010 Опубликовано 19 декабря, 2010 · Жалоба for (c=0; c<4; c++) //ввёл переменную "c": сначала "с" равно "0", пока "с" меньше 4-х то выполняется программа, правильно?Нет, неправильно. Массивы а и b состоят из трёх элементов; индексы этих элементов 0, 1, 2 (в языке Си самый первый элемент массива имеет индекс ноль); поэтому - "пока переменная с меньше трёх". if (b[c]!=a[c]) //тут сравниваем: если "b" не равно "а" то гоу в начало, правильно?Да, правильно. Но, скорее всего, Ваши массивы никогда не совпадут (см. PS к моему предыдущему посту). Всё равно не могу сообразить как четыре светодиода включить и сбросить.Вот, после выполнения цикла for(c=0; c<3; c++) т.е. после того, как проверили, что массивы совпадают и надо включить четыре светодиода. Что делать дальше? Далее нужно сканировать клавиатуру и обнаруживать нажатия на клавишу; как только нажатие клавиши будет обнаружено, то потушить диоды и - в начало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djumper 0 19 декабря, 2010 Опубликовано 19 декабря, 2010 (изменено) · Жалоба Учту дребезг в будущем. На данный момент сделаю так, чтобы загорались все 4 светодиода. Правильно? for (c=0; c<3; c++) P0_3=1; P0_2=1; P0_1=1; P0_0=1; if (b[c]!=a[c]) Или из-за дребезга можно вообще убрать сравнение, т.к. оно врятли будет работать в нынешней моей версии программы? Т.е. просто сделать так: for (c=0; c<3; c++) P0_3=1; P0_2=1; P0_1=1; P0_0=1; Ой, причём тут переменная "c", нужна "k"? for (k=0; k<3; k++) P0_3=1; P0_2=1; P0_1=1; P0_0=1; Кстати, а можно int k, c; и char a[3]; поместить в main {}? Т.е. сделать так: main() { int k, c; char a[3]; char b[3]={'1','6','8'}; } Надо брать микроконтроллер с программатором на вечное пользование и учиться, а то людей отвлекаю своими вопросами :) Изменено 19 декабря, 2010 пользователем Djumper Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 20 декабря, 2010 Опубликовано 20 декабря, 2010 · Жалоба На данный момент сделаю так, чтобы загорались все 4 светодиода. Правильно? for (c=0; c<3; c++) P0_3=1; P0_2=1; P0_1=1; P0_0=1; if (b[c]!=a[c]) Нет, неправильно. В некоторых операторах (например, циклов, ветвления...) можно разместить один оператор, а если нужно - несколько операторов, то они заключаются в операторные (фигурные) скобки. Так, как Вы написали: будет трижды (при с=0, 1, 2) выполнен один и тот же оператор (P0_3=1;). Цикл же здесь, чтобы сравнить три элемента массивов a и b. Т.е. должно быть что-то такое: for (c=0; c<3; c++) if (b[c]!=a[c]) // элементы совпадают ? { // нет, не совпадают // здесь помещаем все действия, что нужно выполнить при неправильном наборе goto inception; } // Сюда программа попадёт, если все три элемента массивов a и b совпадут между собой P0_3=1; P0_2=1; P0_1=1; P0_0=1; // зажечь все четыре светодиода можно int k, c; и char a[3]; поместить в main {}? Можно Надо брать микроконтроллер с программатором на вечное пользование и учиться, а то людей отвлекаю своими вопросамиНу, или, если микроконтроллер с программатором труднодоступен, то - "потренироваться на кошечках" - воспользоваться симулятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться