Yesterday once more《昨日重现》中英文歌词对照

When I was yong, 当我年轻时,
I’d listen to the radio, 常听收音机,
Waiting for my favorite songs。 等待心爱的歌曲。
When they played I’d sing along, 听到播放时便随声歌唱。
It made me smile。 这使我欢畅。

Those were such happy times, 那时多么幸福的时刻!
And not so long ago。 就在不久以前。
How I wondered where they’d gone。 我想知道他们曾去何处,
But they’re back again, 但我所有深爱的歌曲
Just like a long lost friend。 他们现在又回来,
All the songs I love so well。 正如老友失散又重聚。

Every sha-la-la-la 每一句sha-la-la-la
Enery wo-wo still shines, 每一句wo-wo仍闪烁,
Every shinga-linga-ling, 每一句shinga-linga-ling,
That they’restarting to sing so fine。他们又开始唱得如此动听。

When they get to the part 当他们唱到一个地方
Where he,s breaking her heart, 令她伤心断肠,
It can really make me cry, 这真能叫我哭出来,
Just like before, 正如从前一样,
It’s yesterday once more。 仿佛昔日又重来

Looking back on how it was 回头看
In years gone by, 岁月如何消逝
And the good time that I had 这些过去的好时光
Makes today seem rather sad。 使今天显得令人哀伤。
So much has changed。 变化多大啊!

It was songs of love 我向他们唱
That I would sing to them, 爱的歌曲。
And I’d memorize each word, 我会记住每一句歌词。
Those old melodies 那些古老的曲调,
Still sound so good to me, 在我听来还是那么好,
As they melt the years away。 好像他们把岁月融消。

Every sha-la-la-la 每一句sha-la-la-la
Enery wo-wo still shines, 每一句wo-wo仍闪烁,
Every shinga-linga-ling, 每一句shinga-linga-ling,
That they’restarting to sing so fine。他们又开始唱得如此动听。

All my best memories 我所有美好的记忆
Come back clearly to me。 清晰的重现。
Some can even make me cry, 有一些仍能使我哭出来,
Just like before, 正如从前一样,
It’s yesterday once more。 仿佛昔日又重来。

Every sha-la-la-la 每一句sha-la-la-la
Enery wo-wo still shines, 每一句wo-wo仍闪烁,
Every shinga-linga-ling, 每一句shinga-linga-ling,
That they’restarting to sing so fine。他们又开始唱得如此动听。
<think>嗯,用户想在STM32驱动的OLED屏幕上实现英文歌词的上下滚动播放效果。首先,我需要回忆一下OLED屏幕的基本操作和STM32的编程方法。根据之前的知识,OLED通常是使用SPI或I2C接口通信的,而显示数据通常存储在GRAM(图形内存)中,然后刷新到屏幕上。 用户提到的是上下滚动,而之前的引用中有些是关于左右滚动的,比如引用[3]和[4]中的例子。不过上下滚动的原理应该类似,只是方向不同。左右滚动是通过水平移动显示数据的起始位置,而上下滚动则需要垂直移动。可能需要调整GRAM的刷新方式,或者利用OLED自带的滚动命令功能。 在引用[1]中提到了OLED的滚屏命令,包括水平左右移和垂直滚动。这可能是一个关键点。STM32可以通过发送特定的命令来启用OLED的硬件滚动功能,这样不需要频繁地更新整个屏幕,而是让OLED控制器自己处理滚动,这样可以节省CPU资源。比如,使用SSD1306控制器的垂直滚动命令。 但用户可能需要软件实现的滚动,特别是如果希望更灵活地控制滚动速度或者处理动态内容的话。这时候就需要在代码中手动移动显示缓冲区的内容。例如,每次刷新时,将文本向上移动一行,并加载新的内容到底部,或者向下移动,加载到顶部。 接下来要考虑的是英文歌词的显示。英文通常使用ASCII字符,每个字符可能占用固定的像素大小,比如8x8或8x16。取模方式可能和汉字不同,但用户之前的问题中提到了使用PCtoLCD2002进行汉字取模,可能需要类似的工具生成英文字符的点阵数据。 然后,代码结构方面,可能需要一个缓冲区来存储当前显示的文本内容,然后通过定时器中断定期更新显示位置。例如,每隔一定时间(比如200ms)触发一次滚动,每次滚动一行的高度。引用[3]中提到了使用SPI刷屏,如果使用DMA的话可以更高效,但用户可能需要先实现基本功能。 另外,引用[4]中的函数是左移滚动显示,可以借鉴其结构,但改为上下滚动。比如,每次刷新时,调整Y轴的起始位置,或者逐行移动GRAM中的数据。例如,使用一个显示缓冲区数组,每次将数据向上移动一行,然后填充新的一行到底部,最后刷新整个GRAM。 还需要考虑如何分割歌词字符串,当歌词超过屏幕显示的行数时,如何分页或者循环显示。可能需要将歌词按行分割,存储在数组中,然后根据当前滚动的位置索引相应的行。 可能的步骤包括: 1. 初始化OLED,设置通信接口(SPI/I2C)。 2. 准备英文字库的点阵数据,确保每个字符的宽度和高度正确。 3. 将歌词文本按行分割,存储在缓冲区中。 4. 使用定时器中断触发滚动事件,每次滚动一行。 5. 在中断处理函数中,更新显示缓冲区的数据,实现上下滚动效果。 6. 刷新GRAM到OLED屏幕。 需要确认OLED的GRAM结构,比如是否每页是8行,如果是的话,垂直滚动可能需要按页来处理。例如,SSD1306的垂直滚动命令可以设置起始页和结束页,以及滚动速度。这样可以通过发送命令让OLED自动滚动指定的页区域,而无需CPU干预。这可能更高效,但需要查阅具体的OLED驱动芯片手册。 如果使用硬件滚动命令,代码可能更简洁。例如,设置垂直滚动命令,然后通过调整起始行来实现连续滚动的效果。比如,每次增加起始行的值,让屏幕内容上移。这种方法不需要修改GRAM中的数据,只需要不断调整起始行参数,可能更节省资源。 不过,用户可能需要具体的代码示例,所以需要结合这两种方法,给出一个可行的方案。比如,使用软件方法实现缓冲区的移动,并配合定时器刷新。 另外,引用[3]中提到使用SPI刷屏,如果使用DMA可以释放CPU资源,但用户的问题可能不需要那么复杂,所以示例代码可能先采用基本的轮询方式。 最后,测试代码时需要注意屏幕刷新频率,避免闪烁,同时确保歌词文本的正确解析和显示。</think>以下是在STM32上实现OLED英文歌词上下滚动播放的代码实现方案: ### 一、实现原理 通过逐行更新显示缓冲区实现垂直滚动效果,利用定时器控制滚动速度。每次刷新时将文本内容整体上移一行,并补充新内容到底部(或顶部)[^3][^4]。 ### 二、代码实现 #### 1. 硬件配置 ```c // OLED引脚配置(SPI示例) #define OLED_SCK_PIN GPIO_PIN_5 #define OLED_MOSI_PIN GPIO_PIN_7 #define OLED_CS_PIN GPIO_PIN_4 #define OLED_DC_PIN GPIO_PIN_1 #define OLED_RST_PIN GPIO_PIN_0 ``` #### 2. 核心滚动函数 ```c #define SCREEN_LINES 8 // 128x64 OLED按8行显示 #define CHAR_HEIGHT 8 // 英文字符高度 // 显示缓冲区 uint8_t displayBuffer[SCREEN_LINES][128]; void vertical_scroll(char **lyrics, uint16_t total_lines) { static uint16_t start_line = 0; // 清空缓冲区 memset(displayBuffer, 0x00, sizeof(displayBuffer)); // 填充当前显示内容 for(uint8_t i=0; i<SCREEN_LINES; i++) { uint16_t current_line = (start_line + i) % total_lines; OLED_ShowString(0, i*CHAR_HEIGHT, lyrics[current_line], 8); } // 更新显示 OLED_Refresh(); // 滚动计数器 start_line = (start_line + 1) % total_lines; } ``` #### 3. 定时器中断配置 ```c // 在tim.c中添加(200ms滚动一次) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { vertical_scroll(lyrics_array, LYRIC_LINES); } } ``` #### 4. 歌词数据示例 ```c char *lyrics[] = { "Yesterday...", "All my troubles...", "Now it looks...", // 添加更多歌词行 }; ``` ### 三、实现效果控制 1. **滚动速度**:通过修改定时器ARR寄存器值调整 2. **显示定位**:使用`OLED_SetCursor()`函数设置起始坐标 3. **同步刷新**:`OLED_Refresh()`函数实现GRAM到屏幕的更新[^3] ### 四、优化建议 1. 使用DMA传输提高刷新效率[^3] 2. 添加淡入淡出效果:通过修改对比度寄存器实现 3. 采用硬件垂直滚动指令(需OLED控制器支持): ```c // SSD1306垂直滚动命令 void OLED_VerticalScroll(uint8_t start_page, uint8_t end_page) { OLED_WriteCmd(0xA3); // 设置垂直滚动区域 OLED_WriteCmd(start_page); OLED_WriteCmd(end_page); OLED_WriteCmd(0x01); // 滚动速度 OLED_WriteCmd(0x2F); // 启用滚动 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值