#define __dsPIC30F4014__
#include <p30f4014.h>
#include <math.h>
#include <uart.h>
#include <timer.h>
#include<spi.h>
//定义配置位
#define nop() asm("nop")
#define CLRWDT() asm("clrwdt")
#define ADL PORTBbits.RB0
#define ADY PORTBbits.RB1
#define KEY1 PORTBbits.RB3
#define KEY2 PORTBbits.RB4
#define KEY3 PORTBbits.RB5
#define KEY4 PORTCbits.RC13
#define DASCLK PORTDbits.RD9
#define DADIN PORTDbits.RD3
#define LCDD PORTFbits.RF2
#define LCDK PORTFbits.RF3
#define PR PORTFbits.RF4
#define PT PORTFbits.RF5
#define PDSR PORTFbits.RF6
#define PCTS PORTBbits.RB2
#define IO1 PORTDbits.RD8
#define IO2 PORTDbits.RD2
#define IO3 PORTBbits.RB8
#define IO4 PORTBbits.RB12
#define DY1 PORTBbits.RB9
#define DY2 PORTBbits.RB10
#define DL1 PORTDbits.RD0
#define DL2 PORTDbits.RD1
#define SLCK PORTFbits.RF1
#define SIO PORTFbits.RF0
#define SRET PORTAbits.RA11
//定义变量
//函数声明
void delay(unsigned int delay);
void inital(void);
void uart1int(void);
void ADDY(void);
void ADDL(void);
void InitLCD(void);
void LCDOutData(unsigned char dat);
void LCDOutCONT(unsigned char dat);
void SUBYEAR(void)
void SUBMONTH(void)
void SUBDAY(void)
void SUBHUOR(void)
void SUBMINUTE(void)
void SUBSECOND(void)
void SHIJIAN(void)
void CELIANG(void)
void ADDYEAR(void)
void ADDMONTH(void)
void ADDDAY(void)
void ADDHUOR(void)
void ADDMINUTE(void)
void ADDSECOND(void)
void SHIJTZ2(void)
void SHIJTZ3(void)
void SHIJTZ4(void)
void SHIJTZ5(void)
void SHIJTZ6(void)
void SHIJTZ7(void)
void CHUSHIXS(void)
void DAYIN(void)
void SJ(void)
void CL(void)
void CL1(void)
void CL2(void)
void CL3(void)
void TIAOZHENGSJ(void)
void XIANSHISJ(void)
void InitUART2(void)
unsigned char UART2Write(unsigned char AA)
void __attribute__((__interrupt__)) _U2TXInterrupt(void)
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
void _attribute_((_interrupt_))_key(void)
unsigned int DAWrite(unsigned int AA)
unsigned int SZWrite(unsigned int AA,unsigned int BB)
unsigned int SZRead(unsigned int AA,unsigned int BB)
float dianya,dianliu;
float A,B,C,D,E,F;
unsigned int baudvalue; // Holds the value of baud register
unsigned int U2MODEvalue; // Holds the value of uart config reg
unsigned int U2STAvalue; // Holds the information regarding uart TX & RX interrupt modes
int main (void)
{
unsigned char a1,b1,c1,d1;
//unsigned char ch_status1,ch_status2;
// int c,d,e,f,g,i;
//int max1, max2;
// int min1, min2;
// unsigned int base;
// volatile unsigned int fudu1,fudu2;
//double maxd1,mind1,maxd2,mind2;
// double FuDud1,FuDud2;
inital();
delay(5000);
InitLCD();
a1=0x80;
b1=0x41;
LCDOutCONT(a1);
delay(500);
LCDOutData(b1);
}
//延时子程序
void delay(unsigned int delay)
{
while (--delay);
}
//系统初始化
void inital(void)
{
TRISBbits.TRISB3=1; // set KEY1 is input
TRISBbits.TRISB4=1; // set KEY2 is input
TRISBbits.TRISB5=1; // set KEY3 is input
TRISCbits.TRISC13=1; // set KEY4 is input
TRISBbits.TRISB9=0; // set DY1 is output
TRISBbits.TRISB10=0; // set DY2 is output
TRISDbits.TRISD0=0; // set DL0 is output
TRISDbits.TRISD1=0; // set DL1 is output
TRISDbits.TRISD8=0; // set I/O1 is output
TRISDbits.TRISD2=0; // set I/O2 is output
TRISBbits.TRISB8=0; // set I/O3 is output
TRISBbits.TRISB12=0; // set I/O4 is output
TRISFbits.TRISF2=1; // set LCDD is input
TRISFbits.TRISF3=1; // set LCDK is input
}
//电流采样
void ADDL(void)
{
IEC0bits.ADIE=0;
ADPCFG=0XFFFE;
ADCON1=0X000;
ADCHS=0X0000;
ADCSSL=0;
ADCON3=0X0002;
ADCON2=0;
ADCON1bits.ADON=1;
ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
delay(200);
ADCON1bits.SAMP=0;
while(ADCON1bits.DONE);
DIANLIU=ADCBUF0;
}
//电压采样
void ADDY(void)
{
IEC0bits.ADIE=0;
ADPCFG=0XFFFD;
ADCON1=0X000;
ADCHS=0X0001;
ADCSSL=0;
ADCON3=0X0002;
ADCON2=0;
ADCON1bits.ADON=1;
ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
delay(200);
ADCON1bits.SAMP=0;
while(ADCON1bits.DONE);
DIANYA=ADCBUF1;
}
//LCD数据字输入程序
void LCDOutData(unsigned char dat)
{
int i;
DELAY(500)
W0=dat;
TRISFDbits.TRISF2=0;
TRISFDbits.TRISF3=0; //设置F口的2、3为输出
for(i=0,i<5,i++)
{
LCDD=1; //开始传输
LCDK=0;
LCDK=1;
}
LCDD=0; //写入到数据寄存器
LCDK=1;
LCDK=0;
LCDD=1;
LCDK=1;
LCDK=0;
LCDD=0;
LCDK=1;
LCDK=0;
W0<<8;
for(i=0,i<4,i++)
{if ((W0<<1)&0x80)
{
LCDD=1;
}
else
{
LCDD=0;
}
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{
LCDD=0; //4结束
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{if ((W0<<1)&0x80)
{
LCDD=1;
}
else
{
LCDD=0;
}
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{
LCDD=0; //4结束
LCDK=1;
LCDK=0;
}
DELAY(500);
}
//LCD控制字输入程序
void LCDOutCONT(unsigned char dat)
{
int i;
DELAY(500)
W0=dat;
TRISFDbits.TRISF2=0;
TRISFDbits.TRISF3=0; //设置F口的2、3为输出
for(i=0,i<5,i++)
{
LCDD=1; //开始传输
LCDK=0;
LCDK=1;
}
LCDD=0; //写入到控制寄存器
LCDK=1;
LCDK=0;
LCDD=0;
LCDK=1;
LCDK=0;
LCDD=0;
LCDK=1;
LCDK=0;
W0<<8;
for(i=0,i<4,i++)
{if ((W0<<1)&0x80)
{
LCDD=1;
}
else
{
LCDD=0;
}
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{
LCDD=0; //4结束
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{if ((W0<<1)&0x80)
{
LCDD=1;
}
else
{
LCDD=0;
}
LCDK=1;
LCDK=0;
}
for(i=0,i<4,i++)
{
LCDD=0; //4结束
LCDK=1;
LCDK=0;
}
DELAY(500);
}
//LCD初始化程序
void InitLCD(void)
{
DELAY(500);
LCDOutCONT(0x30);
DELAY(500);
LCDOutCONT(0x30);
DELAY(500);
LCDOutCONT(0x0c);
DELAY(500);
LCDOutCONT(0x01);
DELAY(500);
LCDOutCONT(0x07);
DELAY(500);
}
//键盘初始化程序
void keyinitial(void)
{
CNEN1bits.CN5=1; //中断使能
CNEN1bits.CN6=1;
CNEN1bits.CN7=1;
CNPU1bits.CN1PUE=1;
CNPU1bits.CN5PUE=1;
CNPU1bits.CN6PUE=1;
}
//键盘中断程序
void _attribute_((_interrupt_))_key(void)
{
int K;
IFS0bits.CNIF=0; //清中断标志位
K=1500; //延时
while (--K);
if(PORTBbits.RB3==0)
{
if(D!=0)
{
if(D==1)
SUBYEAR(void); //年数减
if(D==2)
SUBMONTH(void); //月数减
if(D==3)
SUBDAY(void); //天数减
if(D==4)
SUBHUOR(void); //时数减
if(D==5)
SUBMINUTE(void); //分数减
if(D==6)
SUBSECOND(void); //秒数减
}
else if(C!=0)
{