📄 back.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
//#include <avr/eeprom.h>
#include "HZ.h"
#include "T6963.h"
#include "head.h"
//宏定义区///////////////////////////////////////////////////////////////
#define V_MAX 7200
#define A_MAX 3000
#define TE_MAX 999
#define TI_MAX 1999
#define DMAX 9999
#define VSADDR 0x0000
#define CSADDR 0x0002
#define TESADDR 0x0004
#define TISADDR 0x0006
/////////////////////////////////////////////////////////////////////////
//全局变量区/////////////////////////////////////////////////////////////
unsigned char WorkStatus = 0x00;//////////
unsigned char TimeOut = 0x0A;//////////
unsigned int Work_commend= 0x0000;//////////
unsigned int Voltage = 0x0000;//72.00V
unsigned int Current = 0x0000;//300.0A
unsigned int Temp = 0x0000;//099.9C
unsigned int Time = 0x0000;//999M
unsigned int CVoltage = 0x0000;//72.00V
unsigned int CCurrent = 0x0000;//300.0A
unsigned int StopTemp = 0x0000;//099.9C
unsigned int StopTime = 0x0000;//999M
unsigned int StopCurrent = 0x0000;//300.0A
unsigned int TempSCurrent= 0x0000;//300.0A
unsigned int TempCVoltage= 0x0000;//72.00V
unsigned int TempCCurrent= 0x0000;//300.0A
unsigned int TempTemp = 0x0000;//099.9C
unsigned int TempTime = 0x0000;//999M
unsigned int LowStatus = 0x0000;
//unsigned int EESetVoltage __attribute__((section(".eeprom")));
/////////////////////////////////////////////////////////////////////////
//自编函数区/////////////////////////////////////////////////////////////
unsigned char EEPROM_read(unsigned int uiAddress);
void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
void vDataInit(void);
void vSetPara(void);
void vGetInt(unsigned char key);
void vWork(void);
void vStop(void);
void vWait2Ensure(void);
void vSetup(void);
void vCheck(void);
void vDisplay(void);
void vMenu(unsigned char key);
void vWait(unsigned int us);
void vWrite(unsigned char data);
unsigned char ucRead(void);
char LCD_StatusCheck(unsigned char mask);
char LCD_WriteCommand(unsigned char cmd);
char LCD_WriteData(unsigned char dat);
char LCD_AutoWriteData(unsigned char dat);
unsigned char LCD_ReadStatus(void);
unsigned char LCD_ReadData(void);
unsigned char LCD_AutoReadData(void);
char LCD_INIT(void);
char LCD_FILL(unsigned char page,unsigned char dat);
char LCD_LOAD_PAGE(unsigned char page,const unsigned char *p);
char LCD_PutChar(unsigned char page,unsigned int position,const unsigned char *hz);
char LCD_PutEng(unsigned char page,unsigned int position,const unsigned char *hz);
char LCD_PutAnyThing(unsigned char page,unsigned int position,unsigned char dat);
char LCD_Case(unsigned char page);
void vLCD_Page_Change(unsigned char page);
void LCD_page0(void);
void LCD_page1(void);
void LCD_page2(void);
unsigned char cKeyScan(void);
unsigned char cKey(unsigned char keyval);//按键
/////////////////////////////////////////////////////////////////////////
//系统函数区/////////////////////////////////////////////////////////////
void vPortInit(void);
void vInit(void);
void vTimer0Init(void);
void vOCR1Init(void);
void vSpiInit(void);
void vTWInit(void);
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
int main(void)
{
unsigned int ms = 0;
unsigned int msa = 0;
unsigned int msb = 0;
unsigned int msc = 0;
volatile unsigned char null = 0;
unsigned char ka = 0,kb = 0;
unsigned char k = 0;
const unsigned char *p = name;
vInit(); //初始化片内设备
null = LCD_INIT();//LCD初始化
vLCD_Page_Change(0);
vDataInit();
while(1)
{
__asm__(" WDR");
if(TIFR&(1<<OCF0))//1KHz---1000us
{
TIFR |=1<<OCF0;
ms +=1;
if(TimeOut>0)TimeOut--;
if(ms >3999)ms=0;
}
if(((ms%30)==5)&&(msa!=ms))
{
msa = ms;
//TODO: the code below will be execute every 30ms
ka = cKey(cKeyScan());
if(kb != ka)
{
kb = ka;
if(kb < 0x10)vMenu(kb);
}
vSetPara();
if((LowStatus&0x00ff)==0x0007)
{
WorkStatus = 0x10;
Work_commend=0xff00;
vStop();
}
}
if(((ms%100)==10)&&(msb!=ms))
{
msb = ms;
//TODO: the code below will be execute every 100ms
//下面代码显示菜单代码,正式版应屏蔽
p = nen;
k = WorkStatus/0x10;
null = LCD_PutEng(1,0x0117,p+k*16);
k = WorkStatus%0x10;
null = LCD_PutEng(1,0x0118,p+k*16);
}
if(((ms%100)==15)&&(msb!=ms))
{
msc = ms;
//TODO: the code below will be execute every 100ms
vDisplay();
}
}
return(-1);
}
/////////////////////////////////////////////////////////////////////////
//中断服务函数区/////////////////////////////////////////////////////////
ISR(SPI_STC_vect)
{
volatile static unsigned char bn = 0xff;
static unsigned char kk = 0x00;
static unsigned char k = 0x00;
unsigned char val = 0x00;
val = SPDR;
if(TimeOut == 0)bn = 0;
switch(bn)
{
case 0:
{
k = val;
switch(k)
{
case 0:
{
SPDR = Work_commend%0x100;//发送命令的低字节
}break;
case 1:
{
SPDR = StopCurrent%0x100;
}break;
case 2:
{
SPDR = CVoltage%0x100;
}break;
case 3:
{
SPDR = CCurrent%0x100;
}break;
case 4:
{
SPDR = StopTemp%0x100;
}break;
case 5:
{
SPDR = StopTime%0x100;
}break;
case 6:
{
//SPDR = mWork_state%0x100;
}break;
case 7:
{
}break;
case 8:
{
}break;
default: break;
}
}break;
case 1:
{
switch(k)
{
case 0:
{
SPDR = Work_commend/0x100;
kk = val;
}break;
case 1:
{
SPDR = StopCurrent%0x100;
kk = val;
}break;
case 2:
{
SPDR = CVoltage/0x100;
kk = val;
}break;
case 3:
{
SPDR = CCurrent/0x100;
kk = val;
}break;
case 4:
{
SPDR = StopTemp/0x100;
kk = val;
}break;
case 5:
{
SPDR = StopTime/0x100;
kk = val;
}break;
case 6:
{
//SPDR = mWork_state/0x100;
kk = val;
}break;
case 7:
{
}break;
case 8:
{
kk = val;
}break;
default: break;
}
}break;
case 2:
{
switch(k)
{
case 0:
{
LowStatus = val*0x100+kk;
}break;
case 1:
{
//FarVoltage = val*0x100+kk;
}break;
case 2:
{
Voltage = val*0x100+kk;
}break;
case 3:
{
Current = val*0x100+kk;
}break;
case 4:
{
Temp = val*0x100+kk;
}break;
case 5:
{
Time = val*0x100+kk;
}break;
case 6:
{
//Work_state = val*0x100+kk;
}break;
case 7:
{
}break;
case 8:
{
//eer_data = val*0x100+kk;
}break;
default: break;
}
}break;
default:break;
}
if((++bn)>2)
{
bn = 0;
k = 0;
TimeOut = 0;
}
else TimeOut = 10;
}
/////////////////////////////////////////////////////////////////////////
//自编函数区/////////////////////////////////////////////////////////////
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
EEARH = uiAddress/0x100;
EEARL = uiAddress%0x100; /* 设置地址和数据寄存器*/
EEDR = ucData;
EECR |= (1<<EEMWE);/* 置位EEMWE */
EECR |= (1<<EEWE);/* 置位EEWE 以启动写操作*/
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
EEARH = uiAddress/0x100;
EEARL = uiAddress%0x100;/* 设置地址寄存器*/
EECR |= (1<<EERE);/* 设置EERE 以启动读操作*/
return EEDR;/* 自数据寄存器返回数据 */
}
void vDataInit(void)
{
CVoltage = EEPROM_read(0);
CVoltage += EEPROM_read(1)*256;
if(CVoltage>V_MAX)CVoltage = 0;
CCurrent = EEPROM_read(2);
CCurrent += EEPROM_read(3)*256;
if(CCurrent>A_MAX)CCurrent = 0;
StopTemp = EEPROM_read(4);
StopTemp += EEPROM_read(5)*256;
if(StopTemp>TE_MAX)StopTemp = 0;
StopTime = EEPROM_read(6);
StopTime += EEPROM_read(7)*256;
if(StopTime>TI_MAX)StopTime = 0;
}
void vSetPara(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
switch(WorkStatus)
{
case 0x21:
{
null = LCD_PutChar(1,0x010f,p+24*32);//电
null = LCD_PutChar(1,0x0111,p+25*32);//压
}break;
case 0x22:
{
null = LCD_PutChar(1,0x010f,p+26*32);//电
null = LCD_PutChar(1,0x0111,p+27*32);//流
}break;
case 0x23:
{
null = LCD_PutChar(1,0x010f,p+30*32);//温
null = LCD_PutChar(1,0x0111,p+31*32);//度
}break;
case 0x24:
{
null = LCD_PutChar(1,0x010f,p+14*32);//时
null = LCD_PutChar(1,0x0111,p+15*32);//间
}break;
default:
{
p = zero;
null = LCD_PutChar(1,0x010f,p);//
null = LCD_PutChar(1,0x0111,p);//
null = LCD_PutChar(1,0x0113,p);//
null = LCD_PutChar(1,0x0115,p);//
return;
}break;
}
null = LCD_PutChar(1,0x0113,p+16*32);//设
null = LCD_PutChar(1,0x0115,p+17*32);//置
}
void vGetInt(unsigned char key)
{
unsigned int k=0;
unsigned int *p= &k;
if(key >0x09)return;
switch(WorkStatus)
{
case 0x21:
{
p = &TempCVoltage;
}break;
case 0x22:
{
p = &TempCCurrent;
}break;
case 0x23:
{
p = &TempTemp;
}break;
case 0x24:
{
p = &TempTime;
}break;
default:break;
}
if(WorkStatus==0x23)k = *p%100;
else k = *p%1000;
k *= 10;
k += key;
*p = k;
vDisplay();
}
void vWork(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
p = ctrl;
null = LCD_PutChar(1,0x0106,p+6*32);//工
null = LCD_PutChar(1,0x0108,p+7*32);//作
null = LCD_PutChar(1,0x0119,p+10*32);//停
null = LCD_PutChar(1,0x011b,p+11*32);//止
null = LCD_PutChar(1,0x0519,p+48*32);//查
null = LCD_PutChar(1,0x051b,p+49*32);//询
p = zero;
null = LCD_PutChar(1,0x010a,p);//
null = LCD_PutChar(1,0x010c,p);//
}
void vStop(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
p = ctrl;
null = LCD_PutChar(1,0x0106,p+10*32);//停
null = LCD_PutChar(1,0x0108,p+11*32);//止
null = LCD_PutChar(1,0x0119,p+46*32);//启
null = LCD_PutChar(1,0x011b,p+47*32);//动
null = LCD_PutChar(1,0x0519,p+16*32);//设
null = LCD_PutChar(1,0x051b,p+17*32);//置
p = zero;
null = LCD_PutChar(1,0x010a,p);//
null = LCD_PutChar(1,0x010c,p);//
}
void vWait2Ensure(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
p = ctrl;
null = LCD_PutChar(1,0x0106,p+42*32);//等
null = LCD_PutChar(1,0x0108,p+43*32);//待
null = LCD_PutChar(1,0x010a,p+44*32);//确
null = LCD_PutChar(1,0x010c,p+45*32);//认
p = zero;
null = LCD_PutChar(1,0x0119,p);//
null = LCD_PutChar(1,0x011b,p);//
null = LCD_PutChar(1,0x0519,p);//
null = LCD_PutChar(1,0x051b,p);//
}
void vSetup(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
p = ctrl;
null = LCD_PutChar(1,0x0106,p+8*32);//参
null = LCD_PutChar(1,0x0108,p+9*32);//数
null = LCD_PutChar(1,0x010a,p+16*32);//设
null = LCD_PutChar(1,0x010c,p+17*32);//置
null = LCD_PutChar(1,0x011b,p+2*32);//up
null = LCD_PutChar(1,0x051b,p+3*32);//down
p = zero;
null = LCD_PutChar(1,0x0119,p);//
null = LCD_PutChar(1,0x0519,p);//
}
void vCheck(void)
{
unsigned char null = 0;
const unsigned char *p = ctrl;
p = ctrl;
null = LCD_PutChar(1,0x0106,p+8*32);//参
null = LCD_PutChar(1,0x0108,p+9*32);//数
null = LCD_PutChar(1,0x010a,p+20*32);//显
null = LCD_PutChar(1,0x010c,p+21*32);//示
null = LCD_PutChar(1,0x0119,p+50*32);//
null = LCD_PutChar(1,0x011b,p+51*32);//
p = zero;
null = LCD_PutChar(1,0x0519,p);//
null = LCD_PutChar(1,0x051b,p);//
}
void vDisplay(void)
{
const unsigned char *p = nen;
unsigned int dispa = 0;
unsigned int dispb = 0;
unsigned int dispc = 0;
unsigned int dispd = 0;
unsigned char k = 0;
unsigned char null = 0;
switch(WorkStatus)
{
case 0x00://上电显示LOGO
{
return;
}break;
case 0x14:
case 0x20://查看设置值
{
dispa = CVoltage;
dispb = CCurrent;
dispc = StopTemp;
dispd = StopTime;
}break;
//修改设置值
case 0x21:
case 0x22:
case 0x23:
case 0x24:
{
dispa = TempCVoltage;
dispb = TempCCurrent;
dispc = TempTemp;
dispd = TempTime;
}break;
default://默认显示
{
dispa = Voltage;
dispb = Current;
dispc = Temp;
dispd = Time;
}break;
}
p = nen;
//电压
k = (dispa/1000)%10;
null = LCD_PutEng(1,0x0306,p+k*16);
k = (dispa/100)%10;
null = LCD_PutEng(1,0x0307,p+k*16);
k = (dispa/10)%10;
null = LCD_PutEng(1,0x0309,p+k*16);
k = (dispa/1)%10;
null = LCD_PutEng(1,0x030a,p+k*16);
//电流
k = (dispb/1000)%10;
null = LCD_PutEng(1,0x0506,p+k*16);
k = (dispb/100)%10;
null = LCD_PutEng(1,0x0507,p+k*16);
k = (dispb/10)%10;
null = LCD_PutEng(1,0x0508,p+k*16);
k = (dispb/1)%10;
null = LCD_PutEng(1,0x050a,p+k*16);
//温度
k = (dispc/1000)%10;
//null = LCD_PutEng(1,0x0311,p+k*16);
k = (dispc/100)%10;
null = LCD_PutEng(1,0x0312,p+k*16);
k = (dispc/10)%10;
null = LCD_PutEng(1,0x0313,p+k*16);
k = (dispc/1)%10;
null = LCD_PutEng(1,0x0315,p+k*16);
//时间
k = (dispd/1000)%10;
null = LCD_PutEng(1,0x0512,p+k*16);
k = (dispd/100)%10;
null = LCD_PutEng(1,0x0513,p+k*16);
k = (dispd/10)%10;
null = LCD_PutEng(1,0x0514,p+k*16);
k = (dispd/1)%10;
null = LCD_PutEng(1,0x0515,p+k*16);
//..................................
null = LCD_PutEng(1,0x0308,p+53*16);
null = LCD_PutEng(1,0x0509,p+53*16);
null = LCD_PutEng(1,0x0314,p+53*16);
//null = LCD_PutEng(1,0x0514,p+53*16);
//VVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAA
p = web;
null = LCD_PutEng(1,0x030b,p+22*16);
null = LCD_PutEng(1,0x050b,p+23*16);
}
void vMenu(unsigned char key)
{
if(key>0x10)return;
switch(WorkStatus)
{
case 0x00://上电,显示LOGO,按任意键继续
{
if(key<0x10)
{
WorkStatus = 0x10;//待机状态
vLCD_Page_Change(1);//不同页面
vDisplay();
vStop();
}
}break;
case 0x10://待机状态
{
if(key==ROUND)//启动,需要等待确认(需要确定工作参数合理)
{
if((LowStatus&0x00ff)==0x0001)
{
WorkStatus = 0x11;
vWait2Ensure();
}
}
if(key==TRIANGEL)//设定参数
{
WorkStatus = 0x20;
TempCVoltage = CVoltage;
TempCCurrent = CCurrent;
TempTemp = StopTemp;
TempTime = StopTime;
vDisplay();
vWait2Ensure();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -