- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
基于自制 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
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+1
楼主威武~
-
+2
楼主威武~
-
+1
楼主威武~
-
+2
楼主威武~
|