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

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

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

Версия 13:07, 9 февраля 2010

Личные инструменты
Микроконтроллеры