Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 04:15

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Помогите разобраться как работает условие в коде программы
СообщениеДобавлено: 17 ноя 2019, 18:52 
Заглядывает иногда

Зарегистрирован: 04 июл 2017, 09:55
Сообщения: 48
Здравствуйте уважаемые форумчане! В поисках материала на тематику AVR, наткнулся на статью "AVR на С -просто? Часть 4", опубликованную на сайте "Паяльник". В данной статье приведен код для управления 5 семисегментными индикаторами, вот собственно и она:
Код:
#include <avr/io.h>         //подключаем библиотеки
#include <util/delay.h>

#define SPI_SS      PB2     //выход SS
#define SPI_MOSI    PB3     //выход MOSI
#define SPI_MISO    PB4     //выход MISO
#define SPI_SCK     PB5     //выход SCK
#define BUTTON_AP   PD4     //выход кнопки A+
#define BUTTON_AM   PD5     //выход кнопки A-
#define BUTTON_BP   PD6     //выход кнопки B+
#define BUTTON_BM   PD7     //выход кнопки B-

char di[5];

void spi(char cmd,char data)                //Функция передачи двух пакетов по 8 бит по протоколу SPI
{
        PORTB &= ~(1<<SPI_SS);              //сбрасываем SS в 0
        SPDR = cmd;                         //отправляем данные по SPI адрес
        while(!(SPSR&(1<<SPIF)));           //ждем окончания отправки
        SPDR = data;                        //отправляем данные по SPI данные
        while(!(SPSR&(1<<SPIF)));           //ждем окончания отправки
        PORTB |= (1<<SPI_SS);               //устанавливаем SS в 1
}

int main()
{

   DDRB |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS);          //настраиваем MOSI, SCK, SS как выходы
   PORTD |= (1<<BUTTON_AP)|(1<<BUTTON_AM)|(1<<BUTTON_BP)|(1<<BUTTON_BM);   //подключение к кнопкам A+, A-, B+, B- подтягивающего резистора
   PORTB |=(1<<SPI_SS);                                     //устанавливаем SS в 1
   SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);          //через регистр SPCR настраиваеи аппаратное SPI

   //Инициализация MAX7221
    spi(0x0C,0x00);     //Отключение индикаторов
    spi(0x09,0xFF);     //Отключение декодирования
    spi(0x0A,0x0A);     //Интенсивность свечения индикаторов
    spi(0x0B,0x04);     //Количество индикаторов начиная с 0
    spi(0x0F,0x00);     //Отключение теста индикаторов
    spi(0x0C,0x01);     //Включение индикаторов

int a=0;                        //значение на первых трех индикаторах
int b=0;                        //значение на последних двух индикаторах
unsigned char flag_button =0;   //переменная для флагов нажатия кнопок

    while(1){           //Бесконечный цикл

        di[2]=a%10;                                                 //поразрядное рабиение значения
        if(a<10)di[1]=15;else di[1]=((a-di[2])/10)%10;              //переменной a и занесение в
        if(a<100)di[0]=15;else di[0]=((a-di[1]*10-di[2])/100)%10;   //массив с гашением не значащих нулей
            spi(1,di[0]);           //вывод значения
            spi(2,di[1]);           //переменной a на
            spi(3,di[2]);           //первых трех индикаторах

        di[4]=b%10;                                     //поразрядгое разбиение значения
        if(b<10)di[3]=15;else di[3]=((b-di[4])/10)%10;  //переменной a и занесение в массив
            spi(4,di[3]);           //вывод значения переменной b на
            spi(5,di[4]);           //последних двух индикаторах

       if(!(PIND & (1<<BUTTON_AP)))flag_button|=(1<<3);     //проверка состояния кнопок
       if(!(PIND & (1<<BUTTON_AM)))flag_button|=(1<<2);     //нажатие заносится в переменную
       if(!(PIND & (1<<BUTTON_BP)))flag_button|=(1<<1);     //флагов flag_button
       if(!(PIND & (1<<BUTTON_BM)))flag_button|=(1<<0);
       _delay_ms(100);                   //задержка для избежания дребезга контактов кнопок
       if(!(PIND & (1<<BUTTON_AP))&&(flag_button&(1<<3)))a++;   //проверка нажатия кнопок
       if(!(PIND & (1<<BUTTON_AM))&&(flag_button&(1<<2)))a--;   //с подтверждением нажатия по
       if(!(PIND & (1<<BUTTON_BP))&&(flag_button&(1<<1)))b++;   //флагу flag_button
       if(!(PIND & (1<<BUTTON_BM))&&(flag_button&(1<<0)))b--;
       flag_button=0;               //сброс флагов нажатия кнопок

       if(a>999)a=999;      //проверка достижения максимального значения переменной a
       if(a<0)a=0;          //проверка достижения минимального значения переменной a
       if(b>99)b=99;        //проверка достижения максимального значения переменной b
       if(b<0)b=0;          //проверка достижения минимального значения переменной b
    }
    return 0;
}

В данном коде я не могу понять вот этот участок
Код:
di[2]=a%10;                                                 //поразрядное рабиение значения
        if(a<10)di[1]=15;else di[1]=((a-di[2])/10)%10;              //переменной a и занесение в
        if(a<100)di[0]=15;else di[0]=((a-di[1]*10-di[2])/100)%10;   //массив с гашением не значащих нулей

Почему di присваивается 15?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться как работает условие в коде программы
СообщениеДобавлено: 17 ноя 2019, 19:17 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 786
Откуда: GMT+6
Вложение:
15.png
15.png [ 6.26 Кб | Просмотров: 374 ]


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB