在做工控开发的时候,有时需要获得按键输入的数值然后显示。当输入整数数据的时候是比较简单的,按键输入一个数字后,把之前的数据乘以10(十进制的话),然后加上当前输入的数字就可以,在需要显示的时候,把每一位数字按照规则编码后,用向左移位的方法依次存入一个显示数组中,然后再依次把显示数组每一位送出显示就行。
但是在处理有小数点的数据的时候要麻烦一点,因为你事前是不知道有多少位小数的,所以你就不能事前知道应该把那个小数点放到显示数组的哪一位。但是也不是没有解决的方法,可以这样做:
(1)先记录按键输入的数据到一个变量,还需记录输入了多少位小数
● 记录按键输入的数字位,所有的数字键输入的数据都存入一个变量data,这个变量包含了整数部分和小数部分。假设数字按键值为key,且是十进制的数据,那么每输入一个数字按键就进行累计,C代码如下:
data=data*10+key; //将每次输入的按键值累加到变量data
● 记录有没有输入小数点,输入了几位小数。可以定义一个变量DecimalNumber,初始化为0,当操作者点击了小数点后令DecimalNumber=1,当按了小数点后继续输入数字,那么就要继续用累加的方法记录输入了多少位小数,如:
按了小数点后按了一位数字(1位小数),令DecimalNumber=2;
又按了一位数字(2位小数),令DecimalNumber=3;
以此类推,那么这个变量DecimalNumber就记录了按没有按小数点,有多少位小数。
● 在以后参与计算的时候可以定义一个浮点数变量data1,判断DecimalNumber,当DecimalNumber≥2时,令data1=data/(10^(DecimalNumber-1)),就可以得到按键输入的完整的小数数据data1。
(2) 知道了data和DecimalNumber,怎么存入显示数组发送去显示?
● 定义一个显示数组dis[],用于按位存放待显示的数据,包括了整数、小数点和小数部分;
● 分为三部分处理:小数部分、小数点、整数部分。分步骤,依次将这三部分存入显示数组:
I.小数部分用循环指令,for或者while都行,根据DecimalNumber的值来将data的小数部分存入dis[]数组的低段部分,例如:
unsigned char i=0;//循环变量
for(i=2;i++;i<=DecimalNumber) //依次将小数部分由低到高存入数组dis[]
{ dis[i-2]= (data/(10^( i-2)))%10+’0’;// +’0’表示转换为ASCII码。 ^是幂函数,这里为了显示方便用^,实际应当用pow函数
}
II.将小数点存入显示数组dis[];
dis[DecimalNumber-1]=’.’;
III.还是用循环指令,将整数部分继续往左存入显示数组dis[],C代码如下:
for(i=DecimalNumber;i++;i<=n) //依次将整数部分由低到高存入数组dis[],n表示整数和小数部分一共预期有多少位数
{ dis= data/(10^( i-1))%10+’0’; }
如此一来,就把小数的全部数据存入了显示数组dis[]中,包括小数点,再发送给显示设备就可以了。思路是这样的,不过程序没有验证,仅供参考。
全文完。
|