-
Notifications
You must be signed in to change notification settings - Fork 0
/
led8.c
89 lines (76 loc) · 1.86 KB
/
led8.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* main.c
*
* Created on: 31 авг. 2015 г.
* Author: garik
*
*
*
* PD0...PD7 - светодиоды, на vcc
* PC0 - кнопка, на gnd
*
*
*
*
*
*
*
* Бегущий огонь. 5 светодиодов
*
*
*/
#include <avr/io.h>
#include <util/delay.h> // подключаем библиотеку задержки
#include <avr/interrupt.h> // подключаем библиотеку прерываний
#include <stdlib.h>
#define T_POLL 100
int main(void) {
unsigned char upDown=1; // начинаем с движения вверх
unsigned char cylon=0; // определяет очередность LED
//unsigned char Arnd;
DDRD = 0xFF; // устанавливаем порт D с 0 по 7 как выхода
DDRC &= ~(1 << DDC0); // Clear the PC0 pin
//PC0 (INT0 pin) is now an input
PORTD = 0xff;
/////*значение для счетного регистра*//
TCCR0 = 0;
TCCR0 = (0<<WGM11)|(0<<WGM10);
TCNT0 = T_POLL;
TIFR = (1<<TOV0);
TIMSK |= (1<<TOIE0);
TCCR0 |= (1<<CS02)|(0<<CS01)|(1<<CS00);
///////////////////////////////////////
void loop() {
if(upDown==1){ // если идем вверх, то
cylon++;
if(cylon>=7) upDown=0; // когда достигнут наибольший номер LED, то в след. цикле идем вниз
}
else {
cylon--;
if(cylon==0) upDown=1; // когда достигнут наименьший номер LED, то в след. цикле идем вверх
}
PORTD = ~(1 << cylon); //сдвиг
_delay_ms(133); // пауза 133 мс (133*8 ~ 1000ms = 1s)
}
/*
void A_rand(){
Arnd=rand() % 5;
}
*/
sei(); //разрешаем прерывания
while (1){ //бесконечный цикл
loop();
}
}
ISR(TIMER0_OVF_vect) //обработчик прерывания
{
/*перезапись счетного регистра*/
TCNT0 = T_POLL;
/*опрос кнопки*/
if (bit_is_clear(PINC,PC0)) // если кнопка нажата (подключена к vcc, замыкается на gnd)
{
PORTD &= (~(1<<7)); //зажигаем
_delay_ms(5);
PORTD |= (1<<7); //гасим
}
}