📄 cmain.c
字号:
#include <reg52.h>
#include <intrins.h>
#define TRUE 1
#define FALSE 0
/* 8958 plcc44 */
sfr SS1 = 0xbf;
sfr SS2 = 0x85;
sfr P4 = 0xe8;
/***************************************************************
各个IO的定义
***************************************************************/
//RS485的收发选择
//暂时没有
sbit txrx = P2 ^ 5; // 1 -- 发送数据 0 -- 接收数据
//跳pin选择
sbit IOK1 = P0^7;
sbit IOK2 = P4^1;
sbit IOK3 = P2^7;
sbit IOK4 = P2^6;
sbit IOK5 = P2^5;
//蜂鸣器
sbit IOBeep = P2^0;
//开关电源
sbit IOPower = P4^2;
//背光
sbit IOBK = P4^3;
/******************************************************************
各个参数在Eeprom中的地址
******************************************************************/
#define e_min_add 0x02
#define e_s_unit 0x0f
#define e_para 0x10
#define e_adzero 0x20
#define e_adf 0x24
#define e_start 0x62
//调用IIC中的子程序
extern WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char xdata *ptr);
extern ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char xdata *ptr);
//调用LCD中的子程序
extern void InitLcd(void);
extern void DispUnit(unsigned char);
extern void DispStr(unsigned char code *ptr_code);
extern void DispDigital(signed long li,signed char pos);
extern void tran(void);
extern void wrlcd(void);
extern void ClearFlag(void);
extern unsigned char xdata dispbuff[6];
extern unsigned char data bankbuff[16];
extern unsigned char xdata TmpData[7];
//蜂鸣器的调用
extern unsigned char beep;
extern void BeepFunc(void);
//串口的调用
extern void InitUart(void);
extern void SendStr(unsigned char num);
extern bit RdBufData(void);
//菜单调用
void EnterMenu(void);
extern unsigned int code exp_m[]; // = {1,10,100,1000,10000};
extern unsigned char code allbit[]; // = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//键盘的调用
extern void KeyPro(void);
extern data unsigned char kbuf;
//各个键的定义
#define KEYUNIT 0x08
#define KEYMPLUS 0x10
#define KEYHOLD 0x04
#define KEYCHANGE 0x01
#define KEYT_Z 0x02
#define KEYQUIT 0x08
#define KEYCLEAR 0x10
#define KEYRIGHT 0x04
#define KEYINC 0x01
#define KEYENTER 0x02
unsigned int data s_del;
unsigned char xdata test_start;
unsigned char bdata cont_1;
sbit gross_lcd = cont_1^7; //
sbit net_lcd = cont_1^6;
sbit tare_lcd = cont_1^5; //
sbit clock = cont_1^4;
sbit stab_lcd = cont_1^3; //
sbit auto_lcd = cont_1^2;
sbit M_lcd = cont_1^1;
sbit bat_r = cont_1^0;
unsigned char bdata cont_2;
sbit T1_lcd = cont_2^7;
sbit T2_lcd = cont_2^6;
sbit T3_lcd = cont_2^5;
sbit T4_lcd = cont_2^4;
sbit bf_lcd = cont_2^3; //
sbit peak_lcd = cont_2^2; //
sbit ray_lcd = cont_2^1; //
sbit bat_l_lcd = cont_2^0; //
unsigned char bdata cont_3;
sbit hi_lcd = cont_3^3;
sbit ok_lcd = cont_3^2; //
sbit lo_lcd = cont_3^1; //
sbit zero_lcd = cont_3^0; //
//sbit bat_space = cont_3^4;
unsigned char bdata flag1;
sbit delb = flag1^0; //开始延时置1,延时到为零
sbit bk_delb = flag1^1; //自动背光的显示时间
sbit bat_space = flag1^2;
sbit ga = flag1 ^ 3;
sbit ke = flag1 ^ 4; //有键按下
sbit keyp = flag1 ^ 5; //键盘有效的标志
sbit kerr_b = flag1 ^ 6; //按键时间太长
sbit m_delb = flag1 ^ 7; //累显的时间标志
unsigned char bdata flag2;
sbit add_lcd = flag2^0;
sbit pcs_lcd = flag2^1;
sbit batt_lcd = flag2^2;
sbit xg_lcd = flag2^3;
unsigned int xdata m_del; //可以设置的累显延迟时间
unsigned int xdata bk_del; ///自动背光的显示时间延时
unsigned char xdata last_min; //电池不足时的开机时间
unsigned char xdata min_add; //电池不足
unsigned int xdata c_del; //时间定时,400次到1秒
unsigned char xdata minute; //分钟指示 0 -- 59
unsigned char xdata second; //秒指示 0 -- 59
unsigned char xdata shut_min;
unsigned char xdata unit; //显示单位
// 0 -- 1 --
unsigned int del_num; //延时时间参数
unsigned char xdata *ptr_xdata;
unsigned int xdata times; //零位跟踪的时间
signed long int xdata tmp_li1,tmp_li2,tmp_li3;
/**************************************************
与秤重有关的变量
**************************************************/
signed long int xdata capacity;
signed long int xdata capacity_n; //标定单位kg状态下的量程
signed char xdata division;
signed char xdata division_n;
signed char xdata decimal;
signed char xdata decimal_n; //标定单位kg状态下的小数点位置
signed long int xdata adzero;
signed long int xdata adf;
signed long int xdata adz0;
signed long int xdata adz;
signed long int xdata w_gross;
signed long int xdata w_net;
signed long int xdata w_tare;
signed long int xdata n_tare; //按扣重键或调入得到的扣重值
//unsigned char xdata re_zero; //手动归零的百分比
signed long int xdata fd5; //0.5d的内码值
float xdata f_z;
float xdata f_w;
float xdata f_t;
float xdata f_h; //Hold时的重量
signed long int xdata w_hold;
/**************************************************************
单位设置
**************************************************************/
signed char xdata s_unit; //0--kg,1--lb,2--台斤,3--港斤
signed char xdata t_unit; //按扣重键时的单位或调入得到的扣重值时的单位
/**************************************************************
//参数
**************************************************************/
typedef struct cmd_entry /* define the struct 'cmd_entry' */
{
unsigned char divisionprecision; // 0
unsigned char auto_zero; // 1
unsigned char capacity; // 2
unsigned char bk; // 3
unsigned char inp; // 4
unsigned char unit; // 5
unsigned char poweroff; // 6
unsigned char prt; // 7
unsigned char change; // 8
}x;
extern union exam
{
struct cmd_entry mode;
unsigned char cmode[9];
}xdata para;
/************************************************************
与累加有关的变量
************************************************************/
#define MAXTOTAL 999 //最多累加次数
signed long int xdata w_total; //累加重量
signed int xdata n_total; //累加次数
/************************************************************
闪烁变量
************************************************************/
unsigned int xdata wink;
unsigned char code disp_full[] = {0x30,0x30,0x30,0x30,0x30,0x30}; //显示8.8.8.8.8.8.
unsigned char code version[] = {0x20,0x1d,0x23,0x00,0x01,0x20}; //V1.01
unsigned char code err_4[] = {0x0e,0x1a,0x1a,0x20,0x20,0x04}; //Err 4
unsigned char code err_6[] = {0x0e,0x1a,0x1a,0x20,0x20,0x06}; //Err 6
unsigned char code err_10[] = {0x0e,0x1a,0x1a,0x20,0x01,0x00}; //Err 10
unsigned char code err_11[] = {0x0e,0x1a,0x1a,0x20,0x01,0x01}; //Err 11
unsigned char code err_12[] = {0x0e,0x1a,0x1a,0x20,0x01,0x02}; //Err 12
unsigned char code ol[] = {0x1f,0x1f,0x17,0x15,0x1f,0x1f}; //--oL--
unsigned char code d__[] = {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f}; //------
unsigned char code d_space[] = {0x20,0x20,0x20,0x20,0x20,0x20}; //
unsigned char code d_battlo[] = {0x0b,0x0a,0x1c,0x10,0x15,0x17}; //bAt Lo
unsigned char bdata flag5;
sbit BErrData = flag5 ^ 3; //在一定时间内串口没有接收到有用的内码
sbit r_succes_b = flag5 ^ 4; //成功接受一个字符的标志
sbit in_send = flag5 ^ 5; //正在发送数据标志
sbit crc_err = flag5 ^ 6; //CRC 校验错误
sbit BTareFlag = flag5 ^ 7; //扣重标志位
unsigned char bdata flag6;
sbit B0d0a = flag6 ^ 0; //已经出现过了0d 0a
sbit BSign = flag6 ^ 1; //是否是负数
sbit BProtocol = flag6 ^ 2; //出现了0d,0a或ff后,协议依然不正确
sbit BReq = flag6 ^ 3; //请求发送内码命令已发送
sbit BMustDisp = flag6 ^ 4; //需要立即显示
sbit BHold = flag6 ^ 5; //Hold键已按下
sbit BHoldDisp = flag6 ^ 6; //Hold的重量已经显示
sbit BTmp = flag6 ^ 7; //临时标志位
unsigned char bdata flag7; //协议设置标志区
sbit pick = flag7 ^ 0; //可读内码标志
sbit stab = flag7 ^ 1; //内部稳定标志
sbit bat_crane = flag7 ^ 2; //吊秤缺电标志
sbit BRecData = flag7 ^ 3; //接收端已接收到数据(长度>=7个)标志
sbit BLess20d = flag7 ^ 4; //小于20d的标志
sbit BOverLoad = flag7 ^ 5; //超载标志
sbit BAcc = flag7 ^ 6; //可以累加标志
unsigned char xdata ReqTime; //请求发送数据以后的最长等待时间
unsigned char xdata ReqNum; //请求发送的次数
/*union
{
unsigned char c[2];
unsigned int i;
}chi;*/
extern unsigned long int xdata ad_out; //读出的内码
extern signed char xdata RecCounter; //接受字符指针
extern signed char xdata RdCounter; //读接收缓冲区的指针
//unsigned char RdChar(unsigned char num);
/*
功能:延时,查询方式
输入参数:loop
*/
void delay (unsigned int loop)
{
for ( ; loop>0; loop--) ;
}
void DelayInter(unsigned int num)
{
del_num=num;
delb=1;
do
{
}
while (delb);
}
////////中断程序///////////
void int_ex0 (void) interrupt 0
{
}
void int_t0(void) interrupt 1
{
}
void int_ex1 (void) interrupt 2
{
EX1=0;
}
/////
void RunTime(void)
{
if (delb)
{
del_num--;
if (del_num == 0)
{
delb = FALSE;
}
}
}
//////unit weight input enter time////
////
void BkTime(void)
{
if (bk_delb)
{
bk_del=bk_del-1;
if (bk_del==0)
{
bk_delb=0;
}
}
}
//累加显示延迟
void mdel(void)
{
if (m_delb)
{
m_del--;
if (m_del == 0) m_delb = FALSE;
}
}
void ClockDel(void)
{
c_del=c_del-1;
if (c_del==0)
{
c_del=100;
second++;
if (second>59)
{
second=0;
minute++;
if (minute>59) minute = 0;
shut_min++;
}
}
if (c_del>100)
{
c_del = 100;
}
}
void UartTime(void)
{
if (BReq)
{
ReqTime--;
if (ReqTime == 0)
{
BReq = FALSE;
ReqNum++;
if (ReqNum > 7) ReqNum = 7;
}
}
}
//////////
void int_t1 (void) interrupt 3
{
TH1=0xdc; //0xee; //0xf7;
mdel();
RunTime();
BeepFunc();
BkTime();
ClockDel();
UartTime(); //串口交换数据之间的时间常数
KeyPro(); //键盘程序
wink++;
times++;
}
/**************************************************************************
读参数和初始化变量
**************************************************************************/
extern unsigned char code factory_para[]; // = {1,1,0,0,0,0,1,1,1};
void init_s (void)
{
signed char loop;
for (loop = 0; loop < 9; loop++)
{
ReadEeprom(e_para+loop,1,(unsigned char xdata*)¶.cmode[loop]);
}
if (para.cmode[0] == 0xff)
{
for (loop=0;loop<9;loop++)
{
WriteEeprom(e_para+loop,1,(unsigned char xdata*)&factory_para[loop]);
}
}
ReadEeprom(e_adzero,4,(unsigned char xdata*)&adzero);
ReadEeprom(e_adf,4,(unsigned char xdata*)&adf);
ReadEeprom(e_s_unit,1,(unsigned char xdata*)&s_unit);
if ( (s_unit >3 ) || (s_unit < 0) ) s_unit = 0;
if ( (para.mode.unit&0x0f) == 0)
{
s_unit = 0; //没有打开单位,默认为kg
goto getcap_ret;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -