Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
ayan1337
0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 4
1

Как прекратить бесконечный цикл?

17.12.2018, 01:35. Просмотров 126. Ответов 1

Здравствуйте, нужна помощь. Цель: сделать пульт управления 7-ми сегментным индикатором из 4х кнопок:
1 кнопка-вывод на левом индикаторе
2 кнопка-вывод на правом индикаторе
3 кнопка-вращение по часовой стрелке
4 кнопка-сброс (остановка, возврат в положение по умолчанию)
Проблема со сбросом, после нажатия 3 кнопки - начинается бесконечный цикл, который не реагирует ни на что.
Вопрос: как сделать 3 кнопку "чувствительнее" к другим 3, чтобы по нажатию 1 и 2, вращение отображалось в нужном индикаторе и сбрасывалось когда надо?

Как прекратить бесконечный цикл?


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
 
int main(void)
 
{
    DDRA = 0b011;// порты А
 
    PORTA |= (1<<1); // выбор по умолчанию 1 индикатор
 
    DDRB = 0b11111111; // порты Б
    
    PORTB = 0b00010000; // По умолчанию зажигается нижний сегмент индикатора
 
    DDRD = 0b0000000; // порты Д
 
    PORTD = 0b0001111;
 
while(1)
    {
 
        if (~PIND & (1<<0)) // Проверка состояния 1-й кнопки = ВЫБОР 1 ИНДИКАТОРА
        {
        PORTB = 0b00010000; //имитация включения после сброса (в дальнейшем заменю)
        PORTA &= ~(1<<0); 
        PORTA |= (1<<1);
        }
        if (~PIND & (1<<1)) // Проверка состояния 2-й кнопки = ВЫБОР 2 ИНДИКАТОРА
        {
        PORTB = 0b00010000;
        PORTA &= ~(1<<1);
        PORTA |= (1<<0);
        }
            if (~PIND & (1<<2)) // Проверка состояния 3-й кнопки
                {
                while(1)
                {
                PORTB = 0b00010000;  //ВРАЩЕНИЕ СЕГМЕНТОВ ПО ЧАСОВОЙ СТРЕЛКЕ
                _delay_ms (80);
                PORTB = 0b00001000; 
                _delay_ms (80); 
                PORTB = 0b00000010;
                _delay_ms (80);
                PORTB = 0b00000001;
                _delay_ms (80);
                PORTB = 0b01000000;
                _delay_ms (80);
                PORTB = 0b00100000;
                _delay_ms (80);
                PORTB = 0b00010000;
                _delay_ms (80);
                PORTB = 0b00010000;
                _delay_ms (80);             
                }
                }
        if (~PIND & (1<<3)) // Проверка состояния 4-й кнопки
        {
        PORTB = 0b00000000; // Гаснут все сегменты
        }
       }    
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2018, 01:35
Ответы с готовыми решениями:

Бесконечный цикл записи-стирания Flash памяти Atmega8515 на Си
Подскажите пожалуйста.... Необходимо написать программу на Си, которая будет организовывать...

Зачем в программе нужен бесконечный цикл?
ORG 0000h AJMP START ORG 0003h ; от прерывания INT0 AJMP OBR ORG 0030h ; от прерывания INT1...

АЦП+бесконечный поворотный потенциометр (Atmega16)
Приветствую. Имеется контроллер atmega16 и поворотный потенциометр, который может вращаться не...

Как реализовать бесконечный цикл While, но чтобы этот цикл не грузил процессор?
Допустим есть цикл: while (1) { ... } Как сделать так, чтобы бесконечный цикл не...

Как прекратить цикл, введя определенное число?
В этой части программы производится ввод данных и вывод количества четных чисел.Как построить...

1
ayan1337
0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 4
17.12.2018, 02:27  [ТС] 2
проблему выхода из цикла и возврат в исходное положение решила добавив break.
Теперь осталось сделать, чтоб по нажатию кнопок 1 и 2 после 3, было переключение между индикаторами без остановки самого вращения. Плюс для того чтобы остановить, нужно именно зажать кнопку на секунду, так то сойдет, но думаю можно сделать более грамотнее...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
while(1)
               
PORTB = 0b00010000; 
_delay_ms (80);
PORTB = 0b00001000; 
_delay_ms (80);
PORTB = 0b00000010;
_delay_ms (80);
PORTB = 0b00000001;
_delay_ms (80);
PORTB = 0b01000000;
_delay_ms (80);
PORTB = 0b00100000;
_delay_ms (80);
PORTB = 0b00010000;
_delay_ms (80);
PORTB = 0b00010000;
_delay_ms (80);
if (~PIND & (1<<3))
{
PORTA &= ~(1<<0); 
PORTA |= (1<<1);
break;              
}
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2018, 02:27

Как при нажатии комбинации клавиш прекратить цикл
Здравствуйте программисты. Недавно решил написать небольшой вирус что-бы потом его разослать...

Как сделать бесконечный цикл
Что тут нужно поменять что бы был бесконечный цикл. Помогите пожалуйста. cseg segment org 100h...

Как остановить бесконечный цикл?!
Написал программу, ошибся, и она запустила бесконечный цикл. На что нажать (на клавиатуре) что бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru