📄 display.c
字号:
if (current_control == CONTROL5) font = 33; // bold else font = 32; // normal display_line = '$'; break; case PARAM_BASS: lcd_navigation(0, 5, "Ba:", CONTROL6); if (current_control == CONTROL6) font = 33; // bold else font = 32; // normal display_line = '%'; break; default: return; } bar_position = (param_value[param] + STA013_MAX_TONE - STA013_PARAM_CENTRE); // adjust to within the 21 chars available (range is -12 <-> +12 ie 25 units) if (bar_position < 2) { bar_position = 0; } else if (bar_position > 21) { bar_position = 20; } else { bar_position -= 2; } printf("\\[\\C%c\\B#%c----------%c----------\\B%c%c\\C!\\w\\C \\]\r\n", (char) font, (char) display_line, (char) 247, (char) (' ' + 3 + bar_position), (char) display_line);}//--------------------------------------------------------------------//// lcd_volume_set_db//// Displays a volume db at the specified coordinates.//void lcd_volume_set_db(){ xdata unsigned char attn; attn = param_value[PARAM_ATTN] - STA013_PARAM_CENTRE + tone_attn; if(attn==0) { print("\\L'\\[\\B%' 0 dB\\]\r\n"); } else { printf("\\L'\\[\\B%%'-%2d dB\\]\r\n",attn); } lcd_navigation(0, 7,"Vol: ",CONTROL0);}//--------------------------------------------------------------------//// lcd_change_menu//// Clears display and displays the initial data// for the current screen. Increments current screen// if action==1;//void lcd_change_menu(unsigned char action){ // Some sanity checks if(action==1) { if((++current_screen) > SCREEN_MAX) { current_screen=MAINSCREEN; current_control = CONTROL0; } } if (lcd_version != LCD_VERSION_BETA) { // display updates off print("\\I:"); } // Clear display print("\\@ 0"); switch(current_screen) { case MAINSCREEN: lcd_update_top_line(); lcd_display_filename(); lcd_display_playlistname(); lcd_screen_dynamic(1); break; case AUDIOSCREEN: lcd_update_top_line(); lcd_update_2nd_line(1); lcd_update_3rd_line(1); lcd_screen_dynamic(1); break; case TREEDIRSCREEN: lcd_screen_dynamic(1); break; case EPARAMSCREEN: lcd_screen_dynamic(1); break; default: break; } if (lcd_version != LCD_VERSION_BETA) { // redraw whole display & display updates on print("\\I8\\I9"); }}//--------------------------------------------------------------------// update and restart the backlight timer back upon the parameter// settingvoid lcd_update_backlight_timer(){ switch(param_value[PARAM_BACKLIGHT_TIMEOUT]) { case 0: // Never print("\\J20\\J00"); break; case 1: // Always on print("\\J21\\J01"); break; default: // TODO : need to implement timer break; }}//--------------------------------------------------------------------void lcd_setup(void){ print("lcd:"); lcd_set_scroll_speed(); parse_event_setup(); lcd_update_backlight_timer(); // setup navigation current_screen = MAINSCREEN; current_control = CONTROL0; // ask display for version lcd_version = LCD_VERSION_BETA; print("\\E\r\n"); string_init(filebuf, ' ', FILEBUF_MAX); string_init(fdisplaybuf, ' ', DISPLAY_WIDTH + 1); string_init(playbuf, ' ', FILEBUF_MAX); string_init(pdisplaybuf, ' ', DISPLAY_WIDTH + 1); pxscroll = 0; playbuf_len = 0; pxwrap = 0; fxscroll = 0; filebuf_len = 0; fxwrap = 0; current_filename = 0; current_playlistname = 0;}//--------------------------------------------------------------------void lcd_screen_dynamic(const unsigned char refresh)//// lcd_screen_dynamic//// Update dynamic data.//{ static xdata unsigned int last_bitrate = 0; static xdata unsigned char last_freq = 0; static xdata unsigned char last_mode = 0; switch(current_screen) { case MAINSCREEN: // Now this bit should only update the screen if it "has to." IE if an item has changed or if // we're doing a screen refresh. -ZSB 18-Aug-2001 2:29 PM playback.mode_known = 0; // force update_playback_params to reget the info for the new bitrate (if applicable) update_playback_parms(); // This should get any new bitrate for VBR's // Is there any way to tell if an MP3 is VBR or not? If so, we could skip calling this for CBR files. if (playback.mode_known) { // On a refresh or change, we send out the whole thing if(refresh || last_bitrate != playback.bitrate || last_freq != playback.freq || last_mode != playback.mode[0]) { last_bitrate = playback.bitrate; last_mode = playback.mode[0]; last_freq = playback.freq; printf("\\[\\B &%3d kbps %2d kHz %s\\]", last_bitrate, playback.freq, playback.mode); } } else { // We'll always display blanks, regardless of the // bitrate settings if things are undefined. // Just to make sure we clear the screen quickly.... print("\\[\\B & kbps kHz \\]"); last_bitrate = 0; last_freq = 0; last_mode = 0; } if (refresh) { lcd_display_id3_struct(); lcd_volume_set_db(); } lcd_update_time(); break; case AUDIOSCREEN: if (refresh) { lcd_bar_set(PARAM_TREBLE); lcd_bar_set(PARAM_BASS); lcd_volume_set_db(); } lcd_update_time(); break; case TREEDIRSCREEN: if (refresh) { if (lcd_version == LCD_VERSION_1) { print("\\B \\[ MP3 Player Tree List \\]"); treedir_display(); } else { print("\\B $\\[ Tree List Screen is \\]" "\\B %\\[ not supported on \\]" "\\B &\\[ beta displays. \\]"); } } break; case EPARAMSCREEN: if (refresh) { if (lcd_version == LCD_VERSION_1) { print("\\B \\[MP3 Player Configuration\\]"); eparam_display(); } else { print("\\B $\\[ Configuration Screen \\]" "\\B %\\[is not supported on beta\\]" "\\B &\\[ displays \\]"); } } break; default: break; }}//--------------------------------------------------------------------void lcd_change(param_t parm){ switch (parm) { case PARAM_ATTN: lcd_volume_set_db(); break; case PARAM_TREBLE: // changes to the treble setting can change the volume lcd_bar_set(PARAM_TREBLE); lcd_volume_set_db(); break; case PARAM_BASS: // changes to the bass setting can change the volume lcd_bar_set(PARAM_BASS); lcd_volume_set_db(); break; case PARAM_PLAY_MODE: lcd_update_top_line(); break; default: printf("Unknown LCD change event: %d\n", parm); }}//--------------------------------------------------------------------// Main Screen navigation event handler//void user_action_screen1(event_t event){ static code up_control[CONTROL_MAX+1] = { CONTROL4, CONTROL0, CONTROL0, CONTROL1, CONTROL3, CONTROL5, CONTROL6, CONTROL7, CONTROL8, CONTROL9}; static code down_control[CONTROL_MAX+1] = { CONTROL1, CONTROL3, CONTROL3, CONTROL4, CONTROL0, CONTROL5, CONTROL6, CONTROL7, CONTROL8, CONTROL9}; switch(event) { case E_RIGHT: if (current_control == CONTROL4) { current_control = CONTROL0; } else { current_control++; } lcd_change_menu(0); break; case E_LEFT: if (current_control == CONTROL0) { current_control = CONTROL4; } else { current_control--; } lcd_change_menu(0); break; case E_UP: current_control = up_control[current_control]; lcd_change_menu(0); break; case E_DOWN: current_control = down_control[current_control]; lcd_change_menu(0); break; case E_INC: switch(current_control) { case CONTROL0: // Volume action_vol_up(); break; case CONTROL1: // Play/Pause put_back_event(E_PLAY_PAUSE); break; case CONTROL2: // Normal/Random random_mode_next(); lcd_update_top_line(); break; case CONTROL3: // Filename put_back_event(E_NEXT); break; case CONTROL4: // Directory/Playlist put_back_event(E_NEXT_LIST); break; default: break; } break; case E_DEC: switch(current_control) { case CONTROL0: // Volume action_vol_down(); break; case CONTROL1: // Play/Pause put_back_event(E_PLAY_PAUSE); break; case CONTROL2: // Normal/Random random_mode_prev(); lcd_update_top_line(); break; case CONTROL3: // Filename put_back_event(E_PREV); break; case CONTROL4: // Directory/Playlist put_back_event(E_PREV_LIST); break; default: break; } break; default: printf("Unsupported event %d\r\n", event); break; }}//--------------------------------------------------------------------// Audio screen navigation event handler//void user_action_screen2(event_t event){ static code up_control[CONTROL_MAX+1] = { CONTROL6, CONTROL0, CONTROL0, CONTROL1, CONTROL3, CONTROL4, CONTROL5, CONTROL6, CONTROL7, CONTROL9}; static code down_control[CONTROL_MAX+1] = { CONTROL1, CONTROL3, CONTROL3, CONTROL4, CONTROL5, CONTROL6, CONTROL0, CONTROL8, CONTROL9, CONTROL0}; switch(event) { case E_RIGHT: if (current_control == CONTROL6) { current_control = CONTROL0; } else { current_control++; } lcd_change_menu(0); break; case E_LEFT: if (current_control == CONTROL0) { current_control = CONTROL8; } else { current_control--; } lcd_change_menu(0); break; case E_UP: current_control = up_control[current_control]; lcd_change_menu(0); break; case E_DOWN: current_control = down_control[current_control]; lcd_change_menu(0); break; case E_INC: switch(current_control) { case CONTROL0: // Volume action_vol_up(); break; case CONTROL1: // Play/Pause put_back_event(E_PLAY_PAUSE); break; case CONTROL2: // Random Mode random_mode_next(); lcd_update_top_line(); break; case CONTROL3: // Filename put_back_event(E_NEXT); break; case CONTROL4: // Directory/Playlist put_back_event(E_NEXT_LIST); break; case CONTROL5: // Treble sta013_tone_up(PARAM_TREBLE); break; case CONTROL6: // Bass sta013_tone_up(PARAM_BASS); break; default: break; } break; case E_DEC: switch(current_control) { case CONTROL0: // Volume action_vol_down(); break; case CONTROL1: // Play/Pause put_back_event(E_PLAY_PAUSE); break; case CONTROL2: // Normal/Random random_mode_prev(); lcd_update_top_line(); break; case CONTROL3: // Filename put_back_event(E_PREV); break; case CONTROL4: // Directory/Playlist put_back_event(E_PREV_LIST); break; case CONTROL5: // Treble sta013_tone_down(PARAM_TREBLE); break; case CONTROL6: // Bass sta013_tone_down(PARAM_BASS); break; default: current_screen=MAINSCREEN; break; } break; default: printf("Unsupported event %d\r\n", event); break; }}//--------------------------------------------------------------------void lcd_set_scroll_speed(){ // do with updates off to reduce flicker printf("\\I:\\K0%d\\I8\\I9", (int) param_value[PARAM_SCROLL_SPEED]);} //--------------------------------------------------------------------void lcd_user_action(event_t event){ switch(event) { case E_DISPLAY1: lcd_version = LCD_VERSION_1; printf("\r\nDisplay protocol version=%d.\r\n", lcd_version); break; case E_ENTER: set_timer(TIMER_LCD_TIMEOUT, param_screen_timeout()); lcd_change_menu(1); // Enter always changes pages break; case E_LCD_TIMEOUT_TIMER: if(current_screen!=MAINSCREEN || current_control!=CONTROL0) { current_screen=MAINSCREEN; current_control=CONTROL0; lcd_change_menu(0); } break; default: set_timer(TIMER_LCD_TIMEOUT, param_screen_timeout()); // all other events are screen specific and sent to a particular screen switch(current_screen) { case MAINSCREEN: user_action_screen1(event); break; case AUDIOSCREEN: user_action_screen2(event); break; case TREEDIRSCREEN: if (treedir_user_action(event)) lcd_change_menu(0); break; case EPARAMSCREEN: if (eparam_user_action(event)) { lcd_change_menu(0); } break; default: current_screen=MAINSCREEN; break; } break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -