#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define CD4094_PORT PORTB
#define CD4094_DDR DDRB
#define CD4094_PIN_DATA 3
#define CD4094_PIN_CLK 2
#define CD4094_PIN_STB 4
#define OnBit(address,bit) (address|=(1<<bit))
#define OffBit(address,bit) (address&=~(1<<bit))
void CD4094_CLK(void){ //дёргаем ногу clk для проталкивания битов по регистру
OnBit(CD4094_PORT,CD4094_PIN_CLK);
delay_ms(2);
OffBit(CD4094_PORT,CD4094_PIN_CLK);
}
void CD4094_STB(void){ //дёргаем ногу stb для поджига светодиодов
OnBit(CD4094_PORT,CD4094_PIN_STB);
delay_ms(2);
OffBit(CD4094_PORT,CD4094_PIN_STB);
}
CD4094_DDR=(1<<CD4094_PIN_DATA)|(1<<CD4094_PIN_CLK);// нужные ноги ставим в 1
//Led[] макрос в первый элемент которого будет заноситься код строки а во второй код столбца соответствующие
//тикам таймера в данный момент
void Shift_Reg(void){ //загрузка сдвигового регистра
Shift_One_Byte(Led[0]);//загрузка байта в 1 регистр//а вот тут будет error Shift_One_Byte undefined

//почему?
Shift_One_Byte(Led[1]);//загрузка байта во 2 регистр
CD4094_STB(); //зажигаем светодиоды
}
void Shift_One_Byte(unsigned char dig){ //загрузка одного байта
char i=8;
while(i--){
if(dig&0X80){OnBit(CD4094_PORT,CD4094_PIN_DATA)}
else{OffBit(CD4094_PORT,CD4094_PIN_DATA)}
dig<<1;
CD4094_CLK();
}
}
volatile uint8_t TH; //определение переменных
uint16_t Analog(void){ //используем аналоговый компаратор для замера времени заряда кондёра
OffBit(DDRB,0); //переводим 0 выход порта В в третье состояние
OffBit(PORTB,0);
TCNT0=0; //очистим счётчик-накопитель
TH=0;
TCCR0=2; //включаем таймер0 с пределителем CLK/8
OnBit(DDRB,7); //включить транзистор
while(!(ACSR&(1<<5))); //ждём изменения состояния бита АСО на выходе компаратора
TCCR0=0; //выключаем таймер
OffBit(DDRB,7); //выключаем транзистор
OnBit(DDRB,0); //разряжаем кондёр
delay_ms(2); //время для разряда кондёра
return(TH<<8 | TCNT0); //возвращаем результат замера времени
}
ISR(TIMER0_OVF_vect){ //обработка прерывания таймера0 по переполнению
//при переполнении 8-битного счётчика таймера увеличивать байт ТН на 1
TH++;
}
void main(void){
// инициализация порта D
//PD1-2 выход,уровень 0
//PD4-6 вход,подтягивающие резисторы включены
PORTD=0x70; //установка битов порта D в 0 или 1
DDRD=0x06; //установка порта D на in или out
while(1){
if (PIND6==0){ //если кнопка S0(см.схему) нажата
OnBit(PORTD,2); //включить поворот (RUN)
OffBit(PORTD,1); //реверс не включать
} //цикл выполняется пока действительно условие
if (PIND4==0){ //если кнопка S2 нажата
OnBit(PORTD,2); //включить поворот
OnBit(PORTD,1); //включить реверс(REV)
}
}
}
make: *** Нет правила для сборки цели `Makefile'. Останов.