指针在液晶屏显示中的用法(二)

本文纯属虚构,如有雷同,基本不可能。

张三受到保洁阿姨点拨之后,爱上了爬楼。坚持了半个月以后,竟然可以一口气上八楼,脸不红、气不喘。饭量也得到了很大的提升,以至于公司食堂在考虑要不要收他双人份的伙食费。

这天,张三在爬楼的时候遇到了保洁阿姨,于是上前打招呼。

张三:阿姨好,我现在可以一口气上八楼了!

阿姨:嗯,听说了。

张三:谁?

阿姨:食堂大妈!她们还说你现在太能吃,要多收你伙食费。

张三:额….

QQ截图20190420143135

阿姨:最近忙什么呢?

张三:哦,对了阿姨,我们老板又让我给他改界面。一开始只是显示一些参数,这倒还好。后来要在屏幕上设定一些参数,设定的时候,要在相应位置显示光标。一个页面可能要设置四五个参数。

阿姨:还好吧,很难吗?

张三:不难,就是麻烦。 这个屏幕虽然有光标显示的功能,但是不符合要求。它就像word里的光标一样,写入一个字,光标自动后移。但实际上,我们设定的时候,是要求光标固定在一个位置不要动的。所以我百度了一下,用纯软件的方式实现的。

进入设定状态的时候,在特定位置循环显示” ”和”_”,循环时间是几百个微秒,这样人眼能看到。开始的时候,光标显示部分的函数是这样写的:

if(A_Step == 1) //页面A的第一处光标
{
    if(cursor_cnt >= 500) //延时计数
    {
        Lcd1602A _SetPoint(1,8);
        Lcd1602A _WriteData('_');
    }
    else
    {
        Lcd1602A _SetPoint(1,8);
        Lcd1602A _WriteData(A[0][8]);
    }
}
else if(A_Step == 2)
{
    if(cursor_cnt >= 500)
    {
        Lcd1602A _SetPoint(1,12);
        Lcd1602A _WriteData('_');
    }
    else
    {
        Lcd1602A _SetPoint(1,12);
        Lcd1602A _WriteData(A[0][12]);
    }
}
else if(A_Step == 3)
{
    if(cursor_cnt >= 500)
    {
        Lcd1602A _SetPoint(2,10);
        Lcd1602A _WriteData('_');
    }
    else
    {
        Lcd1602A _SetPoint(2,10);
        Lcd1602A _WriteData(A[1][10]);
    }
}

阿姨:这么罗嗦?

张三:是的。后来我想指针能发挥什么作用,于是试了一下,真的被我发现了。跟之前您告诉我的方法类似,我也定义了一个指针数组PageA_p(页面A的),把这几个光标的地址存了下来。虽然Lcd1602A _SetPoint(2,10); 这个函数要送入两个值,一个行一个列。但是我可以通过光标地址和数组首地址算出这两个值。数组里的元素地址都是连续的,所以这就是个小学生的计算题。

于是程序变成了这样,不管有几处光标,这几行程序都能搞定:

if(cursor_cnt >= 500)
{
    Lcd1602A _SetPoint((PageA_p[A_Step - 1] - A[0])/16 + 1,( PageA _p[A_Step - 1] - A[0])%16);
    Lcd1602A _WriteData('_');
}
else
{
    Lcd1602A _SetPoint((PageA _p[A_Step - 1] - A[0])/16 + 1,(PageA_p[A_Step - 1] - A[0])%16);
    Lcd1602A _WriteData(*PageA _p[A_Step - 1]);
}

阿姨:不错,学会举一反三了。另外,勤洗头,你这头发跟鸟窝似的,看着碍眼。你们这些工程师啊,有头发的时候不爱洗,没头发的时候不用洗,太懒了。

张三:好的阿姨,您走慢点,我跟不上了。

阿姨:我还有工作,先走了~

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据