#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include "HZ.h"
#include "T6963.h"
#include "head.h"
//宏定义区///////////////////////////////////////////////////////////////
#define V_MAX 2000
#define A_MAX 5000
#define TE_MAX 999
#define TI_MAX 1999
#define CA_MAX 9999
#define B_MAX 999
#define DMAX 9999
#define VSADDR 0x0000
#define CSADDR 0x0002
#define TESADDR 0x0004
#define TISADDR 0x0006
/////////////////////////////////////////////////////////////////////////
//全局变量区/////////////////////////////////////////////////////////////
unsigned char WorkStatus = 0x00;//有限状态机
unsigned char TimeOut = 0x0A;//通信超时
unsigned char CPage = 0x00;//当前显示缓冲区首地址
unsigned char N_step = 0x00;//当前步
unsigned char N_cycle = 0x00;//当前周
unsigned char Stepchange = 0x00;
unsigned char number = 0x01;
unsigned char S_number[10];
unsigned char S_state = 0xf0;
unsigned char m_page = 0x00;
unsigned int XS_state[10];
unsigned char N_flag = 0x00;
unsigned char dis_fige = 0x00;
unsigned int NS_state = 0x0000;
unsigned int Work_commend = 0x0000;//工作命令,传给下位机
unsigned int Voltage = 0x0000;//实际电压72.00V
unsigned int Current = 0x0000;//实际电流300.0A
unsigned int ACurrent[10];
unsigned int Temp = 0x0000;//实际温度099.9C
unsigned int Time = 0x0000;//实际时间999M
unsigned int Capacitor = 0x0000;//实际容量
unsigned int CVoltage;//恒压72.00V
unsigned int XVoltage[10];//恒压72.00V
unsigned int CCurrent;//恒流300.0A
unsigned int XCurrent[10];//恒流300.0A
unsigned int StopCurrent;//涓流
unsigned int XStopCurrent[10];//涓流
unsigned int StopVoltage;//电压
unsigned int StopTemp = 0x0000;//停止温度099.9C
unsigned int StopTime;//停止时间999M
unsigned int XStopTime[10];//停止时间999M
unsigned int BackLight = 0x0000;//背光亮度
unsigned int StopCapacitor;//停止容量
unsigned int XStopCapacitor[10];//停止容量
unsigned int LowStatus = 0x0000;//下位机状态
unsigned int TempValue = 0x0000;//键盘输入临时值
/////////////////////////////////////////////////////////////////////////
//自编函数区/////////////////////////////////////////////////////////////
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 vSet_state(unsigned char op);
void vMenu(unsigned char key);
void vWait(unsigned int us);
//void wait_m(unsigned int ms_)
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);
char LCD_Case1(unsigned char page);
void vLCD_Page_Change(unsigned char page);
void LCD_page0(void);//logo
void LCD_page1(void);//real
void LCD_page2(void);//c/v
void LCD_page3(void);//tt
void AVE_current(void);
void DisNum(unsigned int nm,unsigned char tp);
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);
void wait(unsigned int time) //延时
{
unsigned int i;
unsigned char j;
for(i=0;i<time;i++){
for(j=0;j<6;j++){
__asm__(" WDR");
}
}
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
int main(void)
{
unsigned int ms = 0;
unsigned int msa = 0;
unsigned int msb = 0;
unsigned int msc = 0;
unsigned int msf = 0;
unsigned int msg = 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(1);
wait(10000);
wait(10000);
wait(10000);
vDataInit();
vDisplay();
//vLCD_Page_Change(1);
//vLCD_Page_Change(2);
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%2000)==99)&&(msf!=ms))
{
msf=ms;
msg++;
if(msg>10)
{
LCD_page1();
LCD_page2();
msg=0;
}
}
if(((ms%20)==5)&&(msa!=ms))
{
msa = ms;
//TODO: the code below will be execute every 30ms
ka = cKey(cKeyScan());
if(kb != ka)
{
kb = ka;
if(kb < 0x14)vMenu(kb);
}
vSetPara();
if((LowStatus&0x00ff)==0x0009)
{
if(Stepchange==0x0f)Stepchange=0x00;
}
if((LowStatus&0x00ff)==0x0021)
{
if(Stepchange==0x00)
{
Stepchange=0x0f;
N_step = N_step+1;
NS_state = XS_state[N_step];
CVoltage = XVoltage[N_step];
CCurrent = XCurrent[N_step];
StopCurrent = XStopCurrent[N_step];
StopTime = XStopTime[N_step];
StopCapacitor = XStopCapacitor[N_step];
N_flag = S_number[N_step];
WorkStatus = 0x30;
vWork();
dis_fige=1;
if(NS_state==0)
{
WorkStatus = 0x10;
Work_commend=0xff00;
vStop();
dis_fige=0;
}
if(NS_state==5)
{
N_step = N_flag-1;
N_cycle++;
WorkStatus = 0x12;
}
}
}
}
if(((ms%100)==15)&&(msb!=ms))
{
msb = ms;
//TODO: the code below will be execute every 100ms
DisNum(0,0);
}
if(((ms%10)==3)&&(msc!=ms))
{
msc = ms;
AVE_current();
}
}
return(-1);
}
//////////////////////////////////////////////////////////////////////
void vDisplay(void)
{
DisNum(0,0);
DisNum(XVoltage[number],5);
DisNum(XCurrent[number],6);
DisNum(XStopCurrent[number],7);
DisNum(XStopTime[number],8);
DisNum(XStopCapacitor[number],9);
DisNum(S_number[number],10);
vSet_state(XS_state[number]);
}
//中断服务函数区/////////////////////////////////////////////////////////
/*ISR(SPI_STC_vect)
{
unsigned char val = 0x00;
unsigned int tout= 0X0000;
val=SPSR;
val = SPDR;
SPDR=0x55;
}*/
ISR(SPI_STC_vect)
{
volatile static unsigned char bn = 0xff;
static unsigned char kk = 0x00;
static unsigned char k = 0x00;
static unsigned char mp = 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 = StopCapacitor%0x100;//发送容量上限
}break;
case 7:
{
SPDR = NS_state%0x100;//发送停止电压
}break;
case 8:
{
}break;
default: break;
}
}brea
LCD_KEY.rar_AVR ATMEGA32_AVR LCD_atmega32
版权申诉
50 浏览量
2022-09-19
14:24:45
上传
评论
收藏 181KB RAR 举报
林当时
- 粉丝: 95
- 资源: 1万+
最新资源
- 技术面试最后反问面试官的话 校招面试非技术问题有哪些 非技术问题如何回答.png
- NB-IOT-BC26全网通模块Altium+ CADENCE +PADS三种格式(原理图SCH+PCB封装库)文件.zip
- 基于微信小程序开发的校园失物招领系统源码毕业设计(优质项目源码).zip
- 词向量是一种将自然语言中的单词转换为数值向量的技术,它能够捕捉词义和上下文信息
- nmap与masscan的简单使用
- MyBatis动态SQL.pdf
- 基于stm32单片机protues仿真的温湿度控制系统设计(仿真图、源代码)
- 词向量:自然语言处理的基石
- mybatis动态sql
- 40G微信小程序开发教程(工具插件+视频教程)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈