一、LCD数值显示处理
数值长度的计算
有时为了显示,我们需要计算一个数值的长度,然后再对其进行显示处理。那么,怎么才能计算出一个数据有多少位呢?答案很简单,假如我们得到的数据为temp,然后我们设一个存储它的长度值的变量,不妨认为它是len(初值为0),我们把temp对10求商,每进行一次这个运算,len就加1,如此循环,直到商为0,结束循环。举个例子,temp是768:768/10 = 76 ,len+1=1; 76/10 = 7,len+1 = 2; 7/10 = 0,len+1 = 3;这个循环我们可以用do...while来完成,代码如下:
pow()函数
假设有两个数x,y。那么我们有时就会需要计算x的y次幂。当然,C51库函数里面已经为我们想到了这一点。pow()函数就是这样一个工具,pow(x,y)即为计算x的y次幂,并将结果返回。具体的定义可以参考 Keil C51函数参考
数值从前往后显示
/************************************************************************************************
* 描述 : 显示{数字数值(0~4294967295)}.
* 参数 : Line,Column:行与列位置.
* num:数值(0~4294967295).
* 返回 : 无
* 说明 :
*************************************************************************************************/
void LCD_DisplayNum2(uint16_t Line,uint16_t Column, uint32_t num)
{
uint32_t temp=num;
uint32_t middle;
uint32_t middle_len;
static uint32_t before_len2;
uint16_t refcolumn =Column;
uint8_t refLine =Line,len=0;
//计算数值长度
do
{
temp = temp/10;
len++;
}
while(temp);
middle_len = len;
if(len<before_len2)//若当前数值长度较上一次小,则使得数值长度为较大值,以保证当前数值的最后一位正确显示,而避免上次数值最后一位残留
{
len = before_len2;
}
len--;
refcolumn -=len*LCD_Currentfonts->Width;//从前往后显示
do
{
middle = pow(10,len);//pow(x,y) 计算x 的 y 次幂 头文件:<math.h>
temp=num/(middle);
LCD_ShowChar(refcolumn,refLine,temp+'0');
refcolumn+=LCD_Currentfonts->Width;//从前往后显示
num=num%(middle);
}
while(len--);
before_len2 = middle_len;
}
上面是一段用TFT_LCD进行显示的函数,它可以自动计算数据长度,并从高位开始显示,不管前后两次数据的长度是否有所改变,它总是能够正确的显示数值。我们来梳理下函数的逻辑。
首先,我们的函数有3个参数,分别是行、列、数值,然后我们计算出数值长度,再把长度给middle_len这个变量存储,然后下面一句,当前数值长度是否小于上一次取得数值的长度,若是,则把长度修改为大的那个,然后再利用pow()函数从高位对数据进行显示。最后把本次取得数据的长度赋给before_len2,那这个变量是怎么保存上一次的数值长度的呢?这里我们用到了static,这样,它的值就会为上一次处理后的值,而不会被再次初始化。
二、按键处理
如何实现连按?
/***************************************************************************************************
* 描述 : 按键处理函数
* 参数 : 模式
* 返回 : 按键返回值
* 说明 :
*************************************************************************************************/
uint8_t KEY_Scan(uint8_t mode)
{
static u8 key_up=1; //按键松开标志
if(mode)
key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==0))
{
Delay_ms(10); //去抖动
key_up=0; //按键状态标志为按键按下
if(KEY0==0)return 1;//C规定:一个函数只能有一个返回值,这里只会返回4个中的1个,只要有一个地方返回了值,则会跳出函数,后面的语句都不再执行
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==0)return 4;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==1)//在不支持连按的情况下,在一次按键后如果不松开的话,按键标志永远都为按下状态
key_up=1;
return 0; // 无按键按下
}
上面的参数mode为1则支持连按,为0则相反。具体解释请阅读代码及其注释。
附件:按键与显示函数代码