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()