« 上一篇下一篇 »

TFT_LCD显示与按键连按处理

一、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则相反。具体解释请阅读代码及其注释。

附件:按键与显示函数代码

按键处理_支持连按.txt