找回密码
 立即注册
查看: 1474|回复: 22

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-8-4 17:37:53 | 显示全部楼层 |阅读模式
基于自制 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[][9]={
"文件管理","测试分析","系统设置","打印输出","调零校准","测试设置","系统维护","单片机OK","系统分析","查询管理", };      //抽象定义

//=====================================================================
// 函数: void  delay_ms(unsigned int ms)
// 描述: 毫秒级延时函数。
// 参数: ms,要延时的ms数,自动适应主时钟.
//=====================================================================
void  delay_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[0],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[m],0,0,1); //显示菜单项文字名称
    }
    delay_ms(100);
  }  
}


相关工程文件,供有兴趣爱好者参考:
05-OLED12864(7P) 水平滑动图标菜单.rar (52.7 KB, 下载次数: 137)




4 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-8-26 10:37:15 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-8-4 17:40:20 | 显示全部楼层
本帖最后由 浦江一水 于 2024-8-4 17:50 编辑

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

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

回复 支持 2 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-8-4 19:34:07 来自手机 | 显示全部楼层
手上有stc8051,可以下载下来学习一下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-8-5 08:04:58 | 显示全部楼层
感谢版主 autopccopy 的鲜花鼓励。

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-8-5 14:29:03 | 显示全部楼层
本帖最后由 浦江一水 于 2024-8-5 19:56 编辑

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

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:365
  • 最近打卡:2025-05-02 00:20:03

6

主题

319

回帖

2206

积分

金牌会员

积分
2206
发表于 2024-8-5 15:33:29 | 显示全部楼层
要是再配合触摸按键滑动效果就更好了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-04-27 21:45:46

0

主题

9

回帖

356

积分

中级会员

积分
356
发表于 2024-8-18 14:37:14 来自手机 | 显示全部楼层
效果不错。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-8-19 09:10:51 | 显示全部楼层
非常感谢 神农鼎 管理员的鲜花鼓励。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-04-04 22:11:37
已绑定手机

36

主题

287

回帖

824

积分

高级会员

积分
824
发表于 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-26 16:32
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-8-25 08:06:14 | 显示全部楼层
可以开多个 1024字节的 DMA缓冲区,
然后 DMA-SPI 直接刷屏,
40MHz/4 = 10MHz,

40MHz/2 = 20MHz

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:44 , Processed in 0.132330 second(s), 124 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表