📄 disp.c
字号:
#include "c8051F340.h"
#include "att7022b.h"
#include "mytype.h"
#include "intrins.h"
#include "shift_parameter.h"
#include "math.h"
#include "declare.h"
#include "74ls138.h"
#include "panel_disp.h"
#include "professional.h"
#include "light.h"
uint xdata memory_count; //定时存储次数
uint xdata freq_collect_times;
uchar xdata backup_negative_sign[3];//三个显示备份标志位
uchar xdata ChkSum1_high_byte8,
ChkSum1_middle_byte8,
ChkSum1_low_byte8; //数据校验和
uchar xdata Chk_time;
uchar code led_num[11] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49,
0x41, 0x1f, 0x01, 0x09};//no radix point,0~9
uchar code led_numh[11] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48,
0x40, 0x1e, 0x00, 0x08};//radix point,0~9
ulong xdata energy_collect_count;
uchar xdata original_high_byte, //读7022B的3个字节
original_middle_byte,
original_low_byte;
uchar xdata new_recombine_high, //新的重组数
new_recombine_middle,
new_recombine_low;
//ct,pt一次二次值
uint xdata ct_once,
ct_secondary,
pt_once,
pt_secondary,
address;
uint xdata buffer_for_ct_once, //ct,pt一次二次缓冲值
buffer_for_ct_secondary,
buffer_for_pt_once,
buffer_for_pt_secondary,
buffer_for_address;
uchar xdata baud_code,
buffer_for_baud_code;//06-07-08修改
uchar xdata aa; //按键类型
uchar xdata delay_num; //扫描次数
xdata samping_var Ua, Ub, Uc, Ia, Ib, Ic, Pfa, Pfb, Pfc, Pfsum,F, Uab, Ubc, Uca;
xdata energy_pq_var Pa, Pb, Pc, Psum, Qa, Qb, Qc, Qsum;
//used for remote communication
ulong xdata Wha, Whb, Whc, Qha, Qhb, Qhc, TWH, TQH,
/********************************ADD BY ZHUGAOYUN*************************/
// ZWH, ZQH,FWH, FQH;
Wza, Wzb, Wzc, Qza, Qzb, Qzc, ZWH, ZQH,
Wfa, Wfb, Wfc, Qfa, Qfb, Qfc, FWH, FQH;
/********************************END*************************/
//used for local display
ulong xdata disp_Wha, disp_Whb, disp_Whc, disp_Qha, disp_Qhb, disp_Qhc, disp_TWH, disp_TQH,
/********************************ADD BY ZHUGAOYUN*************************/
//disp_ZWH, disp_ZQH,disp_FWH, disp_FQH;
disp_Wza, disp_Wzb, disp_Wzc, disp_Qza, disp_Qzb, disp_Qzc, disp_ZWH, disp_ZQH,
disp_Wfa, disp_Wfb, disp_Wfc, disp_Qfa, disp_Qfb, disp_Qfc, disp_FWH, disp_FQH;
/********************************END*************************/
ulong xdata compare_value[3]; //上次显示的一组码值备份(用于和本次要显示的数值来比较)
uchar xdata HIGH_BIT[3], //用于显示的第三排数码管(实际显示)
LOW_BIT[3],
NO_DOT[3];
uchar xdata HIGH_BIT_tmp[3], //用于显示的第三排数码管(显示备份)
LOW_BIT_tmp[3],
NO_DOT_tmp[3];
uchar xdata disp_high,
disp_low,
disp_dot;
uint xdata psd;
uchar xdata task_count_number; //任务记数
uchar xdata watchdog_times;
xdata modbus_var modbus_com;
uchar negative_sign ;//公共符号标志
uchar backup_negative_sign[3];//三个显示备份标志位
//注意:press_key的其它位标志不能用(因为程序运行过程中要改变它的)
bdata char press_key = 0x0f;
sbit additional_key = press_key^0;/*四个按键对应的类型*/
sbit setting_key = press_key^1;
sbit down_key = press_key^2;
sbit up_key = press_key^3;
sbit prevent_bug1 = press_key^4;//这四个标志程序中没有用到,为了防止程序bug
sbit prevent_bug2 = press_key^5;
sbit prevent_bug3 = press_key^6;
sbit prevent_bug4 = press_key^7;
bdata char panel_flag = 0x00;
sbit flag_voltage = panel_flag^0;/*对应的四组显示标志*/
sbit flag_current = panel_flag^1;
sbit flag_power_pfa = panel_flag^2;
sbit flag_wh_f = panel_flag^3;
sbit flag_energy_collect = panel_flag^4;
//sbit negative_sign = panel_flag^5;//公共符号标志
sbit flag_check_key_disp = panel_flag^6;
//sbit flag_reset_type = panel_flag^7;
bdata char some_symbol = 0x00;
sbit has_press_key = some_symbol^0;//按键标志,1表示按下
sbit uart_int_flag = some_symbol^1;//uart中断标志
sbit entry_setting_flag = some_symbol^2;//进入设置标志
sbit flag_power_dump = some_symbol^3;
sbit flag_c10ms = some_symbol^4;//Time for 10ms
sbit flag_finish_address = some_symbol^5;
sbit flag_finish_password = some_symbol^6;//set finishing password flag,0 is no finish
sbit flag_finish_energy = some_symbol^7;
bdata uchar general_value = 0x00;
sbit flag_setting_ct_once = general_value^0;/*正在设置项目标志*/
sbit flag_setting_ct_secondary = general_value^1;
sbit flag_setting_pt_once = general_value^2;
sbit flag_setting_pt_secondary = general_value^3;
sbit flag_finish_ct_once = general_value^4;/*设置项目完成标志*/
sbit flag_finish_ct_secondary = general_value^5;
sbit flag_finish_pt_once = general_value^6;
sbit flag_finish_pt_secondary = general_value^7;
bit flag_setting_baud_code;
bit PANEL_ONE_LINE_ONE = 0;//初始化默认灯亮
bit PANEL_ONE_LINE_TWO = 0;
bit PANEL_ONE_LINE_THREE = 0;
bit PANEL_TWO_LINE_ONE = 0;
bit PANEL_TWO_LINE_TWO = 0;
bit PANEL_TWO_LINE_THREE = 0;
bit PANEL_THREE_LINE_ONE = 0;
bit PANEL_THREE_LINE_TWO = 0;
bit PANEL_THREE_LINE_THREE = 0;
bit PANEL_FOUR_LINE_ONE = 0;
bit PANEL_FOUR_LINE_TWO = 0;
bit PANEL_FOUR_LINE_THREE = 0;
bit finish_key_operate = 0;//键盘完成操作
uchar task_delay_num;//延时记数
bit first_power_on = 0;//刚上电标志
bit flag_write_energy = 0;//定时写电能
/****************************************ADD BY ZHUGAOYUN***********
sbit P3_7 = P3^7;
sbit P3_6 = P3^6;
sbit P3_5 = P3^5;
sbit P3_4 = P3^4;
sbit P3_3 = P3^3;
sbit P3_2 = P3^2;
sbit P3_1 = P3^1;
sbit P3_0 = P3^0;
#define MC_P_INPUT P3_0
#define MC_Q_INPUT P3_1
#define MC_ZP_OUTPUT P3_2
#define MC_FP_OUTPUT P3_3
#define MC_ZQ_OUTPUT P3_4
#define MC_FQ_OUTPUT P3_5
**************************************END************/
void press_down_key();
void press_up_key();
void float_char(float valp);
void float_to_bcd();
void delay(uchar t);
void write_to_flash();
void get_cpt_from_flash();
void setting_password();
void init_7022B();
void clear_7022B_data();
/*add by zhugaoyun**/
void add_energy_mc();
const uchar code auchCRCHi[] = { /* CRC High Byte Table*/
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40} ;
const uchar code auchCRCLo[] = { /* CRC Low Byte Table*/
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,
0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,
0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,
0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,
0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,
0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40} ;
/*
***********************************************************************************************************
**函数原型 : Port_IO_Init()
**参数说明 :
:
**返回值 :
**说 明 : 本函数用于340的I/O口初始化
************************************************************************************************************/
//---7022B中CS内部有200K的上拉电阻 CS---P4.5
//---7022B中DIN内部有200K的下拉电阻(Schmitt input) DIN---P0.2
//---7022B中SCLK内部是串行数据输入(Schmitt input) SCLK---P0.0
//---7022B中DOUT串行数据输出 DOUT---P0.1
//---Schmitt input "1" is 0.6Vcc = 3V,"0" < 2V,high impedance is not exist
void Port_IO_Init()
{
P0SKIP = 0xc0;
XBR0 = 0x03;
XBR1 = 0x40;
P0MDIN &= 0x3f;
P0 |= 0x08; //P0_3 = 1;
P0MDOUT |= 0x05; //MOSI.SCK推挽输出;
P3 = 0xFF; //遥信作为输入,先置1
P2 = 0xff; //段码
P1 = 0xff; //位选
}
/*
***********************************************************************************************************
**函数原型 : Oscillator_Init()
**参数说明 :
:
**返回值 :
**说 明 : 本函数用于340的晶振初始化
************************************************************************************************************/
void Oscillator_Init(){
int i = 0;
OSCXCN = 0x67;
for(i = 0;i < 3000;i++); // Wait 1ms for initialization
while((OSCXCN & 0x80) == 0);//Wait for external Crystal Oscillator running
CLKSEL = 0x01;//Select external clock
OSCICN = 0x00;//Close internal clock
}
/*
***********************************************************************************************************
**函数原型 : uart_init()
**参数说明 :
:
**返回值 :
**说 明 : 本函数用于340的串口初始化
************************************************************************************************************/
void uart_init()
{
SCON0 = 0x10; //Used for mode 1,8 bit asynchronous transfer and sending,9600 Baudrate
EA = 1;
ES0= 1;
ET0 = 1;
// IP = 0x12;
}
/*
***********************************************************************************************************
**函数原型 : Timer_Init()
**参数说明 :
:
**返回值 :
**说 明 : 本函数用于340的定时器初始化
************************************************************************************************************/
void Timer_Init()
{
/* TMOD = 0x21;//T1 used for baudrate(8位自动重载),T0 used for timing(16位)
CKCON = 0x00; //1/12 Frequency
TH1 = 0xa0; *///07-07-08
TMR2CN = 0x01;//关T2
if(baud_code >2)
{ //07-07-09
TMR2RLL = 0x94;
TMR2RLH = 0x94;
}
else
{ //07-07-09
TMR2RLL = 0x00;
TMR2RLH = 0x00;
}
ET2 = 1;
uart_init();
TR1 = 1;
TR0 = 1;
}
/*
***********************************************************************************************************
**函数原型 : delay(uchar t)
**参数说明 : t -->> 要延时的ms数
:
**返回值 :
**说 明 : 本函数用于时间延时tms
************************************************************************************************************/
void delay(uchar t)
{//delay tms
uint k1;
uchar j,k2;
for(j = 0;j < t;j++){
for(k1 = 0;k1 < 100;k1++){
for(k2 = 0;k2 < 12;k2++)_nop_();
}
}
}
/*
***********************************************************************************************************
**函数原型 : Init_Device()
**参数说明 :
:
**返回值 :
**说 明 : 本函数用于340的设备初始化
************************************************************************************************************/
void baudrate_select()
{//07-07-08
TMOD = 0x21;//T1 used for baudrate(波特率只能由T1工作在8位自动重载方式产生),T0 used for timing(16位)
switch(baud_code){
/*----------------------TH1 = 256 - 分频后频率 / 波特率 / 2----------------------*/
/*-----------------采用22.184频率只能达到1200~57600波特率------------------------*/
/* case 0:{//baudrate = 300
CKCON = 0x00; //1/12 Frequency
TH1 = 0xa0;
}
break;
case 1:{//baudrate = 600
CKCON = 0x00; //1/12 Frequency
TH1 = 0xa0;
}
break; */
case 0:{//baudrate = 1200
CKCON |= 0x02; //1/48 Frequency
TH1 = 0x40;
}
break;
case 1:{//baudrate = 2400
CKCON |= 0x02; //1/48 Frequency
TH1 = 0xa0;
}
break;
case 2:{//baudrate = 4800
CKCON |= 0x02; //1/48 Frequency
TH1 = 0xd0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -