浦江一水 发表于 2024-8-4 17:37:53

OLED12864_基于 8051U实验板_水平滑动图标菜单

基于自制 8051U_DIP40 最小系统实验板,
外接OLED12864显示屏, 实验水平滑动图标菜单

实验效果,请看视频:



主程序 (功能作用请见注释)


//********************************************************************************
// 名称: Main.C 实验OLED屏水平滑动图标菜单
// 基于: STC8051U_DIP40 最小系统实验板
// 实验: OLED 12864(7针)显示屏 SSD1306 驱动 __ 实现双页切换显示(基于双页显示的基础编程)
// 编程: 浦晓明(浦江一水) 2024-08-02
//********************************************************************************
#include "STC8051U.H"
#include "SSD1306.H"
#include "KEY4_IO.H"
#include "TU.h"
#include "pic.h"

/** 全局变量 设为全局,便于仿真调试观察 **************/
unsigned char k;      //按键键值
unsigned char m=0;//菜单序号
unsigned char dir=0; //移动方向
unsigned char move; //是否移动
//定义菜单项目文字... 隐含N项. 如下实例: N=10 对应10个图标.
unsigned char Mn[]={
"文件管理","测试分析","系统设置","打印输出","调零校准","测试设置","系统维护","单片机OK","系统分析","查询管理", };      //抽象定义

//=====================================================================
// 函数: voiddelay_ms(unsigned int ms)
// 描述: 毫秒级延时函数。
// 参数: ms,要延时的ms数,自动适应主时钟.
//=====================================================================
voiddelay_ms(unsigned int ms)
{ unsigned int i;
do{ i = MAIN_Fosc / 6000;
      while(--i);
    } while(--ms);
}
/**** 主函数入口 ************************/
void main(void)
{
//IO端口初始化
WTST= 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
//IO端口初始化//全部为准双向口
P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
OLED_Init();                     //显示屏初始化
OLED_BMP(0,0,128,8,OLED12864_IMG0,1,1); //在第二页显示图片"深圳国芯"
delay_ms(2000);               //延时展示...
OLED_CLS(1);                  //清屏第二页
OLED_CLS(0);                  //清屏第一页
OLED_String(32,6,"文件管理",0,0,1);
OLED_BMP( 4,0,32,4,OLED_T0,0,0); //后台装载图片
OLED_BMP(48,0,32,4,OLED_T1,0,0);
OLED_BMP(92,0,32,4,OLED_T2,0,0);
OLED_Show(0);   //显示第一页
//主循环...
while(1)
{ move=0; k=0;
    k=GETCH();    //等待按键...
    if(k>0)
    { switch(k)
      { case K1S: case K1L: m=m>0?m-1:9; dir=0; move=1; break;//K1键长按或短按 序号- 右移图标
      case K2S: case K2L: m=m<9?m+1:0; dir=1; move=1; break;//K2键长按或短按 序号+ 左移图标
      case K3S: case K3L: break;//此处可以根据m值不同转向各子程序
      case K4S: case K4L: break;//此处可以根据m值不同转向各子程序
      }
      if(move){                     //如果需要移动...
      switch(m)
      { case 0: if(dir)OLED_MoveL(OLED_T2);else OLED_MoveR(OLED_T0); break;
      case 1: if(dir)OLED_MoveL(OLED_T3);else OLED_MoveR(OLED_T1); break;
      case 2: if(dir)OLED_MoveL(OLED_T4);else OLED_MoveR(OLED_T2); break;
      case 3: if(dir)OLED_MoveL(OLED_T5);else OLED_MoveR(OLED_T3); break;
      case 4: if(dir)OLED_MoveL(OLED_T6);else OLED_MoveR(OLED_T4); break;
      case 5: if(dir)OLED_MoveL(OLED_T7);else OLED_MoveR(OLED_T5); break;
      case 6: if(dir)OLED_MoveL(OLED_T8);else OLED_MoveR(OLED_T6); break;
      case 7: if(dir)OLED_MoveL(OLED_T9);else OLED_MoveR(OLED_T7); break;
      case 8: if(dir)OLED_MoveL(OLED_T0);else OLED_MoveR(OLED_T8); break;
      case 9: if(dir)OLED_MoveL(OLED_T1);else OLED_MoveR(OLED_T9); break;
      } }
      OLED_String(32,6,Mn,0,0,1); //显示菜单项文字名称
    }
    delay_ms(100);
}
}


相关工程文件,供有兴趣爱好者参考:





神农鼎 发表于 2024-8-26 10:37:15

能否带大家一起熟悉下 uGFX/GUI

【新提醒】【uGFX/GUI + uC/OS-II】 @32G系列;uGFX/GUI@32G系列裸机 - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTOS, 实时操作系统 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)



【新提醒】uC/OS-II @AI8051U_Xsmall+Large 移植版,AI8051U,32G8K64 迎接AI8051U到手 - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTOS, 实时操作系统 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)


浦江一水 发表于 2024-8-4 17:40:20

本帖最后由 浦江一水 于 2024-8-4 17:50 编辑

实用小程序... 保留了双页显示的原有功能, 扩充了两个滑动函数.
在以上实验中, 菜单项文字名称和对应图标都是抽象的.实际使用到项目中时, 应注意精准选择表达.
菜单项的数目是可以定义增减的, 只要注意对应的数组定义和配图即可.

实现方案思路算法都为个人独立思考而成,与高手们相比,定有差距, 在此仅供参考,见笑.

soma 发表于 2024-8-4 19:34:07

手上有stc8051,可以下载下来学习一下。

浦江一水 发表于 2024-8-5 08:04:58

感谢版主 autopccopy 的鲜花鼓励。

欢迎楼上坛友参与实验,主频设为40MHz,体验一下 8051U 驱动OLED显示屏的丝滑感觉。
(实际效果优于视频所示)

浦江一水 发表于 2024-8-5 14:29:03

本帖最后由 浦江一水 于 2024-8-5 19:56 编辑

感谢版主 大明狐 的鲜花鼓励。

感谢版主 STC芯征程 的鲜花鼓励。


网老四 发表于 2024-8-5 15:33:29

要是再配合触摸按键滑动效果就更好了

lichuangstudio 发表于 2024-8-18 14:37:14

效果不错。

浦江一水 发表于 2024-8-19 09:10:51

非常感谢 神农鼎 管理员的鲜花鼓励。

_NCY_ 发表于 2024-8-25 07:41:08

凭借8051U的高主频和大空间,有个方法能让它更丝滑:线性移动改为对数移动

说白了就是posx++;改为posx+=speed;
speed是速度,speed=(desx-posx)*k;

意思是speed又正比于当前坐标posx到目标坐标desx的差值。这样就会实现非常平滑的移动。改变比例系数k能改变视觉体验。

speed和k都是float值;

这个东西是我在一些高级gui代码里发现的,人家的里面有的甚至直接用的是pow来计算,
但咱可以聪明点用加和乘来模拟指数。自己一试发现真的很丝滑





神农鼎 发表于 2024-8-25 08:06:14

可以开多个 1024字节的 DMA缓冲区,
然后 DMA-SPI 直接刷屏,
40MHz/4 = 10MHz,
40MHz/2 = 20MHz

页: [1] 2 3
查看完整版本: OLED12864_基于 8051U实验板_水平滑动图标菜单