płytka ewaluacyjna MIDI - 4021b

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Jimi Hendrix
-
Posty: 12
Rejestracja: 29 lip 2005, 18:33
Lokalizacja: Poznań

płytka ewaluacyjna MIDI - 4021b

Post autor: Jimi Hendrix » 06 kwie 2007, 23:07

Witam, ostatnio stałem się szczęśliwym posiadaczem płytki ewaluacyjnej midi, opisywanej niegdyś w EP. Oryginalny program, do obsługi klawiatury dla każdej oktawy zbudowanej w oparciu o "static 8-bit shift register", wysyłającej po naciśnięciu komunikaty midi, został napisany w języku C, którego nienawidzę. Interesuje mnie tylko i wyłącznie bascom, ewent. ASM. Do rzeczy. Program skanuje klawiaturę, wysyłą note on i zapisuje numer klawisza do tablicy naciśniętego, gdy zostanie on wyciśnięty wysyła note off i usuwa go z tablicy. Jak obsłużyć sam odczyt z układów 4021b w bascomie? Fragment kodu w C, napisany przez pana Rafała Baranowskiego wygląda tak:

Kod: Zaznacz cały

void keyb_check(void)
{
	uint8_t i, j, key;
	
	shift_reg_load();
		
	key=7;
	
	for (i=0; i < keyb_len; i++)
	{
		for (j=0; j<8; j++)
		{
			if bit_is_clear(KEYB_I, KEYB_DTA)
				keyb_state[key/8] |= _BV(key % 8);
			else
				keyb_state[key/8] &= ~_BV(key % 8);
			
			shift_reg_clock(1);
			key--;
		}
		
		shift_reg_clock(4);
		
		key+=12;
		
		for (j=0; j<4; j++)
		{
			if bit_is_clear(KEYB_I, KEYB_DTA)
				keyb_state[key/8] |= _BV(key % 8);
			else
				keyb_state[key/8] &= ~_BV(key % 8);
			
			shift_reg_clock(1);
			key--;
		}
		
		key+=12;
	}
}


// ************************************************************************************
// Generates 'count' clock signals for the keyboard shift register
void shift_reg_clock(uint8_t count)
{
	while (count--)
	{
		set_keyb_clk();
		few_us_delay();
		reset_keyb_clk();
		few_us_delay();
	}
}


// ************************************************************************************
// Generates a load signal for the keyboard shift register
void shift_reg_load(void)
{
	KEYB_O &= ~(_BV(KEYB_LD) | _BV(KEYB_CLK));
	few_us_delay();
	set_keyb_ld();
	few_us_delay();
	set_keyb_clk();
	few_us_delay();
	reset_keyb_ld();
	reset_keyb_clk();
	few_us_delay();
}
Pozdrawiam

ODPOWIEDZ