Вы находитесь на странице: 1из 7

/*****************************************************

�����: ������� ����� 2012�. �������

Chip type : ATmega8


AVR Core Clock frequency: 4,000000 MHz

*****************************************************/

#include <mega8.h>

// Alphanumeric LCD functions


#include <alcd.h>
#include <stdio.h>
#include <delay.h>

unsigned char start=1, Y, speed, flags_motor, x, x_, flags, flags0, flags1, flags2,
cnt, timer_key;
unsigned int data_sensor, data;
unsigned char buffer[10];

eeprom unsigned char speed_eep=10;


eeprom unsigned int data_eep=50;

//=========== ����� ===========================//


#define FA PORTD.0 // ������������� ������ ����
#define FB PORTD.1
#define FC PORTD.2
#define FD PORTD.3

#define motor_stop { FA=FB=FC=FD=0; }

#define A {FD=1; FC=0; FB=0; FA=0;} // ���� ������� �������� ������ ���
#define B {FD=0; FC=1; FB=0; FA=0;}
#define C {FD=0; FC=0; FB=1; FA=0;}
#define D {FD=0; FC=0; FB=0; FA=1;}
#define stop {FD=0; FC=0; FB=0; FA=0;}
//=============================================//

// ============ ������� ========================//


#define key_2 (pc3==0 && pc4 && pc5 && pc6)
#define key_3 (pc3==0 && pc4 && pc5 && pc6)
#define key_4 (pc3 && pc4==0 && pc5 && pc6)
#define key_5 (pc3 && pc4==0 && pc5 && pc6)
#define key_6 (pc3 && pc4==0 && pc5 && pc6)
#define key_7 (pc3 && pc4 && pc5==0 && pc6)

#define pc0 PORTC.0


#define pc1 PORTC.1
#define pc2 PORTC.2

#define pc3 PINC.3


#define pc4 PINC.4
#define pc5 PINC.5
#define pc6 PIND.4

//== ����� ==// // = ������ =//


#define key_0 (pc3 && pc4 && pc5 && pc6==0)
#define key_1 (pc3==0 && pc4 && pc5 && pc6)
#define key_8 (pc3 && pc4 && pc5==0 && pc6)
#define key_9 (pc3 && pc4 && pc5==0 && pc6)
#define key_r (pc3 && pc4 && pc5 && pc6==0)
#define key_z (pc3 && pc4 && pc5 && pc6==0)
#define key_up (pc3 && pc4 && pc5 && pc6)

void key_detect() // ���������� ������ � ����������


{

// Timer 0 ����������
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xF0;
pc0=1; pc1=1; pc2=1;

switch(Y)
{
case 0:
pc0=1; pc1=1; pc2=0;
if(flags && cnt<4)
{
if (key_3) {data = (data *10) + 3; cnt++;
timer_key=0;}
if (key_6) {data = (data *10) + 6; cnt++;
timer_key=0; }
if (key_9) { data = (data *10) + 9; cnt++;
timer_key=0;}

flags=0;
}
if (key_r)
{
if(cnt)cnt--; // ���������� ������� �������
if (data > 9) data /=10; if(data > 0 &&
data < 10) data = 0;
}

if(key_up) flags0=1;
else flags0=0;
break;
case 1:
pc0=1; pc1=0; pc2=1;

if(flags && cnt<4)


{
if (key_0) { if(data>0) {data = data *10; cnt++; }
timer_key=0;}
if (key_2) {data = (data *10) + 2; cnt++;
timer_key=0;}
if (key_5) {data = (data *10) + 5; cnt++;
timer_key=0; }
if (key_8) {data = (data *10) + 8; cnt++;
timer_key=0;}
flags=0;
}

if(key_up) flags1=1;
else flags1=0;
break;
case 2:
pc0=0; pc1=1; pc2=1;

if(flags && cnt<4)


{
if (key_1) {data = (data *10) + 1; cnt++;
timer_key=0;}
if (key_4) {data = (data *10) + 4; cnt++;
timer_key=0; }
if (key_7) {data = (data *10) + 7; cnt++;
timer_key=0;}

if(flags)
{

if (key_z)
{
if(start) start=0; else start=1;
data_eep = data; // ���������� ������

} // ������ � ������� ���������

flags=0;
}

if(key_up) flags2=1;
else flags2=0;
break;
default:
}

if (flags0 && flags1 && flags2 ) flags=1;

key_detect();

Y++;
if(Y>2) Y=0;
}

// Timer2 ������� �����


interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=speed;
flags_motor=1;

if(start)
{
switch(x)
{
case 0:
A;
break;
case 1:
B;
break;
case 2:
C;
break;
case 3:
D;
break;
default:
}

if(++x>3)
{
if (++x_>11)
{
data_sensor++; x_=0;
}
x=0;
}
}
else
{
stop;
}

if(start && data_sensor >= data) {start=0; data_sensor=0;} // ���� �������


������� �������� ���������� - ���������� �������� � �������� ������

void speed_setting() // ��������� �������� ������


{
TCNT2=speed;
}

void menu_setting() // �������� ���


{
sprintf(buffer,"S %-6u", data); // ���������� ������� ����
lcd_gotoxy(0,0);
lcd_puts(buffer);

sprintf(buffer,"DS %-6u", data_sensor); // ���������� ��� ���������


lcd_gotoxy(0,1);
lcd_puts(buffer);
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port B 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
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State6=P State5=P State4=P State3=P State2=0 State1=0 State0=0
PORTC=0x78;
DDRC=0x07;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=P State5=T State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=0x05;
TCNT0=0xFA;

// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x06;
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: 15,625 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x06;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x45;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 20
lcd_init(16);

lcd_clear();

lcd_gotoxy(0,0);
lcd_putsf("MAGIC MOTION LED ");

lcd_gotoxy(0,1);
lcd_putsf(" PRODUCTION 2015 ");

delay_ms(3000);

lcd_clear();

// Global enable interrupts


#asm("sei")

speed = 0x10;
data = data_eep;

while (1)
{

speed_setting();
menu_setting();

delay_ms(40);
}
}