📄 can.c
字号:
#include<stdlib.h>
#include<string.h>
#include "CAN.h"
#include "def.h"
#include "2410addr.h"
#include "option.h"
#include "GUI.h"
#include "2410lib.h"
#include "lcd.h"
#include "spi.h"
#include "mcp2515.h"
char CAN_Message[8]={};
static int red=1;
static int green=1;
extern int temperature;
int DrawX=210;
#ifdef TFT
int DrawY=119;
#else
int DrawY=268;
extern ROW ROWList[MAXLine];
extern int activerow;
#endif
void can_initMessageStruct(CanMessage* msg)
{
memset(msg,0,sizeof(CanMessage));
}
unsigned char mcp2515_getNextFreeTXBuf(unsigned char *txbuf_n)
{
unsigned char res, i, ctrlval;
unsigned char ctrlregs[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL };
res = MCP_ALLTXBUSY;
*txbuf_n = 0x00;
// check all 3 TX-Buffers
for (i=0; i<MCP_N_TXBUFFERS; i++) {
ctrlval = mcp2515_readRegister( ctrlregs[i] );
if ( (ctrlval & MCP_TXB_TXREQ_M) == 0 ) {
*txbuf_n = ctrlregs[i]+1; // return SIDH-address of Buffer
res = MCP2515_OK;
return res; /* ! function exit */
}
}
return res;
}
unsigned char can_sendMessage(CanMessage* msg)
{
unsigned char res, txbuf_n;
unsigned char timeout = 0;
do {
res = mcp2515_getNextFreeTXBuf(&txbuf_n); // info = addr.
} while (res == MCP_ALLTXBUSY);
// txbuf_n=MCP_TXB0CTRL+1;
if (res!=MCP_ALLTXBUSY) {
mcp2515_write_canMsg( txbuf_n, msg);
mcp2515_start_transmit( txbuf_n );
return CAN_OK;
}
else {
return CAN_FAILTX;
}
}
void CAN_Write(char * value,int n)
{
CanMessage msg;
can_initMessageStruct(&msg);
msg.identifier = CANDEFAULTIDENT;
msg.extended_identifier = CANDEFAULTIDENTEXT;
msg.dlc = n;
msg.rtr = 0;
strncpy(msg.dta,value,n);
can_sendMessage(&msg);
}
void CAN_Init(void)
{
spi_init();
mcp2515_Init(CAN_20KBPS);
rGPGCON&=0xffffff3f;
rGPGCON|=(1<<7);
rGPGUP&=0xfff7;
rGPGDAT|=(1<<3);
rINTMSK &= ~(BIT_EINT8_23);
rEINTMASK&=~(1<<11);
}
void __irq CAN_LISR(void)
{
int temp;
unsigned char stat, res;
CanMessage msg;
stat = mcp2515_readStatus();
if ( stat & MCP_STAT_RX0IF ) {
// Msg in Buffer 0
mcp2515_read_canMsg( MCP_RXBUF_0,&msg);
mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0);
res = CAN_OK;
}
else if ( stat & MCP_STAT_RX1IF ) {
// Msg in Buffer 1
mcp2515_read_canMsg( MCP_RXBUF_1,&msg);
mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0);
res = CAN_OK;
}
else {
res = CAN_NOMSG;
mcp2515_modifyRegister(MCP_CANINTF, 0xff, 0x00);
}
strcpy(CAN_Message,msg.dta);
for(temp=0;temp<strlen(CAN_Message);temp++)
if(CAN_Message[temp]=='#')
{
CAN_Message[temp]='\0';
break;
}
CAN_Data_Process(CAN_Message);
temp=rEINTPEND;
rEINTPEND=temp;
temp = rSRCPND;
rSRCPND = temp;
temp = rINTPND;
rINTPND = temp;
rGPGDAT|=(1<<3);
}
/*
c:The written data
pencolor: The color of data
L:实际写入文字区域的右边界
W:实际写入文字区域的上边界
x_start:可以被写入文字的最后一行的x坐标
y_start:可以被写入文字的最后一行的y坐标
DrawX:全局变量,实际写入文字区域的左边界
DrawY:全局变量,实际写入文字区域的上边界
*/
//void DrawData(char *c,int pencolor,int area_left,int area_right,int area_up,int down_x,int down_y)
void DrawData(char *c,int pencolor,int L,int W,int x_start,int y_start)
{
int i,j;
while(*c!='\0')
{
while((DrawX<L) && (*c!='\0')&&(DrawY>=y_start)) /*while the X coordinate don't exceed the scope of X limit*/
{
drawascii168(DrawX,DrawY,c,pencolor); /*display the character*/
DrawX+=8;
c++;
}
DrawX=x_start; /*exchange the next row*/
if (DrawY <y_start)
{
for(j=W;j>=y_start-16;j--)
for(i=x_start;i<L;i++)
{
*(short *)(VideoAddrStart+(i*x_size+j)*2) = *(short *)(VideoAddrStart+(i*x_size+j-16)*2);
}
while((DrawX<L) && (*c!='\0')) /*while the X coordinate don't exceed the scope of X limit*/
{
drawascii168(DrawX,y_start,c,pencolor); /*display the character*/
DrawX+=8;
c++;
}
}
else
DrawY-=16;
}
}
void CAN_Data_Process(char * message)
{
int i=0,x,y;
int temperature_temp;
char buf[4];
char head[13]={"EINT"};
char tail[7]={" is on"};
switch(message[0])
{
case '1':
temperature_temp=atoi(&message[1]);
#ifdef TFT
x=130;
y=175;
#else
x=250;
y=330;
#endif
sprintf(buf,"%d\0",temperature);
// drawascii168(x,y,buf,rgb(0,0,255));
drawascii168space(x,y,4,rgb(0,0,255));
temperature=temperature_temp;
sprintf(buf,"%d",temperature_temp);
drawascii168(x,y,&message[1],rgb(255,255,0));
break;
case '2'://red led
#ifdef TFT
x=70;
y=125;
#else
x=150;
y=240;
#endif
if(message[1]=='1')
{
Led4_On_or_Off(TRUE);
#ifdef TFT
eraseHZ(x,y,rgb(0,0,255));
drawtext(x,y,"开",1,0,rgb(255,255,0));
#else
eraseHZ24(x,y,rgb(0,0,255));
drawtext24(x,y,"开",1,3,rgb(255,255,0));
#endif
}
else
{
Led4_On_or_Off(FALSE);
#ifdef TFT
eraseHZ(x,y,rgb(0,0,255));
drawtext(x,y,"关",1,0,rgb(255,255,0));
#else
eraseHZ24(x,y,rgb(0,0,255));
drawtext24(x,y,"关",1,3,rgb(255,255,0));
#endif
}
break;
case '3'://green led
#ifdef TFT
x=70;
y=65;
#else
x=150;
y=140;
#endif
if(message[1]=='1')
{
Led1_On_or_Off(TRUE);
#ifdef TFT
eraseHZ(x,y,rgb(0,0,255));
drawtext(x,y,"开",1,0,rgb(255,255,0));
#else
eraseHZ24(x,y,rgb(0,0,255));
drawtext24(x,y,"开",1,3,rgb(255,255,0));
#endif
}
else
{
Led1_On_or_Off(FALSE);
#ifdef TFT
eraseHZ(x,y,rgb(0,0,255));
drawtext(x,y,"关",1,0,rgb(255,255,0));
#else
eraseHZ24(x,y,rgb(0,0,255));
drawtext24(x,y,"关",1,3,rgb(255,255,0));
#endif
}
break;
case '4':
strcat(head,&message[1]);
strcat(head,tail);
#ifdef TFT
DrawData(head,rgb(255,255,0),315,119,160,39);
#else
DrawActiveline(320,268,600,head,rgb(255,255,0),rgb(0,0,255));
#endif
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -