📄 can.c
字号:
#include "public.h"
void can_init(void)
{
uchar whamr0,whamr1,a,b,c;
P2_7=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P2_7=1;
if(data5045.cF0==0){
a=0x09;
}else{
a=0x06;
}
c=data5045.cF1+1;
//定义代码和掩码
whacr0=((a<<3)|(c>>3)); //01001(控制器为1)或00110(为其他的值)+层楼数的高3位:要分奇偶数值*/
whacr1=((c<<5)|(0x00>>3)); //层楼数的低3位+RTR+随机数*/
whamr0=0x07; //00000+111
whamr1=0xff;
//定义发送标识符
a=cCtrlNum[data5045.cF0];
b=(data5045.cF1+1);
whid1=((a<<3)|(b>>3)); //控制器标识符+层楼数的高3位*/
whid2=((b<<5)|(0x00>>3)); //层楼数的低3位+随机数*/
do{XBYTE[((P2&0xe0)|0x0F)*256]=0x09;} //进入复位状态,为单滤波方式
while(XBYTE[((P2&0xe0)|0x0F)*256]&0x01==0); //复位信号的查询和置位
//定义时钟分配器,CLKOUT没有使用,则clock off为1,RXINTEN为0,CBP置位,CAN 模式为Pelican,为1;
XBYTE[((P2&0xe0)|0x0F)*256+31]=0xc8;
XBYTE[((P2&0xe0)|0x0F)*256+3]=0; //禁止SJA1000所有的中断
XBYTE[((P2&0xe0)|0x0F)*256+16]=whacr0; //定义接收代码和掩码
XBYTE[((P2&0xe0)|0x0F)*256+17]=whacr1;
XBYTE[((P2&0xe0)|0x0F)*256+18]=0x00;
XBYTE[((P2&0xe0)|0x0F)*256+19]=0x00;
XBYTE[((P2&0xe0)|0x0F)*256+20]=whamr0;
XBYTE[((P2&0xe0)|0x0F)*256+21]=whamr1;
XBYTE[((P2&0xe0)|0x0F)*256+22]=0xff;
XBYTE[((P2&0xe0)|0x0F)*256+23]=0xff;
// 定义总线定时器:波特率为:125kbit,采样点为:87。5%
XBYTE[((P2&0xe0)|0x0F)*256+6]=0x02; //此时为12兆晶振。
XBYTE[((P2&0xe0)|0x0F)*256+7]=0x1c;
//当为8兆晶振时,应该为:XBYTE[0x06]=0x01;XBYTE[0x07]=0x1c;
//定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
//当为16兆晶振时,应该为:XBYTE[0x06]=0x03;XBYTE[0x07]=0x1c;
//定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
XBYTE[((P2&0xe0)|0x0F)*256+8]=0x1a;
//定义RX buffer start address RBSA(由于每个数据帧为11个字节)
do //置位复位状态
{XBYTE[((P2&0xe0)|0x0F)*256]=0x08;} //运行状态,单滤波
while((XBYTE[((P2&0xe0)|0x0F)*256]&0x01)!=0x00);
}
//2005.01.06 LHM 显示板改进
void senddata(void)
{
/*
uchar csenddata;
//发送数据(条件:1.外呼按钮按下+未收到外呼灯点亮数据+开入点滤波100ms)
// (条件:2.锁梯信号+开入点滤波100ms)
// (条件:3.消防信号+开入点滤波100ms)
// (条件:4.消防返回信号+开入点滤波100ms)
if(P1_7==1){
if((data5045.cF3==0) && (data5045.cF4==0)){ //当功能F3和F4都设置为0时,仅发一次
if((time1_flg==1)&&(P1_1==0)&&(m_existupcallflg==0)){ //上呼设定
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time1_flg=0;
time1_count=TIMER_FILTER_NUM;
}
if((time2_flg==1)&&(P1_3==0)&&(m_existdowncallflg==0)){ //下呼设定
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time2_flg=0;
time2_count=TIMER_FILTER_NUM;
}
}else{
if((time1_flg==1)&&(P1_1==0)&&(m_existupcallflg==0)){ //上呼设定
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time1_flg=0;
time1_count=TIMER_FILTER_NUM;
}
if((time2_flg==1)&&(P1_3==0)&&(m_existdowncallflg==0)){ //下呼设定
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time2_flg=0;
time2_count=TIMER_FILTER_NUM;
}
if(time6_flg==1){
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time6_flg=0;
time6_count=TIMER_1000ms;
}
}
}
if(m_RecData.cMaxFloor==1){ //上电后,当初始最大楼层数为1时,发"读最大楼层数"
if(time7_flg==1){
dispose_sendata(0x5A, 0x00);
time7_flg=0;
time7_count=TIMER_200ms;
}
}
*/
}
void dispose_sendata(uchar data1,uchar data2) //发送数据,每次发送两个数据
{ do {}
while((XBYTE[((P2&0xe0)|0x0F)*256+2]&0x04)!=0x04); //判断发送缓冲区是否释放
XBYTE[((P2&0xe0)|0x0F)*256+16]=0x02; //数据长度为2;
XBYTE[((P2&0xe0)|0x0F)*256+17]=whid1; //主机的发送标识符:00110+层楼数(1~50)
XBYTE[((P2&0xe0)|0x0F)*256+18]=whid2;
XBYTE[((P2&0xe0)|0x0F)*256+19]=data1;
XBYTE[((P2&0xe0)|0x0F)*256+20]=data2;
XBYTE[((P2&0xe0)|0x0F)*256+1]=0x01;
}
uchar getsenddata(void)
{
if((P1_4==0) /*&& (data5045.cF4==1) && (m_cFireServiceFlg==0)*/){
abit_3=1;abit_2=0; //设置消防服务
m_cFireServiceFlg=1;
}else if(P1_4==1){
abit_3=0;abit_2=1;
m_cFireServiceFlg=0;
}
if((P1_5==0) /*&& (data5045.cF4==1) && (m_cFireFlg==0)*/){
abit_5=1;abit_4=0; //设置消防
}else if(P1_5==1){
abit_5=0;abit_4=1;
}
if((P1_6==0) /*&& (data5045.cF3==1) && (m_cLockFlg==0)*/){
abit_7=1;abit_6=0; //设置锁梯
}else{
abit_7=0;abit_6=1;
}
//删去"点击一次设置外呼,再点击一次取消外呼" 2004.09.27(接赵工指示修正)
if(P1_0==0){
abit_1=1;abit_0=0; //设置上呼信号:注意:设置时是否不对。应该在有1~0变化时,才发送一个信号
}else if(P1_2==0){
abit_1=0;abit_0=1; //设置下呼信号
}else{
abit_0=0;abit_1=0;
}
return(abit);
}
void receivedata(void)
{
uchar c0id1,c0id2,c0command,c0data;
if((XBYTE[((P2&0xe0)|0x0F)*256+2]&1)==1){
c0id1=XBYTE[((P2&0xe0)|0x0F)*256+17]; //接收的数据id1
c0id2=XBYTE[((P2&0xe0)|0x0F)*256+18]; //接收的数据id2
c0command=XBYTE[((P2&0xe0)|0x0F)*256+19]; //接收的命令
c0data=XBYTE[((P2&0xe0)|0x0F)*256+20]; //接收的参数
XBYTE[((P2&0xe0)|0x0F)*256+1]=0xc;
dispose_recdata(/*c0id1,c0id2,*/c0command,c0data);/*调用数据处理*/
time_nocan_count=TIMER_400ms;
time_nocan_flg=0;
}
}
//2005.01.06 LHM 显示板改进
void dispose_recdata(/*uchar c0id1,uchar c0id2,*/uchar c0command,uchar c0data)
{
uchar cTemp;
if(c0command==0x55){ //显示楼层数(LHM QUESTION:负楼层的显示以前的程序似乎并未实现)
if((c0data>=0xf7)&&(c0data<=0xff)){ //当输入值为-9 --- -1时,相对应显示输入值为0~8.显示为:-9~-1
cTemp=(c0data-0xf7);
}else if((c0data>=1)&&(c0data<=48)){ //当输入值为1~48时,显示输入值为:9~56.显示为:1~48;
cTemp=(c0data+8);
}else if((c0data>=61)&&(c0data<=69)){ //当输入值为61~69时,显示输入值为:69~77.显示为:B1~B9
cTemp=(c0data+8);
}
if(m_RecData.cCurFloor!=cTemp){
m_cWholeMoveOKFlg=0;
m_cMoveCnt=0;
m_cMoveTimer=TIMER_ONELINE_NUM;
m_cNewLineFlg=0;
}
m_RecData.cCurFloor = cTemp;
}else if(c0command==0xaa){ //显示方向
if(c0data==0x55){ //上
m_RecData.cDirect=1;
}else if(c0data==0xaa){ //下
m_RecData.cDirect=0;
}else if(c0data==0x00){ //无
m_RecData.cDirect=0xFF;
}
}/*else if(c0command==0xcc){ //确保上呼灯下呼灯灭
P1_1=0;P1_3=0;
}else if(c0command==0x5a){
if((c0id1==whacr0)&&(c0id2==whacr1)){//如果can0的发送标识符和外呼的接收代码相同
if(c0data==0x50){ //上呼梯灯亮
P1_1=1;
m_existupcallflg=1;
}else if(c0data==0x05){ //下呼梯灯亮
P1_3=1;
m_existdowncallflg=1;
}else if(c0data==0xa0){ //上呼梯灯灭
P1_1=0;
m_existupcallflg=0;
}else if(c0data==0x0a){ //下呼梯灯灭
P1_3=0;
m_existdowncallflg=0;
}else if(c0data==0xcc){ //全消
P1_1=0;
m_existupcallflg=0;
P1_3=0;
m_existdowncallflg=0;
}
}
}else if(c0command==0xa5){ //显示亮度(休眠),对应锁梯
if(c0data==0x55){ //休眠
m_cLockDarkFlg=1;
}else if(c0data==0xAA){ //正常
m_cLockDarkFlg=0;
}
}else if(c0command==0x3c){ //检修
if(c0data==0x55){ //否
P2_6=0;
m_cRepairFlg=0;
}else if(c0data==0xAA){ //是
P2_6=1;
m_cRepairFlg=1;
}
}else if(c0command==0xc3){ //锁梯
if(c0data==0x55){ //否
P2_5=0;
m_cLockFlg=0;
}else if(c0data==0xAA){ //是
P2_5=1;
m_cLockFlg=1;
}
}else if(c0command==0x3A){ //消防
if(c0data==0x55){ //取消消防
m_cFireFlg=0;
m_cFireBaseFlg=0;
}else if(c0data==0x3C){ //消防但不在基站
m_cFireFlg=1;
m_cFireBaseFlg=0;
}else if(c0data==0xC3){ //消防且在基站
m_cFireFlg=1;
m_cFireBaseFlg=1;
}
}*/else if(c0command==0x33){ //最大楼层数
m_RecData.cMaxFloor=c0data-1;
}/*else if(c0command==0xA3){
if(c0data==0x55){ //否
m_cStopFlg=0;
}else if(c0data==0xAA){ //是
m_cStopFlg=1;
}
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -