-
Notifications
You must be signed in to change notification settings - Fork 0
/
led.c
70 lines (60 loc) · 994 Bytes
/
led.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
#include "led.h"
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
static volatile uint8_t * ports[2] =
{
&PORTD,
&PORTB
};
static volatile uint8_t pin[14] =
{
DDD0,
DDD1,
DDD2,
DDD3,
DDD4,
DDD5,
DDD6,
DDD7,
DDB0,
DDB1,
DDB2,
DDB3,
DDB4,
DDB5
};
Led * led_create (int numPort, char isOn)
{
Led * led = (Led *) malloc (sizeof(Led));
led->port = ports[numPort / 8];
led->ddr_port = led->port - 1;
*(led->ddr_port) |= _BV (pin[numPort]);
led->pin = pin[numPort];
led->isOn = isOn;
if (isOn)
led_on (led);
else
led_off (led);
return led;
}
void led_on (Led * myLed)
{
*(myLed->port) |= _BV (myLed->pin);
}
void led_off (Led * myLed)
{
*(myLed->port) &= ~_BV (myLed->pin);
}
void led_toggle (Led * myLed)
{
myLed->isOn = (myLed->isOn)? 0: 1;
if (myLed->isOn)
led_on (myLed);
else
led_off (myLed);
}
void led_destroy (Led * myLed)
{
free (myLed);
}