Индикация на двух семи сегментных трёх знаковых светодиодных индикаторах через SPI

Материал из Automata.

(Различия между версиями)
Перейти к: навигация, поиск
м (Полностью удалено содержимое страницы)
(Отмена правки № 1785 участника Kern (обсуждение))
 
Строка 1: Строка 1:
 +
#include <stdint.h>
 +
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
#define GreenLed 0x10//закрепляем за GreenLed значение, равное 0х10;
 +
#define RedLed 0x40//закрепляем за RedLed значение, равное 0х40;
 +
 +
//массив кодированных символов для отабражения на индикаторах;
 +
static const uint8_t LEDS[10] = { 0x5f, 0x42, 0x37, 0x76 ,0x6a, 0x7c, 0x7d, 0x46, 0x7f, 0x7e };// 0, 1, ... 9;
 +
static volatile uint8_t counts[3] = { 0, 0, 0 };//массив хранения значений разрядов числа для отображения;
 +
static volatile uint16_t first = 0;//переменная для хранения числа, отображаемого на первом индикаторе;
 +
static volatile uint16_t second = 0;//переменная для хранения числа, отображаемого на втором индикаторе;
 +
 +
//процедура задержки;
 +
void Wait (volatile uint32_t wait)
 +
{
 +
while (wait-- > 0); //wait - пустых тактов;
 +
}
 +
 +
//функция отображения числа на индикаторах;
 +
void IndicateLed(uint16_t num, uint8_t pin)
 +
{
 +
register uint8_t j;
 +
//получение значений разрядов отображаемого числа для индексации в массиве LEDS[];
 +
counts[2] = num % 10;
 +
num /= 10;
 +
counts[1] = num % 10;
 +
num /= 10;
 +
counts[0] = num % 10;
 +
num /= 10;
 +
 +
SPCR |= _BV(SPE); //включаем модуль SPI;
 +
for (j = 0; j < 3; j++) //для каждой из отображаемых цифр;
 +
{
 +
uint8_t digit = counts[j]; //берем соответствующую цифру;
 +
SPDR = 0xff - LEDS[digit]; //и отправляем ее инвертированный код в буфер SPI;
 +
while (!(SPSR & _BV(SPIF))); //ждем окончания передачи;
 +
}
 +
SPCR &= ~_BV(SPE);//выключаем модуль SPI;
 +
 +
//защелкиваем в схеме индикаторов отправленное туда значение;
 +
PORTB |= pin;
 +
PORTB &= ~pin;
 +
}
 +
 +
//главная функция;
 +
int main (void)
 +
{
 +
DDRB = 0xff; //порт В настраиваем на выход;
 +
PORTB = 0x00; //отправляем на выводы логический "0";
 +
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR1);//включаем модуль SPI,
 +
//настраиваем контроллер как Master - устройство,
 +
//задаем предделитель в 64;
 +
while (1)
 +
{
 +
first = 123;
 +
second = 987;
 +
for (uint8_t i = 0; i < 7; i++)
 +
{
 +
IndicateLed(second, RedLed);
 +
IndicateLed(first, GreenLed);
 +
first += 111;
 +
second -= 111;
 +
Wait(4000000);
 +
}
 +
};
 +
}

Текущая версия

#include <stdint.h>                
#include <avr/io.h>                
#include <avr/interrupt.h>         
#define GreenLed 0x10//закрепляем за GreenLed значение, равное 0х10;
#define RedLed 0x40//закрепляем за RedLed значение, равное 0х40;    
//массив кодированных символов для отабражения на индикаторах;      
static const uint8_t LEDS[10] = { 0x5f, 0x42, 0x37, 0x76 ,0x6a, 0x7c, 0x7d, 0x46, 0x7f, 0x7e };// 0, 1, ... 9;
static volatile uint8_t counts[3] = { 0, 0, 0 };//массив хранения значений разрядов числа для отображения;    
static volatile uint16_t first = 0;//переменная для хранения числа, отображаемого на первом индикаторе;       
static volatile uint16_t second = 0;//переменная для хранения числа, отображаемого на втором индикаторе;      
//процедура задержки;                                                                                         
void Wait (volatile uint32_t wait)                                                                            
{                                                                                                             
               while (wait-- > 0);     //wait - пустых тактов;                                               
}                                                                                                             
//функция отображения числа на индикаторах;                                                                   
void IndicateLed(uint16_t num, uint8_t pin)
{
       register uint8_t j;
               //получение значений разрядов отображаемого числа для индексации в массиве LEDS[];
               counts[2] = num % 10;
               num /= 10;
               counts[1] = num % 10;
               num /= 10;
               counts[0] = num % 10;
               num /= 10;

               SPCR |= _BV(SPE);                       //включаем модуль SPI;
               for (j = 0; j < 3; j++)                 //для каждой из отображаемых цифр;
               {
                       uint8_t digit = counts[j];      //берем соответствующую цифру;
                       SPDR = 0xff - LEDS[digit];      //и отправляем ее инвертированный код в буфер SPI;
                       while (!(SPSR & _BV(SPIF)));    //ждем окончания передачи;
               }
               SPCR &= ~_BV(SPE);//выключаем модуль SPI;
        
               //защелкиваем в схеме индикаторов отправленное туда значение;
               PORTB |= pin;
               PORTB &= ~pin;

}

//главная функция;
int main (void)
{
        DDRB   = 0xff;                            //порт В настраиваем на выход;
        PORTB  = 0x00;                            //отправляем на выводы логический "0";
        SPCR   = _BV(SPE) | _BV(MSTR) | _BV(SPR1);//включаем модуль SPI,
                                                  //настраиваем контроллер как Master - устройство,
                                                  //задаем предделитель в 64;
        while (1)
        {
                first = 123;
                second = 987;
                for (uint8_t i = 0; i < 7; i++)
                {
                        IndicateLed(second, RedLed);
                        IndicateLed(first, GreenLed);
                        first += 111;
                        second -= 111;
                        Wait(4000000);
                }
        };
}
Личные инструменты
Микроконтроллеры