段式LCD液晶显示屏的玩法

本次任务用华大单片机HC32L136驱动定制的段式液晶,4COM,34seg,1/3偏压。由于单片机本身有段式液晶驱动,根据数据手册可以知道其工作过程及控制方法。

 

过程分2步:1,配置硬件驱动寄存器。2,根据具体液晶情况,取模,定义联合结构体。

步骤1可以查看数据手册,根据步骤配置写程序配置程序如下:4COM,34个seg从seg0到seg34

步骤2 液晶的具体情况如下2图

#define 	LcdSingMask 		0x00

#define         LcdSeg_a		0x80
#define         LcdSeg_b		0x40
#define         LcdSeg_c		0x20
#define         LcdSeg_d		0x10
#define         LcdSeg_e		0x02
#define         LcdSeg_f		0x04
#define         LcdSeg_g		0x08

并通过宏定义对0-f 和u 取模

#define		 Char_0		LcdSeg_a+LcdSeg_b+LcdSeg_c\
				 +LcdSeg_d+LcdSeg_e+LcdSeg_f

				 	
#define  	Char_1		LcdSeg_b+LcdSeg_c


#define		Char_2		LcdSeg_a+LcdSeg_b\
				 +LcdSeg_d+LcdSeg_e+LcdSeg_g
	
			 	
#define		Char_3		LcdSeg_a+LcdSeg_b+LcdSeg_c\
				 +LcdSeg_d+LcdSeg_g
	
			 	
#define		Char_4		LcdSeg_b+LcdSeg_c\
				 	+LcdSeg_f+LcdSeg_g


#define		Char_5		LcdSeg_a+LcdSeg_c\
				+LcdSeg_d+LcdSeg_f+LcdSeg_g


#define		Char_6		LcdSeg_a+LcdSeg_g+LcdSeg_c\
				 +LcdSeg_d+LcdSeg_e+LcdSeg_f


#define		Char_7		LcdSeg_a+LcdSeg_b+LcdSeg_c
				 	

#define		Char_8		LcdSeg_a+LcdSeg_b+LcdSeg_c\
				 +LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g


#define		Char_9		LcdSeg_a+LcdSeg_b+LcdSeg_c\
				 +LcdSeg_d+LcdSeg_f+LcdSeg_g

				 	
#define		Char_A		LcdSeg_a+LcdSeg_b+LcdSeg_c\
				+LcdSeg_e+LcdSeg_f+LcdSeg_g


#define		Char_b 		LcdSeg_c\
				+LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g

				 	
#define		Char_C 		LcdSeg_a+LcdSeg_f+LcdSeg_e+LcdSeg_d


#define		Char_d		LcdSeg_b+LcdSeg_c+LcdSeg_d\
	                         +LcdSeg_e+LcdSeg_g

#define		Char_E		LcdSeg_a\
				 +LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g

#define		Char_F		LcdSeg_a+LcdSeg_f+LcdSeg_e+LcdSeg_g


#define		Char_H	 	LcdSeg_b+LcdSeg_c+LcdSeg_e+LcdSeg_f+LcdSeg_g

#define 	Char_L    	LcdSeg_d+LcdSeg_e+LcdSeg_f

从图一可以看到 基本上每两个seg能完全配置一个数码管,值得一提的是 ,我通过union来管理他们,简洁明了

typedef  union {  
	 	uchar  LCD_LgcBuf[Gcst_LCDBufSize];
		struct{	
				struct
				{
                                        unsigned char Sign_1BC:1;
                                        unsigned char Sign_2E:1;
					unsigned char Sign_2G:1;
                                        unsigned char Sign_2F:1;
					unsigned char Sign_2D:1;
					unsigned char Sign_2C:1;
					unsigned char Sign_2B:1;
					unsigned char Sign_2A:1;
					
				}Sign_SEG5_6;
			      struct
				{
					unsigned char Sign_3H:1;
					unsigned char Sign_3E:1;
					unsigned char Sign_3G:1;
					unsigned char Sign_3F:1;
					unsigned char Sign_3D:1;
					unsigned char Sign_3C:1;
					unsigned char Sign_3B:1;
					unsigned char Sign_3A:1;
				}Sign_SEG7_8;
			    struct
				{
					unsigned char Sign_P1:1;
					unsigned char Sign_5E:1;
					unsigned char Sign_5G:1;
					unsigned char Sign_5F:1;
					unsigned char Sign_5D:1;
					unsigned char Sign_5C:1;
					unsigned char Sign_5B:1;
					unsigned char Sign_5A:1;
				}Sign_SEG9_10;
				struct
				{
					unsigned char Sign_6BC:1;
					unsigned char Sign_7E:1;
					unsigned char Sign_7G:1;
					unsigned char Sign_7F:1;
					unsigned char Sign_7D:1;
					unsigned char Sign_7C:1;
					unsigned char Sign_7B:1;
					unsigned char Sign_7A:1;
				}Sign_SEG12_13;
			     struct
				{
					unsigned char Sign_8H:1;
					unsigned char Sign_8E:1;
					unsigned char Sign_8G:1;
					unsigned char Sign_8F:1;
					unsigned char Sign_8D:1;
					unsigned char Sign_8C:1;
					unsigned char Sign_8B:1;
					unsigned char Sign_8F:1;
				}Sign_SEG14_15;
				struct
				{
					unsigned char Sign_P2:1;
					unsigned char Sign_10E:1;
					unsigned char Sign_10G:1;
					unsigned char Sign_10F:1;
					unsigned char Sign_10D:1;
					unsigned char Sign_10C:1;
					unsigned char Sign_10B:1;
					unsigned char Sign_10A:1;
				}Sign_SEG18_19;
				struct
				{
					unsigned char Sign_11BC:1;
					unsigned char Sign_12E:1;
					unsigned char Sign_12G:1;
					unsigned char Sign_12F:1;
					unsigned char Sign_12D:1;
					unsigned char Sign_12C:1;
					unsigned char Sign_12B:1;
					unsigned char Sign_12A:1;
				}Sign_SEG19_20;
				struct
				{
					unsigned char Sign_MIN:1;
					unsigned char Sign_13E:1;
					unsigned char Sign_13G:1;
					unsigned char Sign_13F:1;
					unsigned char Sign_13D:1;
					unsigned char Sign_13C:1;
					unsigned char Sign_13B:1;
					unsigned char Sign_13A:1;
				}Sign_SEG21_22;
				struct
				{
					unsigned char Sign_P3:1;
					unsigned char Sign_15E:1;
					unsigned char Sign_15G:1;
					unsigned char Sign_15F:1;
					unsigned char Sign_15D:1;
					unsigned char Sign_15C:1;
					unsigned char Sign_15B:1;
					unsigned char Sign_15A:1;
				}Sign_SEG24_25;	
				。。。。。。。。等等 	
			}Signs;		
	 	}UnDef_LcdBuf;

这里初始化每个结构体时,要把低为放前边

我把一些特殊的值单独赋值,比如“当前”,“金额”。因为这些不是数码,要根据特殊情况来置位。同样用到宏定义。

#define         Sign_1_Dat  		GStr_LcdBuf.Signs.Sign_SEG5_6.Sign_1BC
#define         Sign_P1_Dat  		GStr_LcdBuf.Signs.Sign_SEG9_10.Sign_P1
#define         Sign_2_Dat  		GStr_LcdBuf.Signs.Sign_SEG12_13.Sign_6BC
#define         Sign_P2_Dat  		GStr_LcdBuf.Signs.Sign_SEG18_19.Sign_P2
。。。。。。
#define         Dis_Point1  		Sign_1_Dat=1
#define         Dis_Point2  		Sign_P1_Dat=1
#define         Dis_Point3  		Sign_2_Dat=1
#define         Dis_Point4  		Sign_P2_Dat=1

取模和液晶对应起来后,就可以写基础的赋值程序了。

赋值程序如下:

#define PTEMP_RAM0         (volatile uint32_t*)&M0P_LCD->RAM0
#define PTEMP_RAM1         (volatile uint32_t*)&M0P_LCD->RAM1
#define PTEMP_RAM2         (volatile uint32_t*)&M0P_LCD->RAM2
#define PTEMP_RAM3         (volatile uint32_t*)&M0P_LCD->RAM3
#define PTEMP_RAM4         (volatile uint32_t*)&M0P_LCD->RAM4
#define PTEMP_RAM5         (volatile uint32_t*)&M0P_LCD->RAM5
#define PTEMP_RAM6         (volatile uint32_t*)&M0P_LCD->RAM6
#define PTEMP_RAM7         (volatile uint32_t*)&M0P_LCD->RAM7

void Screen_convert(void) 
{

	*(LCD_StartAddr)=GStr_LcdBuf.LCD_LgcBuf[0]&0X0F;
	*(LCD_StartAddr+1)=(GStr_LcdBuf.LCD_LgcBuf[0]>>4);
	
	*(LCD_StartAddr+2)=GStr_LcdBuf.LCD_LgcBuf[1]&0X0F;	
	*(LCD_StartAddr+3)=(GStr_LcdBuf.LCD_LgcBuf[1]>>4);
		
	*(LCD_StartAddr+4)=GStr_LcdBuf.LCD_LgcBuf[2]&0X0F;
	*(LCD_StartAddr+5)=(GStr_LcdBuf.LCD_LgcBuf[2]>>4);

	*(LCD_StartAddr+6)=GStr_LcdBuf.LCD_LgcBuf[3&0X0F];
	*(LCD_StartAddr+7)=(GStr_LcdBuf.LCD_LgcBuf[3]>>4);

	*(LCD_StartAddr+8)=GStr_LcdBuf.LCD_LgcBuf[4]&0X0F;	
	*(LCD_StartAddr+9)=(GStr_LcdBuf.LCD_LgcBuf[4]>>4);	

	*(LCD_StartAddr+10)=GStr_LcdBuf.LCD_LgcBuf[5]&0X0F;
	*(LCD_StartAddr+12)=(GStr_LcdBuf.LCD_LgcBuf[5]>>4);	

	*(LCD_StartAddr+13)=GStr_LcdBuf.LCD_LgcBuf[6]&0X0F;		
	*(LCD_StartAddr+14)=(GStr_LcdBuf.LCD_LgcBuf[6]>>4);	
	
	*(LCD_StartAddr+15)=GStr_LcdBuf.LCD_LgcBuf[7]&0X0F;		
	*(LCD_StartAddr+16)=(GStr_LcdBuf.LCD_LgcBuf[7]>>4);	

	*(LCD_StartAddr+17)=GStr_LcdBuf.LCD_LgcBuf[8]&0X0F;		
	*(LCD_StartAddr+18)=(GStr_LcdBuf.LCD_LgcBuf[8]>>4);	
}
LCD_StartAddr为寄存器首地址,数据手册有。把一个字节分为高低4位,赋值给连续的两个显示寄存器,就可正常显示一个数码管的数字了。接下来介绍怎么王数组里填充数值。
<pre name="code" class="objc">void Dis_1char(uchar PuB_position,uchar PuB_data)
{
	uchar LuW_Dat;
	LuW_Dat=GAuB_char_tbl[PuB_data];
	switch(PuB_position)
		{
		case 0: GStr_LcdBuf.LCD_LgcBuf[2]=LuW_Dat;break;
		case 1: GStr_LcdBuf.LCD_LgcBuf[1]=LuW_Dat;break;
		case 2: GStr_LcdBuf.LCD_LgcBuf[0]=LuW_Dat;break;
		case 3: GStr_LcdBuf.LCD_LgcBuf[3]|=(LuW_Dat&0xf0);GStr_LcdBuf.LCD_LgcBuf[4]|=(LuW_Dat&0x0f);break;
		case 4: zhihuan(LuW_Dat);GStr_LcdBuf.LCD_LgcBuf[5]=LuW_Dat;break;
		case 5: zhihuan(LuW_Dat);GStr_LcdBuf.LCD_LgcBuf[6]=LuW_Dat;break;
		case 6: zhihuan(LuW_Dat);GStr_LcdBuf.LCD_LgcBuf[7]=LuW_Dat;break;
		case 7: zhihuan(LuW_Dat);GStr_LcdBuf.LCD_LgcBuf[8]=LuW_Dat;break;
		default: break;
		}

}

这里要注意GStr_LcdBuf.LCD_LgcBuf[?]的顺序和要显示的位置的关系,和图一一一对应,比如要显示0位置时,可根据图1的 要用9A-9C,K那两个seg 即GStr_LcdBuf.LCD_LgcBuf[2]。位置3,有点特殊,他分别用到了数组3的高4位,和数组4的低四位。位置4-7,高低四位又反过来,所以要加zhihuan(LuW_Dat);实现高低4为互换。

 

#define zhihuan(dat)  ((dat>>4)|(dat<<4))

了解基本的显示程序后,显示的步骤为:

1,LCD_Init()

2,Dis_1char(PuB_position,PuB_data),,还可以有Sign_Kwh_Dat、Dis_Jin_e、Dis_Point0之类。

3,Screen_convert()

 

 

 

 

 

 

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值