Hallo,
hier ist einmal ein Code mit dem man die LEDs abfragen kann:
Code:
while(1){
if(led[0]==0){
PORTA |= (1<<PA0);
PORTB &=~ (1<<PB0);
}
if(led[1]==0){
PORTA |= (1<<PA1);
PORTB &=~ (1<<PB1);
}
if(led[2]==0){
PORTA |= (1<<PA2);
PORTB &=~ (1<<PB2);
}
if(led[3]==0){
PORTA |= (1<<PA3);
PORTB &=~ (1<<PB3);
}
if(led[4]==0){
PORTA |= (1<<PA4);
PORTB &=~ (1<<PB4);
}
if(led[5]==0){
PORTA |= (1<<PA5);
PORTB &=~ (1<<PB5);
}
if(led[6]==0){
PORTA |= (1<<PA6);
PORTB &=~ (1<<PB6);
}
if(led[7]==0){
PORTA |= (1<<PA7);
PORTB &=~ (1<<PB7);
}
if(led[8]==0){
PORTC |= (1<<PC7);
PORTD &=~ (1<<PD5);
}
_delay_us(10);
if(led[0]==0){
DDRA &=~ (1<<PA0);
PORTA &=~ (1<<PA0);
}
if(led[1]==0){
DDRA &=~ (1<<PA1);
PORTA &=~ (1<<PA1);
}
if(led[2]==0){
DDRA &=~ (1<<PA2);
PORTA &=~ (1<<PA2);
}
if(led[3]==0){
DDRA &=~ (1<<PA3);
PORTA &=~ (1<<PA3);
}
if(led[4]==0){
DDRA &=~ (1<<PA4);
PORTA &=~ (1<<PA4);
}
if(led[5]==0){
DDRA &=~ (1<<PA5);
PORTA &=~ (1<<PA5);
}
if(led[6]==0){
DDRA &=~ (1<<PA6);
PORTA &=~ (1<<PA6);
}
if(led[7]==0){
DDRA &=~ (1<<PA7);
PORTA &=~ (1<<PA7);
}
if(led[8]==0){
DDRC &=~ (1<<PC7);
PORTC &=~ (1<<PC7);
}
_delay_ms(k-75);
a[2] = (PINA & (1<<PINA2));
a[3] = (PINA & (1<<PINA3));
a[5] = (PINA & (1<<PINA5));
_delay_ms(10);
a[4] = (PINA & (1<<PINA4));
_delay_ms(65);
a[0] = (PINA & (1<<PINA0));
a[1] = (PINA & (1<<PINA1));
a[6] = (PINA & (1<<PINA6));
a[7] = (PINA & (1<<PINA7));
a[8] = (PINC & (1<<PINC7));
DDRA = 0xFF;
DDRC = 0xFF;
if((a[0]!=0)){
if(c_flag){
PORTB |= (1<<PB0);
c_flag = 0;
c[0]=0;
}
else{
PORTC |= (1<<PC6);
c_flag = 1;
c[0]=1;
}
led[0]=1;
_delay_ms(120);
}
if(a[1]!=0){
if(c_flag){
PORTB |= (1<<PB1);
c_flag = 0;
c[1]=0;
}
else{
PORTC |= (1<<PC5);
c_flag = 1;
c[1]=1;
}
led[1]=1;
_delay_ms(120);
}
if(a[2]!=0){
if(c_flag){
PORTB |= (1<<PB2);
c_flag = 0;
c[2]=0;
}
else{
PORTC |= (1<<PC4);
c_flag = 1;
c[2]=1;
}
led[2]=1;
_delay_ms(120);
}
if(a[3]!=0){
if(c_flag){
PORTB |= (1<<PB3);
c_flag = 0;
c[3]=0;
}
else{
PORTC |= (1<<PC3);
c_flag = 1;
c[3]=1;
}
led[3]=1;
_delay_ms(120);
}
if(a[4]!=0){
if(c_flag){
PORTB |= (1<<PB4);
c_flag = 0;
c[4]=0;
}
else{
PORTC |= (1<<PC2);
c_flag = 1;
c[4]=1;
}
led[4]=1;
_delay_ms(120);
}
if(a[5]!=0){
if(c_flag){
PORTB |= (1<<PB5);
c_flag = 0;
c[5]=0;
}
else{
PORTC |= (1<<PC1);
c_flag = 1;
c[5]=1;
}
led[5]=1;
_delay_ms(120);
}
if(a[6]!=0){
if(c_flag){
PORTB |= (1<<PB6);
c_flag = 0;
c[6]=0;
}
else{
PORTC |= (1<<PC0);
c_flag = 1;
c[6]=1;
}
led[6]=1;
_delay_ms(120);
}
if(a[7]!=0){
if(c_flag){
PORTB |= (1<<PB7);
c_flag = 0;
c[7]=0;
}
else{
PORTD |= (1<<PD7);
c_flag = 1;
c[7]=1;
}
led[7]=1;
_delay_ms(120);
}
if(a[8]!=0){
if(c_flag){
PORTD |= (1<<PD5);
c_flag = 0;
c[8]=0;
}
else{
PORTD |= (1<<PD6);
c_flag = 1;
c[8]=1;
}
led[8]=1;
_delay_ms(120);
}
if_win();
}
}
man muss am Anfang noch led[9],c[9],a[9] und c_flag declarieren. Die ganze abfrage mit "if(led[0]==0){...} braucht man, damit bereits angetippte LEDs nicht mehr aus gehen. An PORTA liegen übrigens die Kathoden und an PORTB und PORTC die Anoden. if_win() ist eine Funktion die nachguckt ob schon jemand gewonnen hat.
Der erste Link in meinem ersten Posting enthält eine gute Erklärung in C, man muss die Abfrage nur noch umkehren und vielleicht mit einer kleinen Funktion die Umgebungshelligkeit abfragen, so wie hier zum Beispiel:
Code:
unsigned char led_abfrage (unsigned char zeit) {
PORTA |= (1<<PA1);
PORTB &=~ (1<<PB1);
_delay_us(10);
DDRA &=~ (1<<PA1);
PORTA &=~ (1<<PA1);
_delay_ms(zeit);
DDRA |= (1<<PA1);
return (PINA & (1<<PINA1));
}
void init (void){
while(led_abfrage(k))if(k++>=175)break;
k=k+80;
USART_Transmit(k);
}
Später addiere ich zu k nochmal 80, weil ich Festgestellt
Hier sind noch ein paar Links zum Thema "LED als Sensor", viele Leider auf Englisch:
http://forums.linear1.org/index.php?...pic,445.0.html
http://forums.linear1.org/index.php/topic,469.0.html
http://www.mikrocontroller.net/topic/56759
http://blog.makezine.com/archive/200...ch_sensor.html
http://cs.nyu.edu/~jhan/ledtouch/index.html
http://www.merl.com/publications/TR2003-035/ <- Das ist der Technische Bericht
http://projects.dimension-x.net/tech...cts/ledsensors
@TomEdl
Find ich ne gut Idee, vielleicht mag ja auch noch jemand ein Beispiel Programm für eine LED in Assembler schreiben und hier posten.
KR-500
Lesezeichen