From Max-P, 2 Years ago, written in C.
This paste will shuffle off the mortal coil in 1 Second.
Embed
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. void uart_init(void) {
  5.         // Set baud rate
  6.         UBRR0H = 0;
  7.         UBRR0L = 103;
  8.        
  9.         // Don't use 2X
  10.         UCSR0A &= ~(_BV(U2X0));
  11.        
  12.         // Enable RX and TX
  13.         UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
  14.         UCSR0B = _BV(RXEN0) | _BV(TXEN0);
  15. }
  16.  
  17. void uart_putchar(char c) {
  18.         loop_until_bit_is_set(UCSR0A, UDRE0);
  19.         UDR0 = c;
  20. }
  21.  
  22. char uart_getchar(void) {
  23.         loop_until_bit_is_set(UCSR0A, RXC0);
  24.         return UDR0;
  25. }
  26.  
  27. void uart_print(char* str) {
  28.         while(*str != 0) {
  29.                 uart_putchar(*str);
  30.                 _delay_ms(20);
  31.                 str++;
  32.         }
  33. }
  34.  
  35. void uart_println(char* str) {
  36.         uart_print(str);
  37.         uart_putchar('\r');
  38.         uart_putchar('\n');
  39. }
  40.  
  41. void main(void) {
  42.         char nes_input;
  43.        
  44.         uart_init();
  45.         // Latch = PB2 = Pin 10
  46.         // Pulse = PB1 = Pin 9
  47.         // Data  = PB0 = Pin 8
  48.         DDRB  = 0b00100110;
  49.         PORTB = 0b00000001;
  50.        
  51.         for(;;) {
  52.                 _delay_ms(50);
  53.                
  54.                 nes_input = 0;
  55.                 PORTB = 0b00100101;
  56.                 _delay_us(12);
  57.                
  58.                 for(char i = 0; i < 8; i++) {
  59.                         PORTB = 0b00100011;
  60.                         _delay_us(6);
  61.                         nes_input <<= 1;
  62.                         nes_input |= PINB & 1;
  63.                         PORTB = 0b00000001;
  64.                         _delay_us(6);
  65.                 }
  66.                
  67.                 uart_putchar(nes_input ^ 0b11111111);
  68.         }
  69. }
  70.