Tym razem próbuję się uporać z klawiaturą PC i oczywiście nie mogę sobie z tym poradzić, więc proszę Was o pomoc, oto kod:
Pod portb podłączone są 2 diody. Klawiatura jest jakby martwa. Nie wiem co robię źle, pewnie większość...
#define F_CPU 1000000L
#define KCBIT PIND&_BV(6)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char kdata=0, krecive=0, kbit=0, init=0;
SIGNAL(INT1_vect)
{
PORTB^=_BV(2);
if(init)
{//ciąg dalszy f4
if((0xf4&_BV(kbit))&&(kbit<8)) PORTD|=_BV(6); else PORTB&=~_BV(6);
if(kbit==8) PORTD|=_BV(6);
if(kbit==9)
{
DDRD&=~_BV(6);
PORTD|=_BV(6);
kbit=0;
init=0;
}else kbit+=1;
}
else
{//to ma odbierać dane
switch(kbit)
{
case 0:
kdata=0;
case 1:
if(KCBIT) kdata|=_BV(0);
case 2:
if(KCBIT) kdata|=_BV(1);
case 3:
if(KCBIT) kdata|=_BV(2);
case 4:
if(KCBIT) kdata|=_BV(3);
case 5:
if(KCBIT) kdata|=_BV(4);
case 6:
if(KCBIT) kdata|=_BV(5);
case 7:
if(KCBIT) kdata|=_BV(6);
case 8:
if(KCBIT) kdata|=_BV(7);
case 9:
break;
case 10:
krecive=1;
break;
}
if(!krecive) kbit+=1;
}
}
void keyboard_init()
{
//rozpoczynanie wysyłanie f4
DDRD|=_BV(3);//clock
DDRD|=_BV(6);//data
PORTD|=_BV(3);
PORTD|=_BV(6);
PORTD&=~_BV(3);
_delay_us(62);
PORTD&=~_BV(6);
PORTD|=_BV(3);//tu powinien startować sygnał klawiatury
GIMSK |= (1 << INT1); // zezwolenie na przerwanie INT1
MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
DDRD&=~_BV(3);
PORTD|=_BV(3);
sei();
init=1;
}
unsigned char getkey()
{
while(!krecive);
krecive=0;
kbit=0;
return kdata;
}
int main(void)
{
int a;
DDRB=0xff;
for(a=0; a<1000; a+=1) _delay_ms(1);
keyboard_init();
for(;;)
{
if(getkey==0x30) PORTB^=_BV(1);
}
}
Pod portb podłączone są 2 diody. Klawiatura jest jakby martwa. Nie wiem co robię źle, pewnie większość...