金牌会员
 
- 积分
- 1369
- 金钱
- 1369
- 注册时间
- 2014-2-13
- 在线时间
- 169 小时
|
主要应用一些参数输入上,6键【↑】【↓】【←】【→】【确认】【返回】操作方便快捷!!!
支持长度控制和小数点位控制,数据范围控制,输入提示。
上图:
看上去很普通嘛,怎么叫快捷方便呢?
例1、4.00修改为14.00
例1、4.02修改为4.2
这样操作是不是很简单快捷啊。。。
[mw_shl_code=c,true]static char str[14] = {' ','-','.','0','1','2','3','4','5','6','7','8','9','\0'};//可输入的字符
static char in_buf[23] = {0};//输入缓存区
static u8 num[23] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*******************************************************************************
* 函数名 : digital_input
* 描述 : 数字通用输入法
* 参数 : init_val :初始值
* point :当前小数点位数
* len_max :最大长度
* point_max:最大小数点位数
* max :上限
* min :下限
* caption :提示
* 返回值 : 返回小数点位数
*******************************************************************************/
static char *range_label[] = {"范 围:","Range:"};//输入范围
s8 digital_input(float *init_val, u8 point, u8 len_max, u8 point_max, float max, float min, char *caption)
{
u8 key_value; //接收按键返回值
float ret_val; //修改后的数据
char format_buf[7] = {0}; //字符长度控制
char buf[23] = {0};
u8 buf_ls[32] = {0};
u8 p_in = 0; //输入区位跟踪
u8 len = 0;
u8 flag = 0;
u8 cont_1 = 0;//计数
u8 cont_2 = 0;
u8 i;
if(len_max < point)//输入参数有误
{
printf("参数错误:len_max=%d point=%d\r\n",len_max,point);
return 0;
}
digital_input_init(max, min, caption);//纯数字输入法显示初始化
sprintf(format_buf, "%%%-d.%-df", len_max, point);//支持字符长度0~99,小数点位0~9,例:%-10.2f,%-06.2f
printf("格式控制:%s\r\n",format_buf);
memset(in_buf, 0, sizeof(in_buf));//清空缓存区
sprintf(in_buf, format_buf, *init_val);//把初值转换成字符串,控制小数点的位数
if(sizeof(in_buf) > len_max) in_buf[6] = '\0';//如果输入数据长度大于允许的数据长度,截断
// LCD_prints(102, 137, in_buf, 24, 0);//显示初始化量
printf("in_buf:%s\r\n",in_buf);
for(i=0;i<len_max;i++)//初始化每位字符在str[]的位置
{
switch(in_buf)
{
case ' ': num = 0;break;
case '-': num = 1;break;
case '.': num = 2;break;
case '0': num = 3;break;
case '1': num = 4;break;
case '2': num = 5;break;
case '3': num = 6;break;
case '4': num = 7;break;
case '5': num = 8;break;
case '6': num = 9;break;
case '7': num = 10;break;
case '8': num = 11;break;
case '9': num = 12;break;
default: break;
}
// printf("初始num[%d]=%d\r\n",i,num);
}
refurbish(0);//反白第一个键值'0',选中框默认在键盘区
while(1)
{
key_value = KEY_Scan(PRESS_CONT);//读按键
if(key_value==0) continue;//按键未按下则不能执行下面的语句
switch(key_value)
{
case Key_Right://【→】
case Key_Left: //【←】
{
if(key_value == 1)
{
if(p_in == 0) p_in = len_max-1;
else p_in--;
}
else
{
p_in++;
if(p_in > (len_max-1)) p_in = 0;
}
digital_input_init(max, min, caption);//纯数字输入法显示初始化
refurbish(p_in);
}break;
case Key_Down://【↓】
case Key_UP: //【↑】
{
if(key_value == Key_Down)
{
if(num[p_in] == 0) num[p_in] = 12;
else num[p_in]--;
}
else
{
num[p_in]++;
if(num[p_in] > 12) num[p_in] = 0;
}
in_buf[p_in] = str[num[p_in]];
// printf("num[%d]=%d\r\n",p_in,num[p_in]);
// printf("in_buf[%d]=%c\r\n",p_in,in_buf[p_in]);
digital_input_init(max, min, caption);//纯数字输入法显示初始化
refurbish(p_in);
}break;
case Key_Enter://【ok】
{
if(find_str_count((char*)in_buf, "-") > 1)//小数点出现次数不能大于1
{
flag = 1;//输入错误标志
printf("负号=%d\r\n",find_str_count((char*)in_buf, "-"));
}
else if(find_str_count((char*)in_buf, ".") > 1)//负号出现次数不能大于1
{
flag = 1;//输入错误标志
printf("小数点=%d\r\n",find_str_count((char*)in_buf, "."));
}
else//以上错误情况都不存在
{
flag = 0;//输入正确标志
}
if((flag == 0) && (find_str_count((char*)in_buf, "-") > 0))//负号'-'出现的次数有且只有一次
{
len = find_str((unsigned char*)in_buf, "-");//获取位置
printf("负号len=%d\r\n",len);
while(len)//减到数值第一个位置
{
if(in_buf[len-1] != ' ')//判断负号前有没有非空格的字符,如果有则返回错误
{
printf("负号位置错误\r\n");
flag = 1;//输入错误标志
break;
}
len--;
}
}
if((flag == 0) && (find_str_count((char*)in_buf, ".") > 0))//小数点'.'出现的次数有且只有一次,判断小数点位置之前必须排除负号'-'位置错误情况
{
cont_1 = 0;//清0
len = find_str((unsigned char*)in_buf, ".");//获取位置
printf("小数点len=%d\r\n",len);
while(len < (len_max-1))//不能超出数值的总长度
{
if(in_buf[len+1] != ' ')//计算小数点后出现数值的次数,如果次数超出输入限定的精度,返回错误
{
cont_1++;
}
len++;
}
printf("cont_1=%d\r\n",cont_1);
if(cont_1 > point_max)
{
printf("小数点位置错误\r\n");
flag = 1;//输入错误标志
}
else flag = 0;//输入正确标志
}
if(flag == 0)//输入正确
{
cont_2 = 0;//清0
len = len_max;
memset(buf, 0, sizeof(buf));//清空缓存区
for(i=0;i<len;i++)//清除空格
{
if(in_buf != ' ')
{
buf[cont_2] = in_buf;
cont_2++;
}
}
printf("buf:%s\r\n",buf);
ret_val = atof((char*)buf);
printf("%f\r\n",ret_val);
if((ret_val >= min) && (ret_val <= max))//超范围判断
{
printf("输出%f\r\n",ret_val);
*init_val = ret_val;//写入修改后的值
printf("小数点位数:%d\r\n",cont_1);
return cont_1;//返回小数位数
}
else//如果输入超出范围,则全部清空
{
if(!((max == 0) && (min == 0)))//无意义的范围,视为不使用
{
memset(buf_ls, 0, sizeof(buf_ls));//清空缓存区
sprintf((char*)buf_ls, "%.0f~%.0f", min, max);
LCD_string(102, 186, range_label[Cfg.Sys.Language], 0);//显示“范围”
LCD_string(174, 186, (char *)buf_ls, 0);
}
printf("输入超范围\r\n");
}
}
else
{
memset(buf_ls, 0, sizeof(buf_ls));//清空缓存区
sprintf((char*)buf_ls, "%.0f~%.0f", min, max);
LCD_string(102, 186, range_label[Cfg.Sys.Language], 0);//显示“范围”
LCD_string(174, 186, (char *)buf_ls, 0);
}
}break;
case Key_Esc://【exti】
{
LCD_Fill(1, 33, 478, 318,BLACK);//清操作栏,底色黑色
return -1;//取消操作返回-1
}//break;
default: break;
}
}
}
//通用数字输入法显示初始化
static void digital_input_init(float max,float min, char *caption)
{
u8 x;
u8 buf_ls[32] = {0};
LCD_Fill(90-3, 98-3, 390+3, 218+3, BLACK);//清对话框外围3个点范围
LCD_Fill(92, 100, 388, 124,WHITE);//提示栏填充白色
POINT_COLOR = WHITE;
LCD_DrawRectangle(90, 98, 390, 218);//对话框外框
LCD_DrawRectangle(100, 135, 379, 162);//输入栏外框
LCD_Fill(102, 137, 377, 160,WHITE);//输入栏填充白色
if(caption != NULL)//不使用提示字符,则不显示
{
//居中x坐标计算:所在容器的宽度/2 - it /2
x=(240-strlen((char*)caption)*6);//中点坐标+((strlen(caption))/2*24)/2
LCD_string(x, 100, caption, 0);//提示正在输入内容
}
if(!((max == 0) && (min == 0)))//无意义的范围,视为不使用
{
// LCD_string(102, 186, "范围:", 1);//显示范围
sprintf((char*)buf_ls, "%.0f~%.0f", min, max);
LCD_string(102, 186, range_label[Cfg.Sys.Language], 1);//显示“范围”
LCD_string(174, 186, (char *)buf_ls, 1);
}
}
static void refurbish(u8 n)//
{
u8 i;
u8 len = 0;
len = strlen(in_buf);
// printf("len=%d\r\n",len);
for(i=0;i<len;i++)//sel全部正常
{
LCD_printc(102+i*12, 137, in_buf, 24, 0);
}
LCD_printc(102+n*12, 137, in_buf[n], 24, 1);
}[/mw_shl_code]
|
|