📄 jhf0001.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 + -