TFTLCD显示菜单问题

2019-08-22 16:13发布

我现在用TFTLCD显示一个菜单 通过按键控制菜单选项(被选中的项反白显示)  按键按一下 则选中菜单下一项 (也就是对应菜单下一行反白) 
现在 通过下面的方法实现了 不过我感觉这样写程序太过冗长 请问高手有没有什么好的解决方案:
/*******显示程序如下**********/
 switch(Key1_Value)
 { case 1: //第一次按下按键
  {  BackColor=BLUE;  //字体的背景颜 {MOD}
   LCD_Show_Word32(0,10+47,"通道参数设置",6);  //背景延时为蓝 {MOD}
    BackColor=GREEN;
   LCD_Show_Word32(0,10+47*2,"记录参数设置",6); //其他选项背景颜 {MOD}正常(为绿 {MOD})
   LCD_Show_Word32(0,10+47*3,"日期时间设置",6); 
   LCD_Show_Word32(0,10+47*4,"基本参数设置",6);
   LCD_Show_Word32(255,10+47*4,"退出",2);
  }break;
  case 2:   //第二次按下按键
  { LCD_Show_Word32(0,10+47,"通道参数设置",6);   //第一行恢复正常
   BackColor=BLUE;
   LCD_Show_Word32(0,10+47*2,"记录参数设置",6);  //第二行背影颜 {MOD}为蓝 {MOD}
   BackColor=GREEN;
   LCD_Show_Word32(0,10+47*3,"日期时间设置",6); 
   LCD_Show_Word32(0,10+47*4,"基本参数设置",6);
   LCD_Show_Word32(255,10+47*4,"退出",2);
  }break;
  case 3:
  {   LCD_Show_Word32(0,10+47,"通道参数设置",6);
   LCD_Show_Word32(0,10+47*2,"记录参数设置",6);
   BackColor=BLUE;
   LCD_Show_Word32(0,10+47*3,"日期时间设置",6);//第三行背景延时是蓝 {MOD} 
   BackColor=GREEN; 
   LCD_Show_Word32(0,10+47*4,"基本参数设置",6);
   LCD_Show_Word32(255,10+47*4,"退出",2);
  }
  break;
  case 4:
  {  LCD_Show_Word32(0,10+47,"通道参数设置",6);
   LCD_Show_Word32(0,10+47*2,"记录参数设置",6);
   LCD_Show_Word32(0,10+47*3,"日期时间设置",6);
   BackColor=BLUE;  
   LCD_Show_Word32(0,10+47*4,"基本参数设置",6);
   BackColor=GREEN;
   LCD_Show_Word32(255,10+47*4,"退出",2);
  }break;
  case 5:
  { LCD_Show_Word32(0,10+47,"通道参数设置",6);
   LCD_Show_Word32(0,10+47*2,"记录参数设置",6);
   LCD_Show_Word32(0,10+47*3,"日期时间设置",6); 
   LCD_Show_Word32(0,10+47*4,"基本参数设置",6);
   BackColor=BLUE;
   LCD_Show_Word32(255,10+47*4,"退出",2);
   BackColor=GREEN;
  }break;
  default :break; 


这个程序可以实现我想要的功能 但是程序太过繁琐 请高手指点指点 有没有什么方法能让程序变的简洁点
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
langwanglx
2019-08-23 22:47
void LCD_Show_Word32(u16 x, u16 y,u8 *p,u8 Len,u8 BK)
{ u16 temp;
    u8 i=0,j=0;
Width=32; High=32;    //被显示汉字的高度和宽度
for(i=0;i<Len;i++,p=p+2)
{ temp=*p;
temp><<=8;
temp|=*(p+1);
for(j=0;j<LENGTH(hzIndex);j++)
{
if(temp==hzIndex[j])  
{ /*显示汉字  break;*/
Ptr=DotTbl32[j];  //指向二维数组某一维的首地址  汉字字模数组
LCD_ShowChar(x,y,BK);
x+=32;
if(x>287)
{ y+=32;
}
break;
}
}
}
}


void LCD_ShowChar(u16 x, u16 y,u8 BK)
{  
 u8 pos=0,temp=0,t=0;
 /**********************   
 这四句 只是用于限定区域 并不决定其扫描方向
 满足如下条件 R80<R81-4  R82><R83
 具体看ili9320Datasheet R50-R53寄存器描述
 **************************/
 if((BK)&&(Ptr!=DotTbl32[84]))  //空格的背光是GREEN 特殊  背光标志
 BackColor=BLUE;
 else
 BackColor=GREEN;
 LCD_WriteReg(0x03,0x1018);
 LCD_WriteReg(R80,y);   
     LCD_WriteReg(R81,y+High-1);
 LCD_WriteReg(R82,319-x-Width+1);  
 LCD_WriteReg(R83,319-x);
     LCD_SetCourse(x,y);
 LCD_WriteRAM_Prepare();
 for(pos=0;pos<((Width*High)/8);pos++)
 {  
 temp=*(Ptr+pos); //在上一个函数Ptr已经指向该行的首地址
 for(t=0;t<8;t++)
 {  if(temp&0x80)
 LCD_WriteRAM(PointColor);
 else
 LCD_WriteRAM(BackColor);
       temp><<=1;
 }
 }
 LCD_WriteReg(R80,0); //这个区域 限定了LCD清屏区域 
 LCD_WriteReg(R81,239); //没有这个区域的限定 那么LCD凊屏时不能只丢数据
 LCD_WriteReg(R82,0);  //要先确定坐标 在丢数据 这样做MCU会很累!!
 LCD_WriteReg(R83,319);
 BackColor=GREEN;       
}

一周热门 更多>