Ich verwende RGB-LED-Streifen, um Bits anzuzeigen (1 Pixel – 1 Bit, wie ich herausgefunden habe). Es ist sehr praktisch).
Der gesamte Code lautet:
Code: Select all
#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;
}
Wie Sie sehen können, verwende ich PB4 nur für LED... PB0-3 sind frei (überhaupt nicht verbunden)
Ich freue mich über jede Idee oder jeden Tipp, ty.