最近在做一个可定时的插座。原计划降低成本,用数码管做为倒计时显示。后面想到除了定时通电,还需要定时断电,或许后面还要增加其他功能。这样数码管的表现力就不够了。刚好手上还有一块闲置的1602,于是就寻思着用它来做一个有设置菜单选择的显示。不好意思,扯得有点远了。。
1602我就不介绍了,大家都知道它具有自定义字符的功能,但是只能存储8个字符。按一般的思路,把字符写入CGRAM,然后取这8个定义好的字符来显示。但是,还可以用一种动态写入字符的方法。
动态写入字符就是在需要显示该字符之前,才把字符写入到CGRAM中。所以,我们取好的字模存放在ARDUINO上,在显示前才写入。还有一点要注意的是,显示坐标的设置应该放在显示之前,如果放在写入字符之前就不能正常显示。
//不能显示:
LCD_SetXY(line, column); //设置坐标
LCD_WriteCGRAM(index, fontB[fontnum]); //写入自定义字符
LCD_WriteData(index); //显示字符
//正常显示:
LCD_WriteCGRAM(index, fontB[fontnum]);
LCD_SetXY(line, column);
LCD_WriteData(index);
例如我现在需要将数字反显(反显要自定义),但是一共有0-9,10个数字,如果按一般思路只写入8个字符是肯定不能实现的了,但如果是动态写入呢。如果我要反显'1',那么我就将反显的数字'1'写入CGRAM。而要显示'4',就写入'4'覆盖原来的'1'在CGRAM中的内存。这样,把10个数字显示完,也只用到了一个自定义字符的空间。不过在同一时间也还是最多显示8个自定字符。我原来以为一个字符显示出来后,如果不刷新屏幕,这个字符是不会受影响的。而实际上当我尝试写入新的字符时(在不同位置显示),原来显示的字符也会改变成最新写入的字符。
虽然一次最多还是显示8个自定义字符,但在某些场合一个界面需要8个自定义字符,在另一个界面却需要另外8个自定义字符,就可以用这种方法实现。比如我就用来实现了菜单选项的反显,而且用这样即时写入字符的方法显示起来一点延迟也没有。
下面是我显示的效果图 反显"timer on"
设置选项2
时间设置
这个界面用自带的光标会挺方便的,但我的程序是在一个循环体里更新,光标效果不好。。
|