« 上一篇下一篇 »

显示与按键技术总结

1、数码管闪烁

使用工具:两个定时器T0、T1(以51核为例)

实现方法:T0用作数码管正常显示,T1用于控制数码管闪烁。

具体说明:T0定时时间为1ms,在其中断里进行段位选控制;T1由按键控制打开,闪烁按键按下,开T1,定时时间64ms(可修改),闪烁控制为修改其段码,涉及到一点小算法原理。

duanxuan_mid_2[bit_6] = (duanxuan_sml[bit_6] - duanxuan_mid_2[bit_6]); //闪烁处理,改变对应段码

算法原理:如果你想控制一个数的更改,如第1次为3,第2次为9,第3次为3...,如此循环,那么,取这两数之和,即 3 + 9 = 12 ,然后在定时器里,编写代码,i = 12 - i;    其中i为每次进入定时器修改的值,它每进入一次定时器就会改变,设i初值为3,则依次变换为9,3,9,3...,利用这个原理,就可以实现闪烁,即我们用“当前数值段码”与“灭”的段码相加,得到一个“常数”,然后在定时器里用“常数” - "当前数值段码" = result,然后把这个result赋给存储段码的变量,并送显示,这时就会灭了,而下一次就会亮,当然,这里的下一次的“当前数值段码”就是result的值了,如此亮灭亮灭...,就实现了闪烁功能,闪烁间隔为T1定时时间。

中间问题:“常数”怎么来?我们可以使用查表法,即用一个数值不会被改变的数组存储所有段码,送与显示的变量属于一个“中间数组”,最后的结果就是用“常数”数组的值 - “中间数组” ,然后把这个结果再赋给“中间数组”,即上述代码。

2、通用显示处理函数

/**************************************************************
函数功能:对指定数值进行显示处理
参数:num
输出:无
***************************************************************/
void LCD_DisplayNum(ulong num)
{ 
   ulong temp=num; //ulong可以满足处理足够大的数
   uchar  len=0; //记录数值的位数
    do//这个循环用以计算数值的总位数,并赋给变量len.
    {
        temp = temp/10;//temp每减少1位,len+1,直到temp为0,len就记录了temp是几位数
        len++;
    }
    while(temp);
    len--;      //这里len在读取数值前要先减1,因为后面用的是do while,即先执行一次,再做判断,所以后面
                //判断的值要比总位数少1。且为了方便显示,如,显示的第0位为数值的第1位,相差1,所以减1.
    do
    { 
      temp=num%10;//读当前数值最低位
       duanxuan_big_mid[len] = duanxuan_sml[temp];  //送数码管显示
      num=num/10;//num去掉当前数值最低位
    }
    while(len--);//先判断再减1   
}

该程序可直接调用,可用于数码管显示,液晶屏显示(需要稍做修改)。

原理:第1个do...while计算出了被处理数据的位数;第2个do...while从最低位向高位依次进行显示。

优点:1、使显示处理更加人性化。无论送的数值是几位,都能够自行计算与显示。而像取模那种方式则需要每次根据实际数值修改程序,太过死板。

          2、程序运行更加流畅。如果用取模那种方式,基本上每一位都要求模求余,所以程序运行时会很慢,有时甚至死机,而此方式没有这种问题。

          3、占用变量更少。这里就只用到两个变量,一个读值,一个记录位数,而取模法,如果一个数是6位,那么要6个变量来存储每一位的值,而如果位数再多一点,就要更多的变量与内存,可以说是弱爆了。

感悟:数据结构及算法太过重要了。懂算法的与不懂算法的写出来的代码根本就不是一个级别的,所以我必须要加强这方面的学习。