我现在用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;
这个程序可以实现我想要的功能 但是程序太过繁琐 请高手指点指点 有没有什么方法能让程序变的简洁点
{ 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;
}
一周热门 更多>