/* * 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; }
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(); } } }
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; } } }
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); }
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; }
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; } } }