基于平头哥RSIC-V RVB2601的网络收音机设计(3)
[复制链接]
1、简述
完成数据请求之后还需要编写软件界面,系统自带有lvgl图形化界面,但是说实话,单色oled用lvgl有点杀鸡焉用牛刀的样子,另外歌曲的播放,另外还需要使用按钮来切换显示等。
这里的界面显示使用纯字符界面,采样点阵的思路显示字符。另外还需要制作几个界面用来切换和选择,音量调节等。
2、oled驱动显示字符
系统自带的oled采用的是显存池的思路显示字符,一个字节只使用了1个位,一个完整的显示页面需要128*64=8k的内存,如果使用点阵的思路可以大大节省内存空间。
显示字符需要先取模,具体的方法可以自行查阅相关资料,下面是我使用的两种大小的ASCII字模
//具体见
有了字模之后,还需要修改添加对应的显示函数。
/**
* @brief oled_show_string,显示oled.h中的ASCII字符,有6*8和8*16可选择
* @param x,y : 起始点坐标(x:0~127, y:0~7);
* ch[] :- 要显示的字符串;
* TextSize : 字符大小(1:6*8 ; 2:8*16)
* @retval 无
*/
void oled_show_string(uint8_t x, uint8_t y, char ch[], uint8_t TextSize)
{
uint8_t c = 0,i = 0,j = 0;
switch(TextSize)
{
case 1:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 126)
{
x = 0;
y++;
}
for(i=0;i<6;i++){
Set_Start_Page(y);
Set_Start_Column(x+i);//设置行
Write_Data(F6x8[c]);
}
x += 6;
j++;
}
}break;
case 2:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 120)
{
x = 0;
y++;
}
for(i=0;i<8;i++)
{
Set_Start_Page(y);
Set_Start_Column(x+i);//设置行
Write_Data(F8X16[c*16+i]);
}
for(i=0;i<8;i++)
{
Set_Start_Page(y+1);
Set_Start_Column(x+i);//设置行
Write_Data(F8X16[c*16+i+8]);
}
x += 8;
j++;
}
}break;
}
}
需要显示的时候直接调用
oled_show_string(0,0,"Music Player1.0",2);
oled_show_string(8,4,"c-any Button...",1);
3、oled显示界面的制作
网络收音机的oled界面只需要3页即可,第一页是开机显示界面。
图1 开机界面
初步计划是在上电之后停留在开机界面,然后按任意键进入系统,状态显示SA显示当前的播放状态,播放状态一共有5种,分别是
状态1
|
SA:finding!
|
正在解析json
|
状态2
|
SA:downloading!
|
正在缓存音乐
|
状态3
|
SA:playing!
|
播放中
|
状态4
|
SA:play stop!
|
播放停止
|
状态5
|
SA:play error!
|
播放错误
|
图2 主播放界面
主播放界面是网络收音机的主要界面,oled上的title是当前播放的曲目名称,系统中存档有几首音乐,音乐的名称都在title显示,如果选择歌手在线播放,那么title显示的则是歌手名称。vol是播放的音量,开机默认音量为50%,可以通过单击按键1调整音量。双击按键2则进入歌手选择界面。
图3 歌手选择界面
歌手选择界面提供了常见的歌手,如果需要其他歌手可以自己在歌手结构体中添加歌手信息。
图4 歌手结构体
在歌手选择页面中按键2双击确认选择,系统则开始播放该歌手的曲目,按键1双击调整歌手播放清单。默认清单为第一页,调整清单范围为1~9页,可以自己修改。
整个操作界面的流程大概如下
图5 播放界面显示流程
4、总结
通过上面的操作,已经初步搭建出网络收音机显示的基本框架,并且能够正常显示。而至于按键的单击和双击请参见基于平头哥RVB2601网络收音机(4).
|