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

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

Перейти к: навигация, поиск
#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);
                }
        };
}
Личные инструменты
Микроконтроллеры