| 
				打卡等级:以坛为家III打卡总天数:657最近打卡:2025-10-31 08:27:32 荣誉版主 
 
	积分4469 
 | 
 
| 基于自制 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, 下载次数: 183) 
 
 
 
 
 | 
4
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
 
 +1楼主威武~
 +2楼主威武~
 +1楼主威武~
 +2楼主威武~
 |