/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 24.01.2014
Author  : 
Company : 
Comments: 


Chip type           : ATmega8
Program type        : Application
Clock frequency     : 3,686400 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
char tmp=0;// переменная определения что сработало прерывание от порта.
char chet;//Число выводимое на индикатор

// Ввод-вывод на СОМ-порт.

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   /* rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      }; */
   chet=data;
   tmp=1;   
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Индикация значений

// Установка значений для индикаторов
// Выводы цифр на индикатор
#define ina PORTC.5
#define inb PORTC.4
#define inc PORTC.3
#define ind PORTC.2
#define ine PORTC.1
#define inf PORTC.0
#define ing PORTB.5
#define indp PORTB.4
//Выводы для столбцов
#define st1 PORTB.1
#define st2 PORTB.2
#define st3 PORTB.3
 
unsigned char stolb=0;//Определение какой столбец индикатора включен 1..3 
// unsigned int chet_pr=0;//Счётчик прерываний часов


// Значения для вывода на индикатор
unsigned int i1=0;//единицы
unsigned int i2=0;//десятки
unsigned int i3=0;//сотни

void _indikator(int a)//функция вычисления значений индикатора.
        {
        if(a>=1000)
           {i1=0;i2=0;i3=0;}
        else
           {
            if(a<100)i3=0;else{i3=a/100;a=a%100;}
            if(a<10) {i2=0;i1=a;}else{i2=a/10;i1=a%10;} 
           }      
        }

void _chislo(int a)// Нормирование для вывода на светодиодный индикатор  
        {
         switch(a)
         {
         case 0:ina=1;inb=1;inc=1;ind=1;ine=1;inf=1;ing=0;indp=0;break;
         case 1:ina=0;inb=1;inc=1;ind=0;ine=0;inf=0;ing=0;indp=0;break;
         case 2:ina=1;inb=1;inc=0;ind=1;ine=1;inf=0;ing=1;indp=0;break;
         case 3:ina=1;inb=1;inc=1;ind=1;ine=0;inf=0;ing=1;indp=0;break;
         case 4:ina=0;inb=1;inc=1;ind=0;ine=0;inf=1;ing=1;indp=0;break;
         case 5:ina=1;inb=0;inc=1;ind=1;ine=0;inf=1;ing=1;indp=0;break;
         case 6:ina=1;inb=0;inc=1;ind=1;ine=1;inf=1;ing=1;indp=0;break;
         case 7:ina=1;inb=1;inc=1;ind=0;ine=0;inf=0;ing=0;indp=0;break;
         case 8:ina=1;inb=1;inc=1;ind=1;ine=1;inf=1;ing=1;indp=0;break;
         case 9:ina=1;inb=1;inc=1;ind=1;ine=0;inf=1;ing=1;indp=0;break;
         }
        }




// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  {
     // chet_pr++;
     // if(chet_pr==20)
       {
       switch(stolb)
        {
        case 0:_chislo(i1);st1=0;st2=1;st3=1;stolb=1;break;
        case 1:_chislo(i2);st1=1;st2=0;st3=1;stolb=2;break;
        case 2:_chislo(i3);st1=1;st2=1;st3=0;stolb=0;break;
        }
        
       //chet_pr=0;  
       }       
  }

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In 
// State7=T State6=T State5=0 State4=0 State3=1 State2=1 State1=1 State0=T 
PORTB=0x0E;
DDRB=0x3E;

// Port C initialization
// Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTC=0x00;
DDRC=0x3F;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 57,600 kHz
TCCR0=0x03;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x17;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

// Предварительная установка
chet=123;
_indikator(chet);


while (1)
      {
      while (tmp==0); 
        _indikator(chet);
       tmp=0;

      };
}
