Beispiel #1
0
/*
 * Write to LCD in 4 bit mode. 
 * Set cmd to 1 for data and 0 for commands.
 */
void lcd_write(unsigned char cmd, unsigned char ch)
{
	if(cmd) {
		SET_RS;
	} else {
		UNSET_RS;
	}

	UNSET_E;
	UNSET_DATA;
	while(lcd_status() == 1);

	_delay_us(100);
	PORTC|= (ch & 0xF0); /* Insert upper nibble */
	SET_E;
	UNSET_E;

	UNSET_DATA;
	while(lcd_status() == 1);

	_delay_us(100);
	PORTC|=(ch & 0x0F) << 4; /* Insert lower nibble */
	SET_E;
	UNSET_E;
}
Beispiel #2
0
void filename_ticker() {
  static uint32_t wait_for = 0;
  char* ticker_string;

  if (g_ticker_enabled) {
    if (wait_for++ < (SPINNER_RATE*2)) {
      return;
    }
    wait_for = 0;

    if (g_ticker_hold) {
      g_ticker_hold--;
      return;
    }

    g_ticker_index++;
    ticker_string = g_ticker_file_info->lfname[0] ? g_ticker_file_info->lfname : g_ticker_file_info->fname;
    if ((strlen(ticker_string) - g_ticker_index) < (MAX_LCD_LINE_LEN - 1)) {
      if (g_ticker_end_hold) {
        g_ticker_index--;
        g_ticker_end_hold--;
        return;
      }

      g_ticker_index = 0;
      g_ticker_hold = g_ticker_end_hold = TICKER_HOLD;
    }
    lcd_status(&ticker_string[g_ticker_index]);
    if (g_ticker_file_info->fattrib & AM_DIR) {
      lcd_show_dir();
    }  
  }
}
Beispiel #3
0
uint8_t handle_option_value(const char* poption, uint16_t* pcur_value, uint16_t min_value, uint16_t max_value, uint16_t step_value) {
  char buffer[MAX_LCD_LINE_LEN + 1];
  int32_t cur_value = *pcur_value;
  if (cur_value < min_value || cur_value > max_value) {
    cur_value = min_value;
  }
  lcd_title_P(poption);
  
  utoa((uint16_t)cur_value, buffer, 10);
  lcd_status(buffer);
  
  while (1) {
    switch(get_cur_command()) {
      case COMMAND_SELECT:
        *pcur_value = (uint16_t) cur_value;
        return 1;
      break;
      case COMMAND_ABORT:
        return 0;
      break;
      case COMMAND_NEXT:
        cur_value += step_value;
        if (cur_value > max_value) {
          cur_value = max_value;
        }
        utoa((uint16_t)cur_value, buffer, 10);
        lcd_status(buffer);
      break;
      case COMMAND_PREVIOUS:
        cur_value -= step_value;
        if (cur_value < min_value) {
          cur_value = min_value;
        }
        utoa((uint16_t)cur_value, buffer, 10);
        lcd_status(buffer);
      break;
    }
  }
}
Beispiel #4
0
void display_filename(FILINFO* pfile_info) {
  char* ticker_string;
  
  g_ticker_file_info = pfile_info;
  ticker_string = g_ticker_file_info->lfname[0] ? g_ticker_file_info->lfname : g_ticker_file_info->fname;
  lcd_status(ticker_string);
  if (g_ticker_file_info->fattrib & AM_DIR) {
    lcd_show_dir();
  }  
  g_ticker_index = 0;
  g_ticker_hold = TICKER_HOLD;
  g_ticker_enabled = strlen(ticker_string) > (MAX_LCD_LINE_LEN - 1);
}
Beispiel #5
0
uint8_t lcd_write(unsigned char chr, enum lcd_rs_t rs, uint8_t timeout) {
    unsigned char status;
    do {
        status = lcd_status();
    } while(lcd_is_busy(status) && timeout--);
    if(lcd_is_busy(status)) {
        lcd_info_set_write_timeout();
        return 0;
    }
    lcd_tris_set(0x00);
    lcd_en_pin = LCD_EN_LOW;
    lcd_rs_pin = rs;
    lcd_rw_pin = LCD_RW_WRITE;
    lcd_send_nibble(chr >> 4);
    lcd_send_nibble(chr);
    return 1;
}
Beispiel #6
0
uint8_t handle_manual_filename(FILINFO* pfile_info) {
  uint8_t cur_char_pos = 0;
  uint8_t cursor_pos = 0;
  uint8_t max_chars = strlen_P(S_FILENAME_CHARS);
  uint8_t cur_char = 0;
  lcd_title_P(S_ENTER_FILENAME);
  lcd_status("");
  lcd_cursor();
  lcd_setCursor(0, 1);
  
  // start with a nicely terminated string!
  memset(pfile_info->lfname, 0, pfile_info->lfsize);
  
  while (1) {
    switch(get_cur_command()) {
      case COMMAND_SELECT:
        if (cursor_pos < (MAX_LCD_LINE_LEN - 1)) {
          cur_char = pgm_read_byte(S_FILENAME_CHARS + cur_char_pos);
          pfile_info->lfname[cursor_pos] = cur_char;        
          cursor_pos++;
          lcd_setCursor(cursor_pos, 1);
          cur_char_pos = 0;
        }
      break;
      case COMMAND_SELECT_LONG:
        strcat(pfile_info->lfname, ".tap");
        lcd_noCursor();
        // exit to previous menu, with accept
        return 1;
      break;
      case COMMAND_ABORT:
        if (cursor_pos != 0) {
          pfile_info->lfname[cursor_pos] = 0;
          lcd_setCursor(cursor_pos, 1);
          lcd_write(' ');
          cursor_pos--;
          lcd_setCursor(cursor_pos, 1);
          cur_char_pos = 0;
          cur_char = pfile_info->lfname[cursor_pos];
          while (pgm_read_byte(S_FILENAME_CHARS + cur_char_pos) != cur_char) {
            cur_char_pos++;
          }
        }
      break;
      case COMMAND_ABORT_LONG:
        lcd_title_P(S_OPERATION_ABORTED);
        lcd_noCursor();
        lcd_busy_spinner();
        // exit to previous menu, with cancel
        return 0;
      break;
      case COMMAND_NEXT:
        cur_char_pos = (cur_char_pos + 1) % max_chars;
        cur_char = pgm_read_byte(S_FILENAME_CHARS + cur_char_pos);
        lcd_write(cur_char);
        lcd_setCursor(cursor_pos, 1);
        pfile_info->lfname[cursor_pos] = cur_char;
      break;
      case COMMAND_PREVIOUS: 
        if (cur_char_pos == 0) {
          cur_char_pos = max_chars;
        }
        cur_char_pos--;
        cur_char = pgm_read_byte(S_FILENAME_CHARS + cur_char_pos);
        lcd_write(cur_char);
        lcd_setCursor(cursor_pos, 1);
        pfile_info->lfname[cursor_pos] = cur_char;
      break;
    }    
  }
}