Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 5
1

Программирование портов ввода/вывода

04.05.2020, 22:35. Просмотров 462. Ответов 13

Всем доброго!

Нужно помощь в решении задачи. Буду благодарен.

Код
Светодиоды включаются по очереди, создавая эффект бегущих огней от LEDi до LEDj.
Первоначально i = 0, а j = 7. После каждого последующего нажатия на кнопку i
становится равным j, а j – номеру нажатой кнопки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2020, 22:35
Ответы с готовыми решениями:

Программирование портов ввода/вывода
Ребята, помогите спрограммировать работу в AtmelStudio на языке C или C++ пожалуйста. Вот задание:...

Программирование портов ввода-вывода (Atmega48, Си)
Добрый вечер. Помогите с заданием. Необходимо составить программу. 1) При старте программы,...

Вывод текущей даты используя информацию из CMOS памяти и портов ввода-вывода (70h-7Fh)
Здравствуйте! Помогите кто чем может! На входном языке Ассемблер разработать программу, которая...

Программирование ввода-вывода
Прошу написать код для двух заданий из двух частей: 1)Прокрутить 10 строк вверх(строка...

13
Модератор
Эксперт Java
4516 / 2520 / 1015
Регистрация: 21.10.2017
Сообщений: 7,793
Записей в блоге: 2
05.05.2020, 23:11 2
Kasim Maksim, вот, делал как-то. Огонь просто бегает туда-сюда
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define F_CPU 4000000
#include <avr/io.h>
#include <util/delay.h>
 
#define led_count 8
 
int main(void){
    DDRD = 0xFF;
    uint8_t val, i;
    
    while (1) {
        val = 0;
        for (i=0; i<led_count; ++i) {
            _delay_ms(100);
            PORTD = 1 << val++;
        }
        for (i=0; i<led_count; ++i) {
            _delay_ms(100);
            PORTD = 1 << --val;
        }
    }
}
0
901 / 541 / 81
Регистрация: 15.05.2012
Сообщений: 3,168
06.05.2020, 10:13 3
Цитата Сообщение от Kasim Maksim Посмотреть сообщение
номеру нажатой кнопки
И сколько их?
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 5
06.05.2020, 21:41  [ТС] 4
Добавлено через 2 минуты
Цитата Сообщение от pyzhman Посмотреть сообщение
И сколько их?
восемь
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 5
14.05.2020, 23:11  [ТС] 5
всё ещё актуально
0
locm
14.05.2020, 23:14
  #6

Не по теме:

Цитата Сообщение от Kasim Maksim Посмотреть сообщение
всё ещё актуально
Сначала думал что зашел в раздел фриланса...

0
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
18.05.2020, 21:50 7
Надо определить дополнительную переменную, напрмер temp и при j от 0 до 7 "temp"у давать значение:
C++
1
2
3
4
5
6
7
8
j=0 то temp=1 (в двоичном виде temp=0b00000001)
j=1 то temp=2 (в двоичном виде  temp=0b00000010)
j=2 то temp=4 (в двоичном виде  temp=0b00000100)
j=3 то temp=8 (в двоичном виде  temp=0b00001000)
j=4 то temp=16 (в двоичном виде  temp=0b00010000)
j=5 то temp=32 (в двоичном виде  temp=0b00100000)
j=6 то temp=64 (в двоичном виде  temp=0b01000000)
j=7 то temp=128 (в двоичном виде  temp=0b10000000)
Значения в двоичном виде можно посмотреть в калкуляторе в режиме программиста.
И потом темп отправляешь на порт где у тебя подключены светодиоды:
например:
C++
1
PORTB=temp
0
Модератор
Эксперт Java
4516 / 2520 / 1015
Регистрация: 21.10.2017
Сообщений: 7,793
Записей в блоге: 2
18.05.2020, 22:16 8
tatarva87, а сдвиг бита - это не кошерно?
0
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
19.05.2020, 18:55 9
Цитата Сообщение от iSmokeJC Посмотреть сообщение
tatarva87, а сдвиг бита - это не кошерно?
со сдвигом потом разберется. Ему по ходу сначала необходимо понять почему загорается тот или иной светодиод.
А ты молодец- красивым кодом блестнул!
0
Модератор
Эксперт Java
4516 / 2520 / 1015
Регистрация: 21.10.2017
Сообщений: 7,793
Записей в блоге: 2
19.05.2020, 18:57 10
tatarva87, что в нем красивого?

Не по теме:

Аааа, сарказм

0
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
19.05.2020, 19:00 11
Сначала по простому постараемся объяснить. А усложнять будет сам.
1
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 5
24.05.2020, 14:44  [ТС] 12
Пол пути пройдено.. Подскажите, как условие реализовать, чтобы фонарь ходил от i до j. То есть если i = 7 а j=кнопка 2, то фонарь идёт от 7 до 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
63
64
65
66
67
68
69
70
#define F_CPU 3686400UL
#include <avr/io.h>
#include <util/delay.h>
 
int main(void)
{
    unsigned char r,d,i,j;
    DDRB=   0xFF;
    PORTB = 0xFF;
    DDRD  = 0x00;
    PORTD = 0xFF;
    i=0b00000001;
    j=0b10000000;
 
    d=0;
    while (1){
        if (d==1){
            r=0b10000000;
        }
        else if(d==0){
            r=0b00000001;
        }
        while (r != 0){
            PORTB = r^0xFF;
            if(PIND == 0xFF){
                if(d==1){
                    r>>=1;
                }
                else
                r<<=1;
            }
            else if (PIND != 0xFF){
                i=j;
                r=i;
                j=j;
                if(!(PIND &(1<<1))){
                    j=0b00000010;
                }
                if(!(PIND &(1<<2))){
                    j=0b00000100;
                }
                if(!(PIND &(1<<3))){
                    j=0b00001000;
                }
                if(!(PIND &(1<<4))){
                    j=0b00010000;
                }
                if(!(PIND &(1<<5))){
                    j=0b00100000;
                }
                if(!(PIND &(1<<6))){
                    j=0b01000000;
                }
                if(!(PIND &(1<<7))){
                    j=0b10000000;
                }
            }
            
            //_delay_ms(1000);
            if(j <= i)
            {
                d=1;
            }
            else if(j > i)
            {
                d=0;
            }
        }
    }
}
0
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
24.05.2020, 21:11 13
Цитата Сообщение от Kasim Maksim Посмотреть сообщение
Подскажите, как условие реализовать, чтобы фонарь ходил от i до j
У тебя слишком много ifов подряд. Когда нибудь это тебя запутает. Будет намного разборчивее если в таких случаях будешь использовать оператор switch.
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 5
24.05.2020, 21:32  [ТС] 14
Вроде решил. Реализация школьника, знаю.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#define F_CPU 3686400UL
#include <avr/io.h>
#include <util/delay.h>
 
int main(void)
{
    unsigned char r,d,i,j;
    DDRB=   0xFF;
    PORTB = 0xFF;
    DDRD  = 0x00;
    PORTD = 0xFF;
    i=0b00000001;
    j=0b10000000;
 
    d=0;
    while (1){
        while (r != 0){
            //_delay_ms(500);
            PORTB = r^0xFF;
            if(j <= i)
            {
                d=1;
            }
            else if(j > i)
            {
                d=0;
            }
            if(PIND == 0xFF){
                if(d==1){
                    if(r==j){
                        r=i;
                        continue;
                    }
                    r>>=1;
                }
                else if(d==0){
                    if(r==j){
                    r=i;
                    continue;
                }
                r<<=1;
                }
            }
            else if (PIND != 0xFF){
                i=j;
                r=i;
                j=j;
                if(!(PIND &(1<<1))){
                    j=0b00000010;
                }
                if(!(PIND &(1<<2))){
                    j=0b00000100;
                }
                if(!(PIND &(1<<3))){
                    j=0b00001000;
                }
                if(!(PIND &(1<<4))){
                    j=0b00010000;
                }
                if(!(PIND &(1<<5))){
                    j=0b00100000;
                }
                if(!(PIND &(1<<6))){
                    j=0b01000000;
                }
                if(!(PIND &(1<<7))){
                    j=0b10000000;
                }
            }
            
            //_delay_ms(500);
        }
        if (d==1){
            r=j;
        }
        else if(d==0){
            r=i;
        }
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2020, 21:32

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

Программирование прерываний. Интерфейс с базовой системой ввода-вывода
Доброго времени суток, уважаемые форумчане! Требуется ваша помощь! Написать процедуру,...

Какое приложение можно написать на тему "Программирование файлового ввода-вывода"
Здравствуйте! Тема курсовой работы:&quot;Программирование файлового ввода-вывода в С#&quot; Подскажите,...

Ошибка ввода\вывода 104, файле не открыт для ввода (строка 0)
Всё работает, но пишет: &quot;ошибка ввода\вывода 104, файле не открыт для ввода (строка 0). ...

Ошибка ввода/вывода 104 - файл не открыт для ввода
var a:array of integer; n,j,i,k: integer; f:text; begin ...

программирование на Java USB и COM портов
возможно ли писать на java 'драйвера' для внешних устройств?

Программирование звуковой карты на уровне портов
использую radasm + masm32 (если возможно то для link16.exe) нашёл вот такой код, сам почти не имею...


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

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

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