OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3741|回复: 6

6键输入法—快捷方便数字输入法(更新图片)

[复制链接]

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-10-29 12:50:33 | 显示全部楼层 |阅读模式
主要应用一些参数输入上,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]

string_deal.c

3.29 KB, 下载次数: 66

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-29 14:46:20 | 显示全部楼层
谢谢分享~~~~~

楼主printf、sprintf用的很溜~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-10-29 15:22:47 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
马马虎虎。。。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-10-29 20:31:47 | 显示全部楼层
咋沉了呢。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-29 21:24:29 | 显示全部楼层
谢谢分享
.....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-10-29 21:31:40 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥深夜工作辛苦啊,可能发的东西大家不太感冒啊
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-11-9 15:12:48 | 显示全部楼层
更新高清靓图,从LCD上直接截出来的。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 01:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表