Ð˜Ð½Ð´Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° двух Ñеми Ñегментных трёх знаковых Ñветодиодных индикаторах через 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); } }; }