呵呵,谢谢提醒,可是我也不知道 我把这两个字函数贴出来吧!呵呵,结构不怎么好,见笑了
/*-------------------------------------------------------------------
**名称:void Menu_First_Display(unsigned char Black_line,unsigned char line)
**功能:在LCD12864上分四行显示菜单
**备注: Menu_num == 1 Menu_num == 2 Menu_num == 3
-------1-------- -------2-------- -------3--------
-------2-------- -------3-------- -------4--------
-------3-------- -------4-------- -------5--------
-------4-------- -------5-------- -------6--------
菜单序号(第一页) 菜单序号(第二页) 菜单序号(第三页)
**修改:
**日期:
----------------------------------------------------------------------*/
void Menu_First_Display(unsigned char Black_line,unsigned char line)
{
unsigned char Men1[] = {"时间设置"};
unsigned char Men2[] = {"日期设置"};
unsigned char Men3[] = {"波形选择"};
unsigned char Men4[] = {"幅度调整"};
unsigned char Men5[] = {"AD绘图 "};
unsigned char Men6[] = {"画图功能"};
unsigned char *Men[] = {Men1,Men2,Men3,Men4,Men5,Men6};//存菜单的数组地址
unsigned char Men_num = 1 , Max , Txt_line ,num;
Keyvaul = 0 ; // 清除Keyvaul 的值,以便储存菜单中的按键值
while(1) //反复读取菜单中的操作键盘值,并做相应的处理
{
switch( line )
{/*
case 1:Txt_Display(1,2,8,Men1);break; //在第一行显示第一个菜单
case 2:Txt_Display(1,2,8,Men2);break; //在第一行显示第二个菜单
case 3:Txt_Display(1,2,8,Men3);break;
case 4:Txt_Display(1,2,8,Men4);break;
case 5:Txt_Display(1,2,8,Men5);break;
case 6:Txt_Display(1,2,8,Men6);break;//在第一行显示最后一个菜单
*/
case 7:
{
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display(); // 绘图清屏
Max = Men_num + 4 ; // 一个屏幕最多显示 4 行
for(num = Men_num,Txt_line = 1;num < Max ,Txt_line < 5;num ++,Txt_line ++) //显示从x_line 开始的后四行菜单
{
Txt_Display(Txt_line,2,8,Men[ num - 1 ]); //在第 Txt_line行,显示第num 个菜单
}
}break;
}
DrawnBlack_128x16( Black_line , 0xff ); //画出菜单中的黑色背景
while(! Keyvaul); // 等待键盘的操作
switch( Keyvaul )
{
case 1: { //下翻式显示菜单
Keyvaul = 0 ;//键值清零
Black_line ++ ; // 按下一个键值后, 黑色背景下移一行
if(Black_line > 4 )
{
Black_line = 4;
Men_num ++ ; //菜单页数调整
if(Men_num == 4) // 最大值为菜单的个数减去3
{
Black_line = 1;//回到第一行
Men_num = 1 ; // 回到第一页
}
}
} break;
case 2: {
// 上翻式显示菜单
Keyvaul = 0 ;//键值清零
Black_line --; // 按下一个键值后, 黑色背景上移一行
if(Black_line < 1 ) //菜单到了最顶端,且有显示上一行的要求
{
Black_line = 1;
Men_num -- ; //页数调整到上一页
if(Men_num == 0) //第一页上翻到最后一页
{
Black_line = 4; // 把黑色背景移到最后一行显示
Men_num = 3 ; // 页数调整到最后一页
}
}
} break;
case 3: { // 确认选择键,进入下一级菜单
Keyvaul = 0;//键值清零
switch( Black_line )
{
case 1:{ //黑色背景在第1行
if( Men_num == 1)//第一个菜单被选中
Menu_Second_Display( 1, Men1);
if( Men_num == 2)//第二个
Menu_Second_Display( 2, Men2);
if( Men_num == 3)//第三个
Menu_Second_Display( 3, Men3);
}break;
case 2:{ // 黑色背景在第2行
if( Men_num == 1)//第二个菜单被选中
Menu_Second_Display( 2, Men2);
if( Men_num == 2)//第三个
Menu_Second_Display( 3, Men3);
if( Men_num == 3)//第四个
Menu_Second_Display( 4, Men4);
}break;
case 3:{//黑色背景在第3行
if( Men_num == 1)//第三个菜单被选中
Menu_Second_Display( 3, Men2);
if( Men_num == 2)//第四个
Menu_Second_Display( 4, Men4);
if( Men_num == 3)//第五个
Menu_Second_Display( 5, Men5);
}break;
case 4:{ //黑色背景在第4行
if( Men_num == 1)//第四个菜单被选中
Menu_Second_Display( 4, Men4);
if( Men_num == 2)//第五个
Menu_Second_Display( 5, Men5);
if( Men_num == 3)//第六个
Menu_Second_Display( 6, Men6);
}break;
}
} break;
case 5:{ // 菜单返回键
Keyvaul = 0; //键值清零
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display(); // 绘图清屏
return; //返回
}
default : Keyvaul = 0;break;
}
}
}
/*-------------------------------------------------------------------
**名称:void Menu_Second_Display( unsigned char num , unsigned char *Menu )
**功能:第二级显示菜单
**备注:函数的参数 num 表示在第一级菜单中被选中菜单的编号,Menu 则是被选中菜单的名字
**修改:
**日期:2010-05-26
----------------------------------------------------------------------*/
void Menu_Second_Display( unsigned char num , unsigned char *Menu )
{
unsigned char Menu_ADSetY[] = {"Y 轴刻度值设置"};
unsigned char Menu_Unit[] = {"mV"} ; //单位
unsigned char Menu_DrawnSetX[] = {"X 轴所在行设置"};//画图设置菜单
unsigned char Menu_DrawnSetY[] = {"Y 轴所在列设置"};//画图设置菜单
unsigned char Menu_TimerSet[] = {"00: 00: 00"};//时间设置菜单
unsigned char StartLine_X ,StartLine_Y ,Black_line = 1;
while(1)
{
while(!Keyvaul); //等待按键
switch( Keyvaul )
{
case 1:{
Black_line ++ ; //黑色背景下移
if( Black_line == 5)Black_line = 1;
} break;
case 2:{
Black_line -- ; //黑色背景上移
if( Black_line == 0)Black_line = 4;
}break;
case 5: {
Keyvaul = 0;
return ;//返回键
} break;
default : Keyvaul = 0; break ;
}
switch( num )
{
case 1:{
//第一个菜单
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display();
DrawnBlack_128x16( 1 ,0xff ); // 在第一行显示黑色背景
Txt_Display(1,2,8,Menu); //显示菜单功能说明,比如说时间设置功能,则在这里显示:时间设置
SetData(3,3,3); // 数据设置
}break;
case 2:{
//第二个菜单
}break;
case 3:{ //波形选择功能
Keyvaul = 0 ;
RetChoose_Wave = Choose_Wave(); // 调用波形选择函数
}break;
case 4:{//幅度设置菜单
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display();
DrawnBlack_128x16( 1 ,0xff ); // 在第一行显示黑色背景
Txt_Display(1,2,8,Menu);
Txt_Display(3,5,2,Menu_Unit); //显示 "mV"
RetWave_vaul = SetData(3,3,3); // 数据设置 (第三行第三单元,三位数据)
}break;
case 5:{ //AD绘图功能
// 设置 X 轴所在行
Keyvaul = 0 ;
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display();
DrawnBlack_128x16( 1 , 0xff ); // 在第一行显示黑色背景
Txt_Display(1,2,8,Menu);
Txt_Display(2,0,14,Menu_DrawnSetX);
StartLine_X = SetData(3,3,3); // X数据设置
if(Keyvaul == 5)
{
Keyvaul = 0;
return ;//返回键
}
//设置 Y 轴所在列
Txt_Display(2,0,14,Menu_DrawnSetY);
StartLine_Y = SetData(3,3,3); // X数据设置
if(Keyvaul == 5)
{
Keyvaul = 0;
return ;//返回键
}
//开始画线
Write_LCD_Com( 0x01 ); //字符清屏
Clear_Display();
// 画 X 轴
Drawn_Line (0,127,StartLine_X,StartLine_X);
// 画 Y 轴
Drawn_Line (StartLine_Y,StartLine_Y,0,63);
}break;
case 6:{
}break;
default : break;
}
}
} |