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

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

(Различия между версиями)
Перейти к: навигация, поиск
м (Полностью удалено содержимое страницы)
Строка 1: Строка 1:
-
#include <stdint.h>
 
-
#include <avr/io.h>
 
-
#include <avr/interrupt.h>
 
-
//MISO - RCK;
 
-
#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;
 
- 
-
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 (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);
 
-
TIMSK = _BV(OCIE0);
 
-
OCR0 = 78;
 
-
//78'''.125''' t = 0.01 s * 8/1024 MHz;
 
-
 
-
 
-
sei();
 
-
 
-
while (1);
 
-
}
 

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

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