RX62N 用FM音源プログラム -- TGRX62N (5)
フル機能版の TGRX62N プログラムを (→こちら) に置きました。
ATtiny2313 版の LCD インターフェースもうまく動作しました。
回路図およびプログラムを下に示します。
/******************************************************/ /* lcd4avr: 4-bit mode character LCD and keySW I/F */ /* using UART (62.5 kbps) to HOST */ /* for Atmel ATtiny2313 */ /* */ /* 2011-Apr-22: created by pcm1723 */ /* */ /* CLOCK FREQUENCY: 1 MHz (internal RC osc 8 MHz / 8) */ /* */ /* INPUT: */ /* PD0/RXD (Pin 2) -- connect to HOST TxD (CN2-29) */ /* */ /* PD2 (Pin 6) -- connect to SW "INC" */ /* PD3 (Pin 7) -- connect to SW "DEC" */ /* PD4 (Pin 8) -- connect to SW "SHIFT" */ /* */ /* OUTPUT: */ /* PB3 (Pin 15) -- connect to LCD DB7 (Pin 14) */ /* PB2 (Pin 14) -- connect to LCD DB6 (Pin 13) */ /* PB1 (Pin 13) -- connect to LCD DB5 (Pin 12) */ /* PB0 (Pin 12) -- connect to LCD DB4 (Pin 11) */ /* */ /* PB4 (Pin 16) -- connect to LCD RS (Pin 4) */ /* */ /* PD6 (Pin 11) -- connect to LCD E (Pin 6) */ /* */ /* PD1/TXD (Pin 3) -- connect to HOST RxD (CN2-30) */ /******************************************************/ #include <avr/io.h> #include <avr/fuse.h> // enable followings if your ISP writer supports fuse section #if (0) FUSES = { .low = LFUSE_DEFAULT, .high = HFUSE_DEFAULT, .extended = EFUSE_DEFAULT, }; #endif void port_setup( void ) { PORTD = ~(_BV(PORTD6)); // PD6 = O, PD7, PD5..PD9 = pullup DDRD = _BV(PORTD6); // PD6 = output, other = input PORTB = ~(0x1f); // PB7..PB5 = pullup DDRB = 0x1f; // PB4..PB0 = output } // void port_setup() void uart_setup( void ) { UBRRH = 0; UBRRL = (1 - 1); // Baud = 1 [MHz] / (16 * 1) = 62.5 [kbps] UCSRA = 0; // no double speed, no MP mode UCSRC = (_BV(UCSZ1) | _BV(UCSZ0)); // async, format="8N1" UCSRB = _BV(RXEN) // rceiver enable | _BV(TXEN); // transmitter enable } // void uart_setup() int main() { port_setup(); uart_setup(); for (;;) { // infinite loop while (!(_BV(RXC) & UCSRA)) {} // Rx ready? PORTB = UDR; // output Rx data to LCD UDR = (0xF0 | (PIND >> 2)); // xmit SW status [PD5:PD2] in [b3:b0] of Tx data PORTD |= _BV(PORTD6); // LCD E (PD6) = '1' while (!(_BV(TXC) & UCSRA)) {} // Tx complete? UCSRA |= _BV(TXC); // clear TXC flag PORTD &= ~(_BV(PORTD6)); // LCD E (PD6) = '0' } // for (;;) return(0); } // int main()