段式液晶虽然跟数码管有所不同,但也有相同的地方,其七段分别为a,b,c,d,e,f,g 想要显示数据,就必须点亮相应的段。下面将通用的0~9的设置值为大家解释一下const uint16_t NumberMap[10]= { /*** *显示0 com1 com2 com3 com4 *seg3 [ 1d, 1e, 1f, 1a] *seg4 [ 1c, 1g ,1b , P5] *seg3 [ 1, 1, 1, 1] *seg4 [ 1, 0 ,1 , 1] * **/ /* 0 1 2 3 4 5 6 7 8 9 */ 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
通过图中的这张表,就可以清楚的明白,0~9是如何得到的!这个是通用的,只要大家静下心来好好想想,就会明白,为什么上面代码会是那样的!(大神请静静地飘过吧,让菜鸟们普及一下基础知识!谁让本菜鸟就这么菜呢!)
对于每一个LCD段式液晶屏,都有属于自己的一张表,它会告诉你com与seg之间的对应关系(虽然刚开始看到这幅图的我,根本无法理解,这究竟是何方神圣、、因为它看起来可以没有规律,看起来也挺有规律,但究竟是没看懂,后来的某个瞬间,突然发现,原来so easy!)先来看看我用的这个吧!
为了方便大家理解,我分几部分解释!① 看到图的第一眼,大家当然可以知道总共有8个7段数码管(貌似不是这么叫,大家将就一下)。② 有13组汉字词语,其上还有相应的标号:P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12P 13,想必这些词组的显示设置就需要这些相应的标号来设置了。③ 中间有2条横杠,还有个标号X,估计同理如上
下面我就教大家,如何利用上面的这张表,来写出相应的段式液晶寄存器缓存地址表!首先看看LCD缓冲寄存器,只要把你要显示的数据写入寄存器就OK了。首先,当然是要找到pin脚对应的seg标号,然后对应到STM8L152C6T6中找到相对应的seg标号。
例如:pin4 pin5 对应的STM8L152C6T6中的seg标号为seg3,seg4,则如图所示,就可以得到对应的a~g的缓冲地址位置!1a>s3[seg3]1b>s2[seg4]、、、、、、同理可得到其余的结果。
接下里就可以把地址写进去了!接下来就是写代码了:LCD->RAM[LCD_RAMRegister_10] &= (~0x80); LCD->RAM[LCD_RAMRegister_10] |=((NumberMap[user_num/10]) &0x80);// 1A LCD->RAM[LCD_RAMRegister_7] &= (~0x10); LCD->RAM[LCD_RAMRegister_7] |=((NumberMap[user_num/10]>>2)&0x10);// 1BLCD->RAM[LCD_RAMRegister_0] &= (~0x10); LCD->RAM[LCD_RAMRegister_0] |=((NumberMap[user_num/10>>2])&0x10);// 1C LCD->RAM[LCD_RAMRegister_0] &= (~0x08); LCD->RAM[LCD_RAMRegister_0] |=((NumberMap[user_num/10]>>1)&0x08);// 1D LCD->RAM[LCD_RAMRegister_3] &= (~0x80); LCD->RAM[LCD_RAMRegister_3] |=((NumberMap[user_num/10]<<4)&0x80);// 1E LCD->RAM[LCD_RAMRegister_7] &= (~0x08); LCD->RAM[LCD_RAMRegister_7]|=((NumberMap[user_num/10]<<1)&0x08); // 1F LCD->RAM[LCD_RAMRegister_4] &=(~0x01); LCD->RAM[LCD_RAMRegister_4]|=((NumberMap[user_num/10]>>1)& 0x01);// 1G
本次举例都是以第一个数码管为例!其余方法一样。