版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40818798/article/details/89631925
完整工程下载
功能切换显示的实现:使用按键轮询响应,每按一次选择键,箭头向下,箭头指到可显示区域最下方时,继续按选择键,文字开始循环滚动(使用函数指针,将每一个显示写成函数,通过排序改变函数指针指向)。确认键进入该功能,确认键此时变为返回键。即:两个按键实现功能切换、确认、退出等。
void HeadLine1(u8 y) //主标题显示
{
OLED_ShowCHinese(10,y,0); //双线循迹停泊
OLED_ShowCHinese(28,y,1); //
OLED_ShowCHinese(46,y,2); //
OLED_ShowCHinese(64,y,3); //
OLED_ShowCHinese(82,y,4); //
OLED_ShowCHinese(100,y,5); //
}
void HeadLine2(u8 y) //副标题显示
{
//
// OLED_ShowCHinese(54,y,10); //停
// OLED_ShowCHinese(72,y,11); //泊
// OLED_ShowCHinese(72,y,12); //系
// OLED_ShowCHinese(54,y,13); //统
}
void Start1(u8 y) //开始1 稳中求胜
{
OLED_ShowCHinese(28,y,27); //开
OLED_ShowCHinese(46,y,28); //始
OLED_ShowCHinese(64,y,29);
OLED_ShowCHinese(82,y,30);
}
void Start2(u8 y) //开始2 破釜沉舟
{
OLED_ShowCHinese(28,y,31); //开
OLED_ShowCHinese(46,y,32); //始
OLED_ShowCHinese(64,y,33);
OLED_ShowCHinese(82,y,34);
}
void Debug(u8 y) //调试
{
OLED_ShowCHinese(46,y,23);
OLED_ShowCHinese(64,y,24);
}
void SoftReset(u8 y) //软件复位
{
OLED_ShowCHinese(46,y,25);
OLED_ShowCHinese(64,y,26);
}
void About(u8 y) //关于
{
OLED_ShowCHinese(46,y,10);
OLED_ShowCHinese(64,y,11);
}
void Thank(u8 y) //鸣谢
{
OLED_ShowCHinese(46,y,12);
OLED_ShowCHinese(64,y,13);
}
void HangClear(u8 y) //清除第y行
{
OLED_ShowString(0,y," ");
}
void OLED_Menu(void)
{
pFunc[0](0);
pFunc[1](3);
pFunc[2](6);
}
void Menu_Init(void)
{
pFunc[0] = HeadLine1; //函数指针指向各功能,显示时通过交换函数指针实现功能显示
pFunc[1] = Start1;
pFunc[2] = Start2;
pFunc[3] = Debug;
pFunc[4] = About;
pFunc[5] = Thank;
pFunc[6] = SoftReset;
}
while(1)
{
curFunc = pFunc[count]; //获取选中功能
key = KEY_Scan(0);
switch(key)
{
case KEY0_PRES: //选择键
count++;
i += 3; //纵坐标下移
if( count > 2 ) //限幅,可显示的行数最多为3
count = 2;
if( i==6 ) //清除第2行的-> 因为此刻->以指向第3行
OLED_ShowString(0,3," ");
if( i > 6 )
{
i = 6;
/* 循环滚动选择
tmpFunc = pFunc[0];
for( k = 0; k < FUNC_SUM-1; k++ )
pFunc[k] = pFunc[k+1];
pFunc[k] = tmpFunc;*/
/* 不带标题栏(标题栏不动)的循环滚动选择 */
tmpFunc = pFunc[1];
for( k = 1; k < FUNC_SUM-1; k++ )
pFunc[k] = pFunc[k+1];
pFunc[k] = tmpFunc;
/* 不带标题栏(标题栏不动)的循环滚动选择 */
OLED_Clear();
OLED_Menu();
}
OLED_ShowString(0,i,"->"); // sign
break;
case KEY1_PRES: //确认键
OLED_Clear();
if(curFunc == Start1) //开始
{
SetNum(0); //数码管设置四位初始数字
OLED_DrawBMP(0,1,127,8,BMP_CAR); //显示小汽车图标
while(1)
SetNum(SEG_Final);
}
else if(curFunc == About) //关于
{
OLED_ShowCHinese(18,0,21); //作者
OLED_ShowCHinese(36,0,22); //
//显示作者姓名 图片等
OLED_ShowCHinese(64,0,19); //HC
OLED_ShowCHinese(82,0,20);
OLED_ShowCHinese(64,3,14); //GYY
OLED_ShowCHinese(82,3,15);
OLED_ShowCHinese(100,3,16);
OLED_ShowCHinese(64,6,17); //WYX
OLED_ShowCHinese(82,6,15);
OLED_ShowCHinese(100,6,18);
OLED_DrawBMP(0,2,60,7,BMP_LOGO); //图片
}
else if(curFunc == Thank) //鸣谢
{
//显示组委会信息 LOGO
OLED_DrawBMP(0,2,127,6,BMP_XUPT);
}
else if(curFunc == Start2) //开始2
{
}
else if(curFunc == Debug) //调试
{
float a = 2;
u8 str[] = "FFFF";
while(1)
{
OLED_ShowString(50,3,str);
key = KEY_Scan(0);
if(key == KEY0_PRES)
{
a -= 0.2;
sprintf(str,"%.2f",a);
}
else if(key == KEY1_PRES)
break;
}
}
else if(curFunc == SoftReset) //软件复位
{
Sys_Soft_Reset();
}
while( KEY_Scan(0) != KEY1_PRES ) //检测退出键
; //确认键按下进入功能后,确认键变成返回键
OLED_Clear();
OLED_Menu();
break;
default:
break;
}
delay_diy(100);
}