Я использую светодиодную ленту RGB для обозначения битов (я обнаружил, что 1 пиксель — 1 бит). это очень удобно).
Весь код:
Код: Выделить всё
#define F_CPU 8388608UL // 8MH
#include
#include
#define LED PB4
void setBitHigh(short int pin) {
PORTB |= _BV(pin); // 1 tactDuration = 125*10-9sec
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
}
void setBitLow(short int pin) {
PORTB |= _BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void trueByte(short int pin, short int intensity) {
for (int i = 7; i >= 0; i--) {
intensity & _BV(i) ? setBitHigh(pin) : setBitLow(pin);
}
}
void falseByte(short int pin) {
for (int i = 0; i < 8; i++) {
setBitLow(pin);
}
}
void setPixel(short int pin, short int r, short int g, short int b) {
g > 0 ? trueByte(pin, g) : falseByte(pin);
r > 0 ? trueByte(pin, r) : falseByte(pin);
b > 0 ? trueByte(pin, b) : falseByte(pin);
}
void indicate(int data) {
int tmp = data;
for (int i = 0; i < 8; i++) {
int intensity = (tmp & _BV(i)) > 0 ? 10 : 0;
setPixel(LED, intensity, 0, 0);
}
}
void blink(short int times) {
for (short int i = 0; i < times; i++) {
indicate(255);
_delay_ms(200);
indicate(0);
_delay_ms(200);
}
}
int main() {
DDRB = 0x00 | _BV(LED);
PORTB = 0x00;
_delay_ms(1000);
blink(3);
_delay_ms(1000);
while(true) {
indicate(PINB);
_delay_ms(50);
}
return 0;
}
Как видите, я использую PB4 только для светодиодов... PB0-3 свободны (не подключены вообще)
Буду рад любым идеям и советам, ти.
Подробнее здесь: https://stackoverflow.com/questions/777 ... y-blinking