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

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

Версия от 23:15, 12 января 2010; Kern (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
  1. include <stdint.h>
  2. include <avr/io.h>
  3. include <avr/interrupt.h>

//MISO - RCK;

  1. define LATCH 0x40
                                 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ /*.*/

static const uint8_t LEDS[11] = { 0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0xFE }; static volatile uint8_t counts[4]; static volatile uint16_t data = 0; static volatile uint8_t adj = 0;

void Indicate(uint16_t data) {

   counts[3] = data % 10;  
   data /= 10;             
   counts[2] = data % 10;  
   data /= 10;             
   counts[1] = data % 10;  
   data /= 10;             
   counts[0] = data % 10;  
   data /= 10;             
   SPCR |= _BV(SPE);
   register uint8_t j;
   for (j = 0; j < 4; j++)
   {
       SPDR = ( j == 1 ) ? ( LEDS[counts[j]] & LEDS[10] ) : ( LEDS[counts[j]] );
       while (!(SPSR & _BV(SPIF)));
   }
   SPCR &= ~_BV(SPE);
   PORTB |= LATCH;
   PORTB &= ~LATCH;

}

ISR (TIMER0_COMP_vect) {

   if (adj++ % 9)
   {
       adj = 0;
       return;
   }
   if  (data == 10000)
       data = 0;
   Indicate(data++);

}

int main (void) {

   DDRB  = 0xff;
   PORTB = 0x00;
   SPCR  = _BV(SPE) | _BV(MSTR) | _BV(SPR1);
   TCCR0 = _BV(WGM01) | _BV(CS02) | _BV(CS00);
   OCR0  = 78; //78.125;
   TIMSK = _BV(OCIE0);
   sei();
   while (1);

}

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