реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Подскажите начинающему, Keil
Палыч
сообщение Dec 18 2010, 09:08
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Djumper @ Dec 18 2010, 14:21) *
Подскажите и я вам буду очень благодарен sm.gif
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. Кнопки имеют нехорошее свойство, которое называют "дребезг контактов". Ваша программа от него не защищена! И, возможно (даже - вероятнее всего), будет улавливать нажатие одной кнопки как множественное нажатие на одну и ту же кнопку.
Go to the top of the page
 
+Quote Post
Djumper
сообщение Dec 18 2010, 15:16
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 9-10-10
Пользователь №: 60 027



Код
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;
}

Всё равно не могу сообразить как четыре светодиода включить и сбросить.

Сообщение отредактировал Djumper - Dec 18 2010, 15:26
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 19 2010, 04:22
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Djumper @ Dec 18 2010, 21:16) *
for (c=0; c<4; c++) //ввёл переменную "c": сначала "с" равно "0", пока "с" меньше 4-х то выполняется программа, правильно?
Нет, неправильно. Массивы а и b состоят из трёх элементов; индексы этих элементов 0, 1, 2 (в языке Си самый первый элемент массива имеет индекс ноль); поэтому - "пока переменная с меньше трёх".

Цитата(Djumper @ Dec 18 2010, 21:16) *
if (b[c]!=a[c]) //тут сравниваем: если "b" не равно "а" то гоу в начало, правильно?
Да, правильно. Но, скорее всего, Ваши массивы никогда не совпадут (см. PS к моему предыдущему посту).

Цитата(Djumper @ Dec 18 2010, 21:16) *
Всё равно не могу сообразить как четыре светодиода включить и сбросить.
Вот, после выполнения цикла for(c=0; c<3; c++) т.е. после того, как проверили, что массивы совпадают и надо включить четыре светодиода. Что делать дальше? Далее нужно сканировать клавиатуру и обнаруживать нажатия на клавишу; как только нажатие клавиши будет обнаружено, то потушить диоды и - в начало.
Go to the top of the page
 
+Quote Post
Djumper
сообщение Dec 19 2010, 12:35
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 9-10-10
Пользователь №: 60 027



Учту дребезг в будущем.

На данный момент сделаю так, чтобы загорались все 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'};
}


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

Сообщение отредактировал Djumper - Dec 19 2010, 13:18
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 20 2010, 07:00
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Djumper @ Dec 19 2010, 18:35) *
На данный момент сделаю так, чтобы загорались все 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;  // зажечь все четыре светодиода


Цитата(Djumper @ Dec 19 2010, 18:35) *
можно int k, c; и char a[3]; поместить в main {}?

Можно

Цитата(Djumper @ Dec 19 2010, 18:35) *
Надо брать микроконтроллер с программатором на вечное пользование и учиться, а то людей отвлекаю своими вопросами
Ну, или, если микроконтроллер с программатором труднодоступен, то - "потренироваться на кошечках" - воспользоваться симулятором.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016