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

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

(Различия между версиями)
Перейти к: навигация, поиск
м (Полностью удалено содержимое страницы)
м (Правки Kern (обсуждение) откачены к версии Mrsnaut)
 
Строка 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);//задержка в половину секунды;
        }
    };
}
Личные инструменты
Микроконтроллеры