📄 test1.c
字号:
#include "lf2407regs.h"
/*------------------------------------------------------------*/
unsigned int receive[10];
int rev_num=0;
unsigned int send[10];
int send_num=0;
unsigned int period;
int i;
int j=0;
unsigned int kai_ru;
unsigned int eeprom[32];
/**************************************************************/
/**************************************************************/
/**************************************************************/
/*------------------------------------------------------------*/
void inline DISABLE()
{
asm(" setc INTM ");
}
void inline ENABLE()
{
asm(" clrc INTM ");
}
/*------------------------------------------------------------*/
void interrupt nothing()
{
return;
}
/*------------------------------------------------------------*/
void DELAY(unsigned int time)
{
unsigned a,b;
b=0;
for(a=0;a<=time;a++) b+=1;
}
/*----------------------------SCI程序-------------------------*/
void UARTSENT(int N) //发送服务程序
{
if(send_num>N-1)
{send_num=0; return;} //如果需要发送的字符都已经发送完,则中断直接返回 */
*SCITXBUF=send[send_num]; //依次发送定义的字符串中的各个字符
send_num++;
}
/*------------------------------------------------------------*/
void KAI_RU()
{
;
}
/*------------------------------------------------------------*/
void KAI_CHU()
{
;
}
/*------------------------------------------------------------*/
void CE_PIN()
{
;
}
/*------------------------------------------------------------*/
void YAO_CE()
{
;
}
/*------------------------------------------------------------*/
void DU_E2()
{
;
}
/*------------------------------------------------------------*/
void XIE_E2()
{
;
}
/*------------------------------------------------------------*/
void CAN_SHOU()
{
;
}
/*------------------------------------------------------------*/
void CAN_FA()
{
;
}
/*------------------------------------------------------------*/
void UARTREC() //接收服务程序
{
unsigned int SUM,N,L;
receive[rev_num]=*SCIRXBUF; //依次接收字符
rev_num++;
if (receive[0]!=0x68) { rev_num=0; return; }
if (rev_num>2 && receive[1]!=receive[2]) { rev_num=0; return; }
if (rev_num>3 && receive[3]!=0x68) { rev_num=0; return; }
if (rev_num>4 && receive[4]!=0x00) { rev_num=0; return; }
L=receive[1];
if (rev_num==L+6)
{
SUM=0;
for(N=4;N<L+4;N++) SUM+=receive[N];
if ((SUM & 0xff)!=receive[L+4] || receive[L+5]!=0x16) { rev_num=0; return; }
rev_num=0;
if (receive[5]==0x01) KAI_RU();
else if (receive[5]==0x02) KAI_CHU();
else if (receive[5]==0x03) CE_PIN();
else if (receive[5]==0x04) YAO_CE();
else if (receive[5]==0x05) DU_E2();
else if (receive[5]==0x06) XIE_E2();
else if (receive[5]==0x07) CAN_SHOU();
else if (receive[5]==0x08) CAN_FA();
}
}
/*----------------------------通讯中断服务程序-------------------------*/
interrupt void CAN_SCI()
{
unsigned char ch;
ch=*PIVR; //保存现场中断向量
*EVAIMRA=*EVAIMRA | 0x80; // 允许定时器1的周期中断
ENABLE();
switch(ch)
{ case 6: //如果PIVR=6,则发生了接收中断,执行接收服务程序
{
UARTREC();
*IFR=*IFR | 0x10; //清除IFR中相应的中断标志
break;
}
case 7: //如果PIVR=7,则发生了发送中断,执行发送服务程序
{
UARTSENT(8);
*IFR=*IFR | 0x10; //清除IFR中相应的中断标志
break;
}
/* case 64:
{
fg=*MBX0A;
*RCR=0x10;
*CAN_IFR=0xffff;
*CAN_IMR=0x8180;
break;
} */
default: break;
}
ENABLE();
}
/*---------------------捕捉中断服务程序----------------------*/
interrupt void CAPINT()
{
static unsigned int result1,result2;
static int flag2=0;
if (*PIVR==0x34) //如果PIVR=0x34,则发生了CAP2中断
{
if(flag2==0)
{
result1=*CAP2FIFO; // 读取捕捉值1
flag2=1;
}
else
{
result2=*CAP2FIFO; // 读取捕捉值2
flag2=0;
period=result2-result1;
result2=*CAP2FIFO; // 清空FIFO
*T2CNT=0x00; // 计数器清0
}
*EVAIFRC=*EVAIFRC | 0x02;
}
ENABLE();
}
/*----------------------采样程序--------------------------------*/
void AD_CONV(unsigned int channel,unsigned int * addr)
{
static int i=0;
*SPICCR=0x0B; //复位SPI,12位数据,上升沿发送
*SPIBRR=5; //波特率3.3MHz
*SPICTL=0x06; //无延时,主模式,允许发送,禁止中断
*SPICCR=0x8B; //脱离复位
*PCDATDIR=*PCDATDIR | 0x0001; //IOPC0=1 使能AD
DELAY(1);
*SPIDAT=channel<<12; //发命令字,选择通道
while(((*SPISTS)&0x40)==0); //判断发送是否完成
*(addr+i)=*SPIRXBUF; //虚读数据,清标志位
DELAY(5); //10us延时,等待转换完成
*SPIDAT=0xB000; //虚发送
while(((*SPISTS)&0x40)==0); //判断发送是否完成
*(addr+i)=*SPIRXBUF; //读取转换结果
i++;
if (i>31)
{i=0;}
*PCDATDIR=*PCDATDIR & 0xFFFE; //IOPC0=0 禁止AD
}
/*-----------------定时器1周期中断服务程序--------------------- */
interrupt void T1INT()
{
if(*PIVR==0x27)
{
AD_CONV(0,(unsigned int *)0x0200);
*EVAIFRA=*EVAIFRA | 0x80; // 清除定时器1周期中断标志,否则以后的中断将被忽略
}
ENABLE(); // 允许总中断,因一进中断服务程序后总中断就自动关闭了
}
/*------------------读取开关量输入程序-----------------------------*/
unsigned int READ_DIN()
{
unsigned int R_ESULT=0;
int i;
volatile unsigned int *j;
*PCDATDIR=*PCDATDIR & 0xFFFD; //IOPC1=0使能DI
*ADCTRL2=0x4200; //复位SEQ1,清楚中断标志
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -