⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jhf0001.c

📁 德州仪器系列内含液晶驱动的单片机
💻 C
字号:

#include  <msp430x44x.h>

#define  uchar   unsigned char
#define  uint   unsigned int
#define  ulong  unsigned long  

const unsigned char gc_lcd_convert[16]={0xd7,0x06,0xe3,0xa7,0x36,0xb5,0xf5,0x07,0xf7,0xb7,//0-9
									 0x77,0xf4,0xd1,0xe6,0xf1,0x71//A-F
									};
const unsigned char gc_lcd_convert1[16]={0x7d,0x60,0x3e,0x7a,0x63,0x5b,0x5f,0x70,0x7f,0x7b,//0-9
                                        				 0x77,0x4f,0x1d,0x6e,0x1f,0x17//A-F				
									};
const unsigned char gc_program_table[192]={
	/*此表为显示通信编程顺序表,表格排列顺序如下
	轮显编码(2个字节) 
	通信序号(2) 
	数据长度(1/2), 
	密码控制权限(1/2)
	起始地址(2,最高位为1时代表数据是内存中的数据此时的地址是对应0x200的偏移量,对应e2的地址是实际地址)
	固定显示码(5) 1-小数点位置 2-汉字 3-费率指示 4-历史数据 5-单位
	1-小数点位置 从高到低<上6,上4,上2,下6,下4,下3,下2,下1> 
	-每个量占12个字节*/
	
	/* (当前)正向有功总电能 */
	0x10,0xff,0x90,0x10,0x40,0x91,0x70,0x02,0x88,0x90,0x51,0xdc,// 85 e2-0x170  -0x1170	 当前正有功总电量kWh
	/* (当前)反向有功总电能 */
	0x13,0xff,0x90,0x20,0x40,0x91,0x84,0x02,0x88,0x90,0x61,0xdc,// 100 e2-0x184  -0x1184	 当前反有功总电量kWh
	/* (当前)正向无功总电能 */
	0x30,0xff,0x91,0x10,0x40,0x91,0x98,0x02,0x88,0x90,0x52,0x03,// 175 e2-0x198  -0x1198  当前正无功总电量kvarh
	/* (当前)反向无功总电能 */
	0x33,0xff,0x91,0x20,0x40,0x91,0xac,0x02,0x88,0x90,0x62,0x03,// 190 e2-0x1ac  -0x11ac	 当前反无功总电量kvarh
	
	/* (当前)正向有功总最大需量 */
	0x20,0xff,0xa0,0x10,0x30,0x03,0x40,0x08,0x0c,0x90,0x51,0x5c,// 115 e2-0x340 		 当前正有功总需量kW
	/* (当前)反向有功总最大需量 */
	0x23,0xff,0xa0,0x20,0x30,0x03,0x4f,0x08,0x0c,0x90,0x61,0x5c,// 145 e2-0x34f 		当前反有功总需量kW
	/* (当前)正向无功总最大需量 */
	0x40,0xff,0xa1,0x10,0x30,0x03,0x5e,0x08,0x0c,0x90,0x52,0x01,// 205 e2-0x35e 		当前正无功总需量kvar
	/* (当前)反向无功总最大需量 */
	0x43,0xff,0xa1,0x20,0x30,0x03,0x6d,0x08,0x0c,0x90,0x62,0x01,// 235 e2-0x36d 		当前反无功总需量kvar
	
	/* (当前)正相有功总最大需量发生时间 */
	0x20,0x01,0xb0,0x10,0x40,0x03,0xf4,0x72,0x2c,0x90,0x51,0x00,// 116 e2-0x3f4 		当前正有功总需量时间
	/* (当前)反相有功总最大需量发生时间 */
	0x23,0x01,0xb0,0x20,0x40,0x04,0x08,0x72,0x2c,0x90,0x61,0x00,// 146 e2-0x408 		当前反有功总需量时间
	/* (当前)正相无功总最大需量发生时间 */
	0x40,0x01,0xb1,0x10,0x40,0x04,0x1c,0x72,0x2c,0x90,0x52,0x00,// 206 e2-0x41c 		当前正无功总需量时间
	/* (当前)反相无功总最大需量发生时间 */
	0x43,0x01,0xb1,0x20,0x40,0x04,0x30,0x72,0x2c,0x90,0x62,0x00,// 236 e2-0x430 		当前反无功总需量时间

	/*日期及周次*/
	0x80,0xff,0xc0,0x10,0x41,0x92,0x93,0x38,0x20,0x00,0x40,0x00,// 555 e2-0xb16 0x1293	当前时间
	/*时间*/
	0x80,0x01,0xc0,0x11,0x31,0x92,0x97,0x6a,0x20,0x00,0x40,0x00,// 556 e2-0xb1a 0x1297	当前时间
	/*表号(低6位)*/
	0x82,0xff,0xc0,0x32,0x61,0x0b,0x2c,0x00,0x00,0x00,0x00,0x00,// 563 e2-0xb2c			无
	/*表号(高6位)*/
	0x82,0x01,0xc0,0x32,0x31,0x0b,0x2f,0x00,0x00,0x00,0x00,0x00,// 564 e2-0xb2f			无
										};

char     	c_disp_buf[6];
uint		ui_disp_num;
char     	c_data_long;
union    {unsigned long high;unsigned int middle;unsigned char low[4];}convert;
char     	*c_pointer;
char     	c_disp_buf[6];
char     	c_disp_mem[18];
uint     	ui_rotate_num;
char     	c_rotate_stat;//c_rotate_stat--轮显状态:是否允许轮显(时间到否)
char     	c_re_disp;//c_re_disp--1秒刷新标志
char     	c_xianshi_jishu;//
char     	c_tingxian_shijian;//
char     	c_tingxian_biaozhi;//
char     	c_xunxian_shijian;//
char     	c_xunxian_biaozhi;//


#pragma vector = BASICTIMER_VECTOR
__interrupt void BASICTIMER()
{
	P1OUT=P1OUT^0X20;

	c_re_disp=1;
	
	if(c_xunxian_biaozhi==1)
	{
		if(c_xianshi_jishu>=4)
		{
			c_xianshi_jishu=0;
			c_rotate_stat=1;
		}
		c_xianshi_jishu+=1;
		if(c_xunxian_shijian>=30)
		{
			c_xunxian_biaozhi=0;
			c_tingxian_biaozhi=1;
			c_tingxian_shijian=0;
		}
		c_xunxian_shijian+=1;
	}
	else
	{
		if(c_tingxian_shijian>5)
		{
			c_xunxian_biaozhi=1;
			c_xunxian_shijian=0;
			c_tingxian_biaozhi=0;
		}
		c_tingxian_shijian+=1;
	}
	
}

void lcd_fill(void)
{
	unsigned char i1;
	uint j1,j2;

	for(i1=0;i1<6;i1++)//清除上一次缓冲区数据
		c_disp_buf[i1]=0;

	j1=ui_rotate_num*12;//显示的编码在表中的位置

	if(gc_program_table[j1+2]==0xc0 &&gc_program_table[j1+3]==0x32)//表号特殊处理
		c_data_long=3;    
	else
		c_data_long=gc_program_table[j1+4]>>4;

	
	convert.low[0]=gc_program_table[j1+6];
	convert.low[1]=gc_program_table[j1+5] & 0x1f;
	j2=convert.middle;
	c_pointer=(char *)j2;//取得数据地址      
    	for(i1=0;i1<c_data_long;i1++)//内存中的数据是BCD码
        		c_disp_buf[i1]=*(c_pointer+i1);

    
	i1=c_disp_buf[0] & 0x0f;//填充变量数据
	c_disp_mem[17]=gc_lcd_convert1[i1];
	i1=c_disp_buf[0]>>4;
	c_disp_mem[0]=gc_lcd_convert[i1];
	i1=c_disp_buf[1] & 0x0f;
	c_disp_mem[2]=gc_lcd_convert[i1];
	i1=c_disp_buf[1]>>4;
	c_disp_mem[3]=gc_lcd_convert[i1];
	i1=c_disp_buf[2] & 0x0f;
	c_disp_mem[15]=gc_lcd_convert1[i1];
	i1=c_disp_buf[2]>>4;
	c_disp_mem[14]=gc_lcd_convert1[i1];
	i1=c_disp_buf[3] & 0x0f;
	c_disp_mem[13]=gc_lcd_convert1[i1];
	i1=c_disp_buf[3]>>4;
	c_disp_mem[12]=gc_lcd_convert1[i1];
	if(gc_program_table[j1+7]==0)//变量数据消隐-小数点在0位
	{
		j2=j1/12;
		if(j2<563 || j2>568)//表号用户号设备号不进行消隐
		{
			i1=0;
			if((c_disp_buf[3] & 0xf0)==0)            
				c_disp_mem[12]=0;
			else
				i1=1;
			if(((c_disp_buf[3] & 0x0f)==0) && i1==0)
				c_disp_mem[13]=0;
			else
				i1=1;

			if(((c_disp_buf[2] & 0xf0)==0) && i1==0)            
				c_disp_mem[14]=0;
			else
				i1=1;
			if(((c_disp_buf[2] & 0x0f)==0) && i1==0)
				c_disp_mem[15]=0;
			else
				i1=1;

			if(((c_disp_buf[1] & 0xf0)==0) && i1==0)            
				c_disp_mem[3]=0;
			else
				i1=1;
			if(((c_disp_buf[1] & 0x0f)==0) && i1==0)
				c_disp_mem[2]=0;
			else
				i1=1;
		}
		else
		{
			c_disp_mem[12]=0;
			c_disp_mem[13]=0;
		}
	}
	if(gc_program_table[j1+7]==1)//变量数据消隐-小数点在1位
	{
		i1=0;
		if((c_disp_buf[3] & 0xf0)==0)            
		    c_disp_mem[12]=0;
		else
		    i1=1;
		if(((c_disp_buf[3] & 0x0f)==0) && i1==0)
		    c_disp_mem[13]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[2] & 0xf0)==0) && i1==0)            
		    c_disp_mem[14]=0;
		else
		    i1=1;
		if(((c_disp_buf[2] & 0x0f)==0) && i1==0)
		    c_disp_mem[15]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[1] & 0xf0)==0) && i1==0)            
		    c_disp_mem[3]=0;
		else
		    i1=1;
		if(((c_disp_buf[1] & 0x0f)==0) && i1==0)
		    c_disp_mem[2]=0;
	}    
	if(gc_program_table[j1+7]==2)//变量数据消隐-小数点在2位
	{
		i1=0;
		if((c_disp_buf[3] & 0xf0)==0)            
		    c_disp_mem[12]=0;
		else
		    i1=1;
		if(((c_disp_buf[3] & 0x0f)==0) && i1==0)
		    c_disp_mem[13]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[2] & 0xf0)==0) && i1==0)            
		    c_disp_mem[14]=0;
		else
		    i1=1;
		if(((c_disp_buf[2] & 0x0f)==0) && i1==0)
		    c_disp_mem[15]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[1] & 0xf0)==0) && i1==0)            
		    c_disp_mem[3]=0;
	}    
	if(gc_program_table[j1+7]==4)//变量数据消隐-小数点在3位
	{
		i1=0;
		if((c_disp_buf[3] & 0xf0)==0)            
		    c_disp_mem[12]=0;
		else
		    i1=1;
		if(((c_disp_buf[3] & 0x0f)==0) && i1==0)
		    c_disp_mem[13]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[2] & 0xf0)==0) && i1==0)            
		    c_disp_mem[14]=0;
		else
		    i1=1;
		if(((c_disp_buf[2] & 0x0f)==0) && i1==0)
		    c_disp_mem[15]=0;
	}    
	if(gc_program_table[j1+7]==8)//变量数据消隐-小数点在4位
	{
		i1=0;
		if((c_disp_buf[3] & 0xf0)==0)            
		    c_disp_mem[12]=0;
		else
		    i1=1;
		if(((c_disp_buf[3] & 0x0f)==0) && i1==0)
		    c_disp_mem[13]=0;
		else
		    i1=1;
		    
		if(((c_disp_buf[2] & 0xf0)==0) && i1==0)            
		    c_disp_mem[14]=0;
	}    
	
	
	i1=gc_program_table[j1+1] & 0x0f;//填充显示编码
	c_disp_mem[10]=gc_lcd_convert1[i1];
	if(i1==0x0f)
		c_disp_mem[10]=0;
	i1=gc_program_table[j1+1] >> 4;
	c_disp_mem[9]=gc_lcd_convert1[i1];
	if(i1==0x0f)
		c_disp_mem[9]=0;
	i1=gc_program_table[j1] & 0x0f;
	c_disp_mem[8]=gc_lcd_convert1[i1];
	c_disp_mem[8]=c_disp_mem[8] | 0x80;//点显示序号的小数点
	
	i1=gc_program_table[j1] >> 4;
	c_disp_mem[6]=gc_lcd_convert[i1];
	
	if((gc_program_table[j1] & 0xf0)==0)//显示序号消隐
	    c_disp_mem[6]=0;
	if(gc_program_table[j1] ==0)
		c_disp_mem[8]=0x97;
	
	if((gc_program_table[j1+4]>>4)==2)//按照数据长度消隐,数据长度为2,3个字节进行消隐
	{
	    c_disp_mem[12]=0;
	    c_disp_mem[13]=0;
	    c_disp_mem[14]=0;
	    c_disp_mem[15]=0;
	}
	else
	{
	    if((gc_program_table[j1+4]>>4)==3)
	    {
	        c_disp_mem[12]=0;
	        c_disp_mem[13]=0;
	    }
	}
    
	if((gc_program_table[j1+7] & 0x01)==0x01)//点小数点
	    c_disp_mem[0]=c_disp_mem[0] | 0x08;
	if((gc_program_table[j1+7] & 0x02)==0x02)
	    c_disp_mem[2]=c_disp_mem[2] | 0x08;
	if((gc_program_table[j1+7] & 0x04)==0x04)
	    c_disp_mem[3]=c_disp_mem[3] | 0x08;
	if((gc_program_table[j1+7] & 0x08)==0x08)
	    c_disp_mem[15]=c_disp_mem[15] | 0x80;
	if((gc_program_table[j1+7] & 0x10)==0x10)
	    c_disp_mem[13]=c_disp_mem[13] | 0x80;
	if((gc_program_table[j1+7] & 0x20)==0x20)
	    c_disp_mem[17]=c_disp_mem[17] | 0x80;
	if((gc_program_table[j1+7] & 0x40)==0x40)
	    c_disp_mem[14]=c_disp_mem[14] | 0x80;
	if((gc_program_table[j1+7] & 0x80)==0x80)
	    c_disp_mem[12]=c_disp_mem[12] | 0x80;
    
	c_disp_mem[1]=gc_program_table[j1+8];//填充汉字
	c_disp_mem[4]=gc_program_table[j1+9];//填充费率数
	c_disp_mem[5]=gc_program_table[j1+10];//填充历史数据指示
	c_disp_mem[16]=gc_program_table[j1+11];//填充单位
	//if((c_meter_stat & 0x08)!=0)//编程开关//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序  4:断相报警   3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信 
	//	c_disp_var2=c_disp_var2 | 0x80;
	LCDM1=c_disp_mem[0];
	LCDM2=c_disp_mem[1];
	LCDM3=c_disp_mem[2];
	LCDM4=c_disp_mem[3];
	LCDM5=c_disp_mem[4];
	LCDM6=c_disp_mem[5];
	LCDM7=c_disp_mem[6];
	LCDM8=c_disp_mem[7];
	LCDM9=c_disp_mem[8];
	LCDM10=c_disp_mem[9];
	LCDM11=c_disp_mem[10];
	LCDM12=c_disp_mem[11];
	LCDM13=c_disp_mem[12];
	LCDM14=c_disp_mem[13];
	LCDM15=c_disp_mem[14];
	LCDM16=c_disp_mem[15];
	LCDM17=c_disp_mem[16];
	LCDM18=c_disp_mem[17];
}

void main(void)
{

	_DINT();
	WDTCTL = WDTPW + WDTHOLD;//Stop watchdog timer
	FLL_CTL0=DCOPLUS+XCAP14PF;//低频振荡器,输入输出14PF电容 XCAP14PF=0x20 DCOPLUS=0x80
	FLL_CTL1=SELM_XT2+SELS;//选择8M晶振做MCLK,选择8M晶振做外围器件时钟;SELM_XT2=0x10 SELS=0x40
        SCFQCTL=0X7F;
	
        
      
        IFG1=0x00;
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 WDTIFG(1)--rw-0
	//| | | | | | +---1 OFIFG(1)--rw-0
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 NMIFG(1)--rw-0
	//| | +-----------5
	//| +-------------6 URXIFG0(1)--UART0接收中断标志 rw-0
	//+---------------7 UTXIFG0(1)--UART0发送中断标志 rw-1
	IFG2=0x00;
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 
	//| | | | | | +---1 
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 URXIFG1(1)--UART1接收中断标志 rw-0
	//| | +-----------5 UTXIFG1(1)--UART1发送中断标志 rw-1
	//| +-------------6 
	//+---------------7 
	ME1=0xc0;//使能异步通信口接收发送模块
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 
	//| | | | | | +---1 
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 
	//| | +-----------5 
	//| +-------------6 URXE0(1)--UART0接收允许 rw-0
	//+---------------7 UTXE0(1)--UART0发送允许 rw-0
	ME2=0x00;
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 
	//| | | | | | +---1 
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 URXE1(1)--UART1接收允许 rw-0
	//| | +-----------5 UTXE1(1)--UART1发送允许 rw-0
	//| +-------------6 
	//+---------------7 
	IE1=0xc0;//使能异步通信口接收发送中断
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 WDTIE rw-0
	//| | | | | | +---1 OFIE rw-0
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 NMIIE rw-0
	//| | +-----------5 ACCVIE rw-0
	//| +-------------6 URXIE0(1)--UART0接收使能 rw-0
	//+---------------7 UTXIE0(1)--UART0发送使能 rw-0
	IE2=0x80;//打开基本定时器中断
	//7 6 5 4 3 2 1 0
    	//0 0 0 0 0 0 0 0
	//| | | | | | | +-0 
	//| | | | | | +---1 
	//| | | | | +-----2 
	//| | | | +-------3 
	//| | | +---------4 URXIE1(1)--UART1接收使能 rw-0
	//| | +-----------5 UTXIE1(1)--UART1发送使能 rw-0
	//| +-------------6 
	//+---------------7 
	BTCNT1=0;//配置基本定时器
    	BTCNT2=0;
    	BTCTL=BTDIV+BTFRFQ1+BTIP2+BTIP1;//BTDIV=0x20 BTFRFQ1=0x10 
	//16位定时器,基本定时器用作液晶时钟(f=32768/128),定时器中断间隔时间1s(32768/256/128)
    	//选择计数器2时中由计数器1输出(组成16位模式,时钟源为ACLK=32768),停止计数,中断间隔=Fclk2/128=32768/32768=1S
    	//7 6 5 4 3 2 1 0
	//| | | | | +-+-+-IP2-0(3)--此3位决定中断间隔时间。000:Fclk2/2 001:Fclk2/2 010:Fclk2/8 011:Fclk2/16 100:/32 101:/64 110:/128 111:/256
	//| | | +-+-------FRFQ1-0(2)--00:Flcd=Faclk/32 01:/64 10:/128 11:/256
	//| +-------------HOLD(1)--停止定时器

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -