📄 c_code.c
字号:
#include <reg51.h>
#include <math.h>
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#include "c_code.h"
#define Graphic 1
#define TXT 0
unsigned char code str_USB[];
unsigned char code str2[];
unsigned char code str3[];
unsigned char code str4[];
unsigned char code str5[];
unsigned char i;
unsigned int ihexs, iflag[3];
unsigned char disp_buffer[5];
extern unsigned int ad_convert();
unsigned char C;
void hextobcd(unsigned int hexs,unsigned char j);
void deoutlier(unsigned int x[4], unsigned int x0[4][2], char Bound);
void calibration(unsigned int x[4]);
void LcmDynWriteData(unsigned char x, unsigned char y, unsigned char CH_No,unsigned int ihex);
unsigned int new_value[4];
unsigned int value[4][2];
unsigned char menu_item;
void main(void)
{
menu_item = 0;
do
{
for(i = 0;i < 3; i++)
iflag[i] = 0; //程序跳转标志
ACC = 0x01; //MOV A, #01h
Regstr = ACC; //MOV 30h, A
PortA000 = ACC; //MOV DPTR, #A000h MOV @DPTR, A
FPWR = 0; //CLR P1.5
ACC = Port6000;
ACC = ACC & 0x80;
if(ACC != 0x80) //电源POWER键按下
{
ACC = Port6000;
ACC = ACC & 0x80;
if(ACC != 0x00)
iflag[0] = 1;
else
{
FPWR = 1;
LcmInit();
LcmClear(0); //设置屏幕
LcmWriteCommand(0x9f);
PutString(0,0,str_Welcome); //显示欢迎屏
Delay(10); //延迟并转入菜单屏
PortA000 = 0x04;
ACC = Port6000;
ACC = ACC & 0x01;
if(ACC != 0x01) //检测ESC键按下,则转测量Start
{
//菜单共5条:日期、时间、量程、报警上限、报警下限,故0 <= menu_item <= 4
ACC = Port6000;
ACC = ACC & 0x10;
if(ACC == 0x10)
{
if(menu_item != 4)
menu_item ++; //若按Down键,menu_item ++,但其最大值为4
else
menu_item = 4;
}
ACC = Port6000;
ACC = ACC & 0x20;
if(ACC == 0x30)
{
if(menu_item != 0)
menu_item --; //若按UP键,menu_item --,但其最小值为0
else
menu_item = 0;
}
switch(menu_item) //下面每个设置必须按Enter确认
{
case 0: //日期设置
break;
case 1: //时间设置
break;
case 2: //量程设置
break;
case 3: //上限设置
break;
case 4: //下限设置
break;
}
ACC = Port6000;
ACC = ACC & 0x02;
if(ACC == 0x02) //校零键按下
{
}
}
}
}
else
{
ACC = Port6000;
ACC = ACC & 0x40;
if(ACC != 0x00) //交流电插入
{
FPWR = 1;
LcmInit();
LcmClear(0);
LcmWriteCommand(0x9f);
PutString(0,0,str_Charge);
Delay(1);
while(1)
{
AD_A0 = 1;
AD_A1 = 1;
ad_convert();
hextobcd(ihexs,5); //电源电压转换
//显示
FCHRG = 1; //没有写完
}
iflag[1] = 1;
}
if(FUSB == 1) //USB插入
{
LcmInit();
LcmClear(0);
LcmWriteCommand(0x9f);
while(FUSB == 1)
{
//USB服务程序
PortA000 = 0x08;
ACC = Port6000;
ACC = ACC & 0x08;
if(ACC == 0x08) //Send键按下
{
}
}
Delay(1);
FPWR = 0;
iflag[2] = 1; //关机
}
if(iflag[1] == 0 || iflag[2] == 0) //没有键按下
{
iflag[1] = 0;
iflag[2] = 0;
FPWR = 1; //置P1.5 = 1
LcmInit();
LcmClear(0);
LcmWriteCommand(0x9f);
PutString(0,0,str_Hibernate);
Delay(0);
}
}
}while(iflag[0]);
//Start 测量程序
do//测量前必须曾按过Power键
{ //程序跳转标志
iflag[0] = 0;
LcmClear(1);
LcmWriteCommand(0x9f);
LcmClear(1);
for(i=0;i<4;i++)
{
value[i][0] = 0; //k-1时刻测量值
value[i][1] = 0; //k-2时刻测量值
new_value[i] = -1; //当前k时刻测量值
}
PortA000 = 0x81; //poweron();
Regstr = 0x81;
ACC = Regstr;
ACC = ACC & 0x0fE; //模拟电路休眠控制位,1休,0工作
Regstr = ACC;
PortA000 = ACC;
while(1)
{
AD_A0 = 0;
AD_A1 = 0;
new_value[0] = ad_convert(); //模拟输入路1测量
do
{
C = AD_BUSY;
}while(C == 0);
Port10F4 = ACC; //启动模拟转换上一路,锁存第当前路
do
{
C = AD_BUSY; //等待以前路转换
}while(C == 0);
Port10F4 = ACC; //启动模拟转换第当前路,锁存第当前路
do
{
C = AD_BUSY;
}while(C == 0); //等待当前路转换结束;
ACC = Port10FF; //读yiqian转换的低字节;
new_value[1] = new_value[1] & ACC; //需要将赋给new_value[1]的低字节
ACC = Port10FB; //读yiqian转换的高字节
//做移位,将其赋给new_value[1]的高字节
AD_A0 = 1;
new_value[1] = ad_convert(); //模拟输入路2测量
AD_A0 = 0;
AD_A1 = 1;
new_value[2] = ad_convert(); //模拟输入路3测量
AD_A0 = 1;
new_value[3] = ad_convert(); //模拟输入路4测量
Delay(1);
Delay(1);
FS = 1;
Delay(1);
Delay(1);
FS = 0; //ad_sample();
ACC = Port6000;
ACC = ACC & 0x80;
if(ACC != 0x80)
{
ACC = Regstr; //poweroff();
ACC = ACC | 0x01; //模拟电路休眠控制位,1休,0工作
Regstr = ACC;
PortA000 = ACC;
ACC = Regstr;
ACC = ACC & 0x7F; //模拟电路电源控制位,1供电,0断电
Regstr = ACC;
PortA000 = ACC;
FPWR = 0;
iflag[0] = 1;
break;
}
calibration(new_value);
deoutlier(new_value, value, 10); //数据处理
LcmDynWriteData(0,0,0x11,ihexs); //显示
DelayKey(2);
PortA000 = 0x08;
ACC = Port6000;
ACC = ACC & 0x10;
if(ACC == 0x10) //若SET键按下,可弹出上面的菜单
{
}
ACC = Port6000;
ACC = ACC & 0x08;
if(ACC == 0x08) //若FIND键按下,为查询
{
}
ACC = Port6000;
ACC = ACC & 0x04;
if(ACC == 0x04) //DELETE键按下
{
}
PortA000 = 0x04;
ACC = Port6000;
ACC = ACC & 0x04;
if(ACC == 0x04) //SAVE键按下
{
}
ACC = Port6000;
ACC = ACC & 0x08;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -