📄 lcd.c
字号:
OutString(70+i*120,417,str1[i]);
if(Tab==3)
for(i=0;i<2;i++)
OutString(190+i*240,417,str5[i]);
}
else
{
if(Tab==0)
for(i=0;i<2;i++)
OutString(190+i*240,417,str6[i]);
if(Tab==1)
for(i=0;i<5;i++)
OutString(70+i*120,417,str2[i]);
if(Tab==2)
for(i=0;i<5;i++)
OutString(70+i*120,417,str3[i]);
if(Tab==3)
for(i=0;i<2;i++)
OutString(190+i*240,417,str7[i]);
}
}
uint JS_H(uchar *a,uchar i)
{
int j,sum=0;
for(j=0;j<i;j++)
sum+=a[j];
return sum;
}
//显示菜单选项 共 MenuMaxNum 行 一次显示8行 next 代表起始行数 隔行显示
void LCD_Menu(uchar i)
{
char str[MenuMaxNum][10]={
"--步进--","-- VD --","-- CYL--","测量方式","自动次数",
"角膜曲率","屏幕亮度","按键声音","输出打印",
"号码打印","--预览--","屏幕保护","用户信息","日期格式",
"时间模式","设置日期","设置时间","设置语言","附加功能",
};
char str1[MenuMaxNum][40]={
"SETP","--VD--","--CYL--","CLFF","AUTO NUM",
"-JMQL-","SCREEN LIGHT","SOUND","PRINT",
"NUM PRINT","-Y L-","SCREEN","USER INFO","DATA MODE",
"TIME MODE","SET DATA","SET TIME","SET LANGUAGE","ADD GN",
};
uint j;
if(Language==1)
for(j=0;j<8;j++)
OutString(menu_x+16,menu_y+j*32,str[j+i-1]);
else
for(j=0;j<8;j++)
OutString(menu_x+16,menu_y+j*32,str1[j+i-1]);
}
// 显示帮助内容 i 选择码 行距为5
void LCD_HELP(uint i)
{
char str[MenuMaxNum][40]={
"调整步进电机步进长度","选择不同测试类型","我也不明白?","测量方式好多种阿","可以测几次",
"角膜曲率","屏幕亮度","按键声音","输出打印",
"号码打印","时间预览","屏幕保护","用户信息","日期格式",
"时间模式","设置日期","设置时间","设置语言","附加功能",
};
char str1[MenuMaxNum][40]={
"fdjkhfkh","english","I KNOW","I KNOW","I KNOW",
"I KNOW","I KNOW","sound","printf",
"I KNOW","I KNOW","I KNOW","I KNOW","I KNOW",
"I KNOW","I KNOW","I KNOW","I KNOW","I KNOW",
};
CLR_Help();
if(Language==1)
OutString(help_x,help_y,str[i-1]);
else
OutString(help_x,help_y,str1[i-1]);
}
// 显示设置内容 i 选择码 行距为5
void LCD_SETTING(uint i)
{
uchar a,b,c=0;
//选项宽度最好不超过6个字
char str[60][40]={
"调整马达步进长度","0.25","0.12",
"设置VD类型","默认","欧洲人","隐型眼镜",
"-- CYL设置--",
"测量方式","手动测量默认值","自动测量","自动测量+打印",
"自动次数","1次","3次","5次","7次",
"角膜曲率",
"屏幕亮度","1<最亮>"," 2 "," 3 ","4<最暗>",
"按键声音","OFF(关)","MID(中)","ON(响)",
"输出打印","ALL","IMG()","ECONO()","OFF()",
"号码打印","ON()","OFF()","RESET()",
"--预览--",
"屏幕保护","OFF()","3分钟","5分钟","10分钟",
"用户信息",
"日期格式","-Y-M-D-","-D-M-Y","-M-D-Y",
"时间模式","12H()","24H()",
"设置日期",
"设置时间",
"请选择操作语言","中文","ENGLISH",
"附加功能",
};
char str1[60][40]={
"SET-MOTOR","0.25","0.12",
"SET-VD-TYPE","默认","欧洲人","隐型眼镜",
"-- CYL设置--",
"CL MODE","手动测量默认值","自动测量","自动测量+打印",
"AUTO NUM","1次","3次","5次","7次",
"JMQL",
"SCREEN","1<MAX>"," 2 "," 3 ","4<MIN>",
"SOUND","OFF(关)","MID(中)","ON(响)",
"OUT PRINT","ALL","IMG()","ECONO()","OFF()",
"NUM PRINT","ON()","OFF()","RESET()",
"--预览--",
"SCREEN","OFF()","3 M","5 M","10 M",
"USERING INFORMATION",
"DATA MODE","-Y-M-D-","-D-M-Y","-M-D-Y",
"TIME MODE","12H()","24H()",
"SETTING DATE",
"SETTING TIME",
"SETTING LANGUAGE","中文","ENGLISH",
"附加功能",
};
uint x,y;
x=set_x+16;
y=set_y+16;
if(select_num[i-1]!=0 && select_num[i-1]<=6) //选择模式
{
if(Language==1) //中文
{
OutString(x+48,y,str[i-1+JS_H(select_num,i-1)]);
for(a=1;a<=select_num[i-1];a++)
{
int j=a;
b=i-1+JS_H(select_num,i-1)+a;
if(j>3)
{
c=1;
j-=3;
}
DrawRect(x+8+144*c,y+32*j,x+8+144*c+10,y+32*j+10,44);
OutString(x+22+144*c,y+32*j,str[b]);
}
}
else
{
OutString(x+48,y,str1[i-1+JS_H(select_num,i-1)]);
for(a=1;a<=select_num[i-1];a++)
{
int j=a;
b=i-1+JS_H(select_num,i-1)+a;
if(j>3)
{
c=1;
j-=3;
}
DrawRect(x+8+144*c,y+32*j,x+8+144*c+10,y+32*j+10,44);
OutString(x+22+144*c,y+32*j,str1[b]);
}
}
}
if(select_num[i-1]==0||select_num[i-1]>6) //调整模式
{
}
}
/******************** 按键 操作 ***********************/
/*保存键*/
void LCD_Save_Data(uint *Data_Temp)
{
int i;
for(i=0;i<MenuMaxNum;i++)
Data[i]=Data_Temp[i];
}
void LCD_Temp_Save(uint *Data_Temp,uint i,uint local_i)
{
Data_Temp[i-1]=local_i;
}
/*下移键*/
void LCD_MOVEDOWN(uint *a,uint *b)
{
int p,q;
p=*a;
q=*b;
if(q==MenuMaxNum&&p==8) return;
if(p==8)
{
q++;
CLR_Menu();
LCD_Menu(q-7);
LCD_Select(8);
*b=q;
}
else
{
LCD_Select(p++);
LCD_Select(p);
q++;
*a=p;
*b=q;
}
}
/*上移键*/
void LCD_MOVEUP(uint *a,uint *b)
{
int p,q;
p=*a;
q=*b;
if(p==1&&q==1) return;
if(p==1)
{
q--;
CLR_Menu();
LCD_Menu(q);
LCD_Select(1);
*b=q;
}
else
{
LCD_Select(p--);
LCD_Select(p);
q--;
*a=p;
*b=q;
}
}
/*进入键*/
void LCD_Enter(uint i)
{
SET_Enter();
LCD_SETTING(i);
}
/*保存键*/
void LCD_Save()
{
LCD_Board_P();
Draw_Board();
drawbmp(Board_x+70,Board_y+20,save,sizeof(save));
OutString(Board_x+34,Board_y+80,"确定要保存吗?");
}
/*退出键*/
void LCD_Exit()
{
LCD_Board_P();
Draw_Board();
drawbmp(Board_x+70,Board_y+20,exit,sizeof(exit));
OutString(Board_x+30,Board_y+80,"确定要直接退出吗?");
}
// 按键处理
void DoKey(UCHAR KeyValue)
{
void SelectState(UCHAR);
switch(CurState)
{
// 设置模式下的相应处理
case SETSTATE:
//第一层按键操作
if(Layle==1)
{
if(KeyValue==32) //上键
{
Button_Press(1);
LCD_MOVEUP(&local,&i);
LCD_HELP(i);
LCD_Scroll_UP(i);
}
if(KeyValue==1) //下键
{
Button_Press(2);
LCD_MOVEDOWN(&local,&i);
LCD_HELP(i);
LCD_Scroll_DOWN(i);
}
if(KeyValue==16) //进入键
{
CLR_Setting();
Button_Press(3);
Button_Change(2);
LCD_Enter(i);
Change_Set_Iint(i,Data_Temp);
local_i=Data_Temp[i-1];
Layle=2;
}
if(KeyValue==4) //保存键
{
Button_Press(4);
Button_Change(3);
LCD_Save();
Layle=3;
}
if(KeyValue==64) //退出键
{
Button_Press(5);
Button_Change(0);
LCD_Exit();
Layle=4;
}
}
//第二层按键操作
if(Layle==2)
{
if(KeyValue==32) //改变数值+
{
Button_Press(1);
if(select_num[i-1]!=0)
Change_Set_Up(&local_i);
}
if(KeyValue==1) //改变数值-
{
Button_Press(2);
if(select_num[i-1]!=0)
Change_Set_Down(i,&local_i);
}
if(KeyValue==4) //保存修改数据
{
Button_Press(4);
Button_Change(1);
LCD_Temp_Save(Data_Temp,i,local_i);
LCD_Board_P();
Draw_Board();
drawbmp(Board_x+70,Board_y+20,exit,sizeof(exit));
OutString(Board_x+40,Board_y+80,"设置成功!");
tm_delay(100);
LCD_Board_V();
if(i==18) //修改显示生效
{
L_Tab=2; //改变语言标记
//LcdMain();
SelectState(SETSTATE);
}
Layle=1;
//LcdMain();
SelectState(SETSTATE);
}
if(KeyValue==64) //返回第一层
{
CLR_Setting();
Button_Press(5);
Button_Change(1);
Layle=1;
drawbmp(menu_x+290,menu_y+30,logo,sizeof(logo));
}
}
//顶层保存层
if(Layle==3)
{
if(KeyValue==1) //确认
{
Button_Press(2);
LCD_Save_Data(Data_Temp);
Draw_Board();
drawbmp(Board_x+70,Board_y+20,set_ok,sizeof(set_ok));
OutString(Board_x+40,Board_y+80,"保存成功!");
tm_delay(100);
LCD_Board_V();
Button_Change(1);
Layle=1;
}
if(KeyValue==4) //返回
{
Layle=1;
Button_Press(4);
Button_Change(1);
LCD_Board_V();
}
}
//顶层退出层
if(Layle==4)
{
if(KeyValue==1) //确认
{
Button_Press(2);
L_Tab=1;
}
if(KeyValue==4) //返回
{
Layle=1;
Button_Press(4);
Button_Change(1);
LCD_Board_V();
}
}
break;
case 2:
break;
}
}
// 设置状态初始化
void SetStateInit(void)
{
if(L_Tab==1)
LCD_Data_Iint(Data_Temp); //导入设置值
Language=Data_Temp[17]; //语言选择
Lcd_Clr(); //LCD 清屏
SetTextColor(2); //设置前景色 即边框颜色
LCD_Menu_Iint(); //彩单边框初始化
LCD_Menu(1); //显示选项
LCD_Select(1); //选中第一项
LCD_HELP(1); //显示帮助
LCD_Scroll_Iint(); //画滚动
Button_Change(1); //画按键
drawbmp(set_x+50,set_y+30,logo,sizeof(logo));//公司标志
}
// 状态选择
void SelectState(UCHAR CurState)
{
switch(CurState)
{
case SETSTATE:
SetStateInit();
break;
case 2:
break;
}
}
// 状态刷新
void UpdateState(UCHAR CurState)
{
switch(CurState)
{
case SETSTATE:
break;
}
}
// LCD初始化
void Lcd_Init(void)
{
UINT fb = (UINT)DC - (LCD_XSIZE*32+12);
// 设置LCD颜色数、分辨率、显存地址
rLCDCON1 = (0)|(1<<2)|(0<<3)|(1<<4)|(DISMOD_8BITS<<5)|(0<<7)|(0x0<<8)|(0x0<<10)|(CLKVAL_MONO<<12);
rLCDCON2 = (LINEVAL)|(HOZVAL<<10)|(10<<21);
rLCDSADDR1 = (0<<27)|(fb>>1);
rLCDSADDR2 = (((fb+(LCD_XSIZE*LCD_YSIZE))>>1)&0x1fffff)|(13<<21)|(1<<29);
rLCDSADDR3 = (0 << 9) | ((LCD_XSIZE / 2) & 0x1FF);
// 设置抖动调色板
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
attr = 0;
bgcr = 0;
// 打开LCD显示
rLCDCON1 |= 1;
}
// LCD任务
void LcdMain(void *args)
{
// 相关变量初始化
CurState = SETSTATE;
// 相关画面初始化
SelectState(CurState);
while(1)
{
// 等待按键按下,等待半秒,其间有键按下则立即唤醒
// 可提高键盘的响应速度
int i = sm_p(smKey, 50);
// 屏幕保护状态则跳过按键处理
if(Greening) continue;
// 处理需要自动刷新的页面
UpdateState(CurState);
// 有键按下,执行按键处理
if(i == ENOERR)
{
DoKey(KeyValue);
}
//上面p操作已经延时,此处不需要延时
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -