看到网上有个视频,用的是12864做的菜单,很花哨,自己也心痒痒想做一个,收集了 很多关于这方面的东西,但是都是五花八门,没有一个完整的可以共大家参考的程序,所以决定写偏文章供大家参考,希望读者下去自己优化,改进。有什么不足之处还请多多包涵。好了,废话不多说,直接进入正题吧。
{
uchar current;
uchar up;//上键
uchar down;//下键
uchar enter;//确认键
void (*current_operation)();
{
{0,2,1,3,(*fun1)},
{1,0,2,4,(*fun2)},
{2,1,0,5,(*fun3)},
{3,0,6,3,(*fun4)},
{4,1,6,4,(*fun5)},
{5,2,6,5,(*fun6)},
{6,0,0,0,(*fun7)},
};
{
{0,x,y,z,(*fun1)},
{1,x,y,z,(*fun2)},
{2,x,y,z,(*fun3)},
{3,x,y,z,(*fun4)},
{4,x,y,z,(*fun5)},
{5,x,y,z,(*fun6)},
{6,x,y,z,(*fun7)},
};
switch(key)
{
case 0x44:
case 0x24:
break;
case 0x14:
break;
default:break;
} current_operation_index=table[func_index].current_operation;
主要是以结构体为基础设计的,以12864显示函数代替了用户需要的函数功能,只需要修改相应的函数和索引号,就可以达到任意界面切换了是小弟研究了还久才搞定的,虽然网上也有这些,但是都不够系统,只有基本的东西,这篇例子希望能够给读者一些有用的东西,仅供参考哦!
#include <reg52.h>
#include "fun.h"
#include "lcd12864.h"
#include "delay.h"
#define uchar unsigned char
sbit keydown=P0^0;
sbit keyenter=P0^1;
sbit keyup=P0^2;
uchar func_index=0;
void (*current_operation_index)();
typedef struct
{
uchar current;
uchar up;//向上翻索引号
uchar down;//向下翻索引号
uchar enter;//确认索引号
void (*current_operation)();
} key_table;
key_table code table[30]=
{
{0,3,1,4,(*fun1)},//第一层,显示【清华大学】、北京大学、重庆三峡学院、返回
{1,0,2,8,(*fun2)},//第一层,显示清华大学、【北京大学】、重庆三峡学院、返回
{2,1,3,12,(*fun3)},//第一层,显示清华大学、北京大学、【重庆三峡学院】、返回
{3,2,0,25,(*fun4)},//第一层,显示清华大学、北京大学、重庆三峡学院、【返回】
{4,7,5,16,(*fun5)},//第二层,清华大学层下显示【地点】、创建时间、简介、返回
{5,4,6,17,(*fun6)},//第二层,清华大学层下显示地点、【创建时间】、简介、返回
{6,5,7,18,(*fun7)}, //第二层,清华大学层下显示地点、创建时间、【简介】、返回
{7,6,4,0,(*fun8)},//第二层,清华大学层下显示地点、创建时间、简介、【返回】
{8,11,9,19,(*fun9)},//第二层,北京大学层下显示【历史】、政治、简介、返回
{9,8,10,20,(*fun10)},//第二层,北京大学层下显示历史、【政治】、简介、返回
{10,9,11,21,(*fun11)}, //第二层,北京大学层下显示历史、政治、【简介】、返回
{11,10,8,1,(*fun12)},//第二层,北京大学层下显示历史、政治、简介、【返回】
{12,15,13,22,(*fun13)},//第二层,重庆三峡学院层下显示【简介】、最佳院系、最佳实验室、返回
{13,12,14,23,(*fun14)}, //第二层,重庆三峡学院层下显示简介、【最佳院系】、最佳实验室、返回
{14,13,15,24,(*fun15)}, //第二层,重庆三峡学院层下显示简介、最佳院系、【最佳实验室】、返回
{15,14,12,2,(*fun16)}, //第二层,重庆三峡学院层下显示简介、最佳院系、最佳实验室、【返回】
{16,16,16,4,(*fun17)}, //第三层,清华大学地点层
{17,17,17,5,(*fun18)}, //第三层,清华大学创时间层
{18,18,18,6,(*fun19)}, //第三层,清华大学简介层
{19,19,19,8,(*fun20)}, //第三层,北京大学历史层
{20,20,20,9,(*fun21)}, //第三层,北京大学政治层
{21,21,21,10,(*fun22)}, //第三层,北京大学简介层
{22,22,22,12,(*fun23)}, //第三层,重庆三峡学院简介层
{23,23,23,13,(*fun24)}, //第三层,重庆三峡学院最佳院系层
{24,24,24,14,(*fun25)}, //第三层,重庆三峡学院最佳实验室层
{25,25,25,0,(*fun26)}, //第0层
};
void main()
{
init_lcd(); //初始化LCD模块
while(1)
{
/*******************find index****************************/
if((keyup==0)||(keydown==0)||(keyenter==0))
{
delay(10);//消抖
if(keyup==0)
{
func_index=table[func_index].up; //向上翻
while(!keyup);//松手检测
}
if(keydown==0)
{
func_index=table[func_index].down; //向下翻
while(!keydown);
}
if(keyenter==0)
{
func_index=table[func_index].enter; //确认
while(!keyenter);
}
init_lcd();
}
current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
}
}
转载处链接:
http://home.eeworld.com.cn/my/space.php?uid=436048&do=blog&id=85400