LCD段码屏 真值表转换


//以lcd段码屏驱动芯片TM1621D为例子
//
typedef union{
	struct{
		uint8_t a		:1;
		uint8_t b		:1;
		uint8_t c		:1;
		uint8_t d		:1;
		uint8_t e		:1;
		uint8_t f		:1;
		uint8_t g		:1;
		uint8_t dp		:1;
	}Bits;
	uint8_t Value;
}unionByte;//一位数码管显示共用体
typedef union{
	struct{
		uint8_t _0		:1;
		uint8_t _1		:1;
		uint8_t _2		:1;
		uint8_t _3		:1;
		uint8_t _4		:1;
		uint8_t _5		:1;
		uint8_t _6		:1;
		uint8_t _7		:1;
	}Bits;
	uint8_t Value;
}unionSegByte;//一位数码管段位转换共用体
//定义LCD屏驱动数据 根据驱动芯片 四位数内容数据
unionSegByte	unionSegByte1;
unionSegByte	unionSegByte2;
unionSegByte	unionSegByte3;
unionSegByte	unionSegByte4;
unionSegByte	unionSegByte5;
unionByte 		Byte[4];//定义四位数显示码值	如第一位显示‘0’则将码表数组中第0个元素0x3f赋给Byte[0]
uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};       //0-F 码表值 共阴 因为点亮其中一段需要写1
//lcd驱动数据 加载 转换
void lcd_data_load_conver(uint8_t *pdata)
{
	Byte[0].Value = table[pdata[0]];//将显示内容通过码表转换出对应码值 通过定义的共用体 对应的位将会自动转换成1或0
	Byte[1].Value = table[pdata[1]];
	Byte[2].Value = table[pdata[2]];
	Byte[3].Value = table[pdata[3]];
	    //以下转换关系需根据段码屏真值表一一对应 数据高位先发
	unionSegByte1.Value = 0;//清零显示数据
	unionSegByte1.Bits._6 = 0;//PM
	
	unionSegByte1.Bits._5 = (Byte[0].Bits.a | Byte[0].Bits.d | Byte[0].Bits.e | Byte[0].Bits.g);//1ADEG
	unionSegByte1.Bits._3 = Byte[0].Bits.b;//1B
	unionSegByte1.Bits._2 = Byte[0].Bits.c;//1C
	unionSegByte1.Bits._1 = Byte[1].Bits.e;//
	
	unionSegByte2.Value = 0;
	unionSegByte2.Bits._7 = Byte[1].Bits.f;//2F
	unionSegByte2.Bits._6 = Byte[1].Bits.g;//2G
	unionSegByte2.Bits._5 = Byte[1].Bits.d;//2D
	
	unionSegByte2.Bits._3 = Byte[1].Bits.a;//2A
	unionSegByte2.Bits._2 = Byte[1].Bits.b;//2B
	unionSegByte2.Bits._1 = Byte[1].Bits.c;//2C
	
	unionSegByte3.Value = 0;
	unionSegByte3.Bits._7 = state;//COL
	unionSegByte3.Bits._6 = 0;//AL
	unionSegByte3.Bits._5 = Byte[3].Bits.e;//4E
	
	unionSegByte3.Bits._3 = Byte[2].Bits.f;//3F
	unionSegByte3.Bits._2 = Byte[2].Bits.g;//3G
	unionSegByte3.Bits._1 = Byte[2].Bits.e;//3E
	
	unionSegByte4.Value = 0;
	unionSegByte4.Bits._7 = (Byte[2].Bits.a | Byte[2].Bits.d);//3AD
	unionSegByte4.Bits._6 = Byte[2].Bits.b;//3B
	unionSegByte4.Bits._5 = Byte[2].Bits.c;//3C
	
	unionSegByte4.Bits._3 = Byte[3].Bits.f;//4F
	unionSegByte4.Bits._2 = Byte[3].Bits.g;//4G
	unionSegByte4.Bits._1 = Byte[3].Bits.d;//4D
	
	unionSegByte5.Value = 0;
	unionSegByte5.Bits._7 = Byte[3].Bits.a;//4A
	unionSegByte5.Bits._6 = Byte[3].Bits.b;//4B
	unionSegByte5.Bits._5 = Byte[3].Bits.c;//4C

    LCD_DisplayBuf[0] = unionSegByte1.Value;
    LCD_DisplayBuf[1] = unionSegByte2.Value;
    LCD_DisplayBuf[2] = unionSegByte3.Value;
    LCD_DisplayBuf[3] = unionSegByte4.Value;
    LCD_DisplayBuf[4] = unionSegByte5.Value;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1621-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-08-07 *程序功能:1.LCD驱动:LCD显示0`F *免责声明:1.此程序为TM1621驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define uchar unsigned char //数据类型宏定义 #define uint unsigned int //数据类型宏定义 #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /******************TM1621模块命令定义*********************/ #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器 #define SYSEN 0x02 //打开系统振荡器 #define LCDOFF 0x04 //关LCD偏压 #define LCDON 0x06 //开LCD偏压 #define TONEON 0x12 //打开声音输出 #define TONEOFF 0x10 //关闭声音输出 #define XTAL 0x28 //外部接晶振 #define RC 0x30 //内部RC振荡 #define BIAS 0x52 //1/3偏压 4公共口 #define WDTDIS 0x0a //禁止看门狗 #define WDTEN 0x0e //开启看门狗 /********************定义控制端口**********************/ sbit CS=P2^1; sbit READ=P2^7; sbit WRITE=P2^0; sbit DATA=P1^7; /********************定义数据*************************/ uchar code Smg[16]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码 uchar code Tab0[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清 /********************延时函数*************************/ void delay_nms(uint n) { uint i; while(n--) for(i=0;i<500;i++); } /********************从高位写入数据*************************/ void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621,高位在前 { uchar i; for(i=0;i<Cnt;i++) { WRITE=0; if(Data&0x80;) //从最高位发送 DATA=1; else DATA=0; nop; nop; WRITE=1; Data<<=1; } WRITE=0; DATA=0; } /********************从低位写入数据*************************/ void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621,低位在前 { unsigned char i; for(i=0;i>=1; } WRITE=0; DATA=0; } /********************写入控制命令*************************/ void WriteCmd(uchar Cmd) { CS=0; nop; Write_Data_H(0x80,4); //写入命令标志100 Write_Data_H(Cmd,8); //写入命令数据 CS=1; nop; } /*********指定地址写入数据,实际写入后4位************/ void WriteOneData(uchar Addr, uchar Data) { CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 Write_Data_L(Data,4); //写入数据 CS=1; nop; } /*********连续写入方式,每次数据为8位,写入数据************/ void WriteAllData(uchar Addr,uchar *p,uchar cnt) { uchar i; CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 for(i=0;i<cnt;i++) //写入数据 { Write_Data_L(*p,8); p++; } CS=1; nop; } /*******************TM1621初始化**********************/ void TM1621_init() { CS=1; WRITE=1; DATA=1; nop; delay_nms(1); WriteCmd(BIAS); //1/3偏压 4公共口 WriteCmd(RC); //内部RC振荡 WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器 WriteCmd(WDTDIS); //禁止看门狗 WriteCmd(SYSEN); //打开系统振荡器 WriteCmd(LCDON); //开LCD偏压 } void main() { TM1621_init(); //开机初始化 delay_nms(1); WriteAllData(0,Tab0,16); //LCD不显示 while(1) { WriteAllData(0,Smg,16); //LCD显示0~F delay_nms(200); WriteAllData(0,Tab0,16); //LCD不显示 delay_nms(200); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值