?? sja1000 basiccan模式的通訊測試程序.txt
字號:
#include <P8XC5X2.H>
#include <INTRINS.H>
#include "time_module.C"
#include "sja_bcanFunc.C"
#include "seriele.c"
#include "keyled.c"
//數(shù)據(jù)類型定義
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
//設(shè)置系統(tǒng)數(shù)據(jù)緩沖區(qū)
static uchar data SetSystemBuf[10]; //系統(tǒng)設(shè)置數(shù)據(jù)緩沖區(qū)
static uchar data BandRateBuf; //設(shè)置總線波特率值緩沖區(qū)
static uchar idata EditMsSendCount; //編輯自動發(fā)送的頻率
static uchar idata EditMsSendSave; //保存自動發(fā)送的頻率
static uchar idata SendDataCount; //發(fā)送數(shù)據(jù)顯示
static uchar idata SendFrq; //自動發(fā)送的頻率
bit AutoSendFlag;
static bit MoveFlag=0; //移位計數(shù)
unsigned int AutoSendFrameID;
unsigned int TestSendData;
//鍵盤操作函數(shù)
extern void Write_Xdata(unsigned char value); // 將info送入外部地址xadr中
extern uchar Read_Xdata(uint Xadr); //從外部地址xadr中讀取數(shù)據(jù)
extern void Key_Scan(void); //鍵盤掃描程序
extern uchar Key_Get(void); //取鍵盤值
extern void PushKey(uchar keynum); //將鍵值送入按鍵處理隊列
extern uchar PopKey(void); //
void Key_handle(void); //處理鍵值
void FundationKey(void); //功能鍵
void MoveKey(void); //移位鍵
void SearchKey(void); //檢索鍵
void EnterKey(void); //確認(rèn)鍵
void IncKey(void); //增加鍵
void QuitKey(void); //退出鍵
void CanSendKey(void); //發(fā)送鍵
void EnterNext(void); //按確認(rèn)鍵后進入下一小項處理
//led 送顯
#define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位選
extern void Show_LED(void); //顯示處理
extern void Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//寫入顯示緩沖區(qū)
extern uchar GetLedData(void); //將顯示的值換算
extern void Error_disp(uchar ErrByte); //將錯誤字送顯
void InitCPU(void); //初始化函數(shù)
// 配置sja1000
uchar Config_SJA(void); //配置sja1000
void CanRcv_Prg(void); //can總線數(shù)據(jù)接收后處理
void CanSend_Prg(void); //can發(fā)送數(shù)據(jù)
void CanErr_Prg(void); //發(fā)現(xiàn)錯誤后處理
void CanDtOver_Prg(void); //超載處理
void CanWui_Prg(void); //喚醒中斷處理
void UartRcv_Prg(void); //串口接收到數(shù)據(jù)處理
void DrecDisplay(uchar *databuf); //直通顯示處理函數(shù)
void TestDispPrg(void); //測試處理函數(shù)
void ClearDispPrg(uchar *databuf); //消隱處理函數(shù)
void FlightDispPrg(uchar *databuf); //閃爍處理函數(shù)
void LiftCrcDispPrg(uchar *databuf); //左循環(huán)顯示處理
void RightCrcDispPrg(uchar *databuf); //右循環(huán)顯示處理
void AutoSendDataToCanBus(void); //自動發(fā)送
//提取波特率的對應(yīng)值
unsigned char ValueToBandRate(void);
// 外部中斷0
static uchar bdata CanBusFlag=0; //can標(biāo)志
sbit CanRcv_Good=CanBusFlag^0; //成功接收標(biāo)志
sbit CanSend_Good=CanBusFlag^1; //成功發(fā)送標(biāo)志
sbit CanErrFlag=CanBusFlag^2; //can總線錯誤標(biāo)志
sbit CanDtOverFlag=CanBusFlag^3; //can總線超載標(biāo)志
sbit CanWuiFlag=CanBusFlag^4; //can總線喚醒中斷
/*-------------------------------------------------------------------------------------------
外部中斷0處理程序
-------------------------------------------------------------------------------------------*/
void ex0_Val(void) interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT;
CanBusFlag=*SJA_BCANAdr; //保存sja1000中斷標(biāo)志
}
/*-------------------------------------------------------------------------------------------
main程序
-------------------------------------------------------------------------------------------*/
void main(void)
{
uchar status; //狀態(tài)字
uchar i;
Delay_50us(100) ; //50us*100=5ms
status=Config_SJA(); //配置sja1000
InitCPU(); //初始化
if(status!=0) Error_disp(status); //配置sja1000出現(xiàn)錯誤
else
{ Disp_Can(); //無措顯示CAN1
Exe_Scon(0xaa,0,0);
}
Write_Xdata(0x00);
//設(shè)置并行方式
TimeOut_Start(20); //20*50us=1ms,定時周期1ms
while(1)
{
if(_testbit_(T0IR)) //ms時間到
{
i++;
LED_SelBit(); //位選
Key_Scan();
Show_LED();
if(i>=SendFrq)
{
i=0;
AutoSendDataToCanBus();
}
TimeOut_Start(20); //20*50us=1ms,定時周期1ms
}
// CanBusFlag=Read_Xdata(REG_INTERRUPT);
if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中斷標(biāo)志
if(_testbit_(CanSend_Good)) CanSend_Prg(); //是發(fā)送中斷標(biāo)志
if(_testbit_(CanErrFlag)) CanErr_Prg(); //是錯誤中斷標(biāo)志
if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超載中斷標(biāo)志
if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是喚醒中斷標(biāo)志
if(_testbit_(UartRcvGood)) UartRcv_Prg(); //串口接收成功標(biāo)志
Key_handle(); //鍵盤隊列處理
}
}
/*-------------------------------------------------------------------------------------------
按鍵隊列處理程序
-------------------------------------------------------------------------------------------*/
void Key_handle(void)
{
uchar TempData;
TempData=PopKey();
switch(TempData)
{
case Key0:
SearchKey();
break;
case Key1:
IncKey();
break;
case Key2:
break;
case Key3:
QuitKey();
break;
case Key4:
FundationKey();
break;
case Key5:
MoveKey();
break;
case Key6:
EnterKey();
break;
case Key7:
CanSendKey();
break;
default:
break;
}
}
//功能鍵處理
bit FunckeyFlag=0; //進入功能標(biāo)志
static uchar data FunckeyCount; //功能選項計數(shù)
void FundationKey(void)
{
uchar i;
ClearDispAttr();
MoveFlag=0;
AutoSendFlag =0;
if(FunckeyFlag)
{
if(++FunckeyCount>3)FunckeyCount=0;
switch(FunckeyCount)
{
case 0:
FunckeyFlag=0;
Disp_Can(); //上電顯示CAN1
DispFlag=0x00;
break;
case 1:
if((ReadSjaReg(REG_CONTROL)&0x01)==0)
{
Write_DispBuf(0,0x0b,0x01,0,0); //進入b功能
FlightLed3=1; //led3閃爍
FlightLed4=0;ClearLed4=0;
}
else
{
Write_DispBuf(0,0x0b,0x12,0x12,0x12); //進入b功能
}
break;
case 2:
Write_DispBuf(0,0x0c,0x01,0,0); //進入c功能
FlightLed3=1; //led3閃爍
FlightLed4=0;ClearLed4=0;
break;
case 3:
Write_DispBuf(0,0x05,0x0d,0,0); //進入自動發(fā)送功能
FlightLed3=1; //led3閃爍
FlightLed4=0;ClearLed4=0;
break;
default:
AutoSendFlag=0;
break;
}
}
else
{
FunckeyFlag=1;
BCAN_ENTER_RETMODEL();
i = ReadSjaReg(REG_ACR);
Write_DispBuf(0,0x0a,0x01,i>>4,i&0x0f); //a1功能
BCAN_QUIT_RETMODEL();
FlightLed3=1; //led3閃爍
FlightLed4=0;ClearLed4=0;
}
}
//檢索鍵處理
static uchar data SearchCount; //檢索計數(shù)器
void SearchKey(void) //檢索鍵
{
uchar i;
if(FunckeyFlag)
{
switch(DispBuf[1])
{
case 0x0a:
SearchCount=DispBuf[2]; //檢索a功能項
if(++SearchCount>3)SearchCount=1;
DispBuf[2]=SearchCount;
switch(SearchCount)
{
case 1:
BCAN_ENTER_RETMODEL();
i = ReadSjaReg(REG_ACR);
Write_DispBuf(0,0x0a,0x01,i>>4,i&0x0f); //a1功能
BCAN_QUIT_RETMODEL();
break;
case 2:
BCAN_ENTER_RETMODEL();
i = ReadSjaReg(REG_AMR);
Write_DispBuf(0,0x0a,0x02,i>>4,i&0x0f); //a2功能
BCAN_QUIT_RETMODEL();
break;
case 3:
i = ValueToBandRate();
Write_DispBuf(0,0x0a,0x03,i>>4,i&0x0f); //a3功能
break;
default:
SearchCount =1;
break;
}
break;
case 0x0b: //檢索b功能項
if((ReadSjaReg(REG_CONTROL)&0x01)==0)
{
SearchCount=DispBuf[2];
if(++SearchCount>10)SearchCount=1;
DispBuf[2]=SearchCount;
switch(SearchCount)
{
case 1:
i = ReadSjaReg(REG_TxBuffer1);
break;
case 2:
i = ReadSjaReg(REG_TxBuffer2);
break;
case 3:
i = ReadSjaReg(REG_TxBuffer3);
break;
case 4:
i = ReadSjaReg(REG_TxBuffer4);
break;
case 5:
i = ReadSjaReg(REG_TxBuffer5);
break;
case 6:
i = ReadSjaReg(REG_TxBuffer6);
break;
case 7:
i = ReadSjaReg(REG_TxBuffer7);
break;
case 8:
i = ReadSjaReg(REG_TxBuffer8);
break;
case 9:
i = ReadSjaReg(REG_TxBuffer9);
break;
case 10:
i = ReadSjaReg(REG_TxBuffer10);
break;
default:
i=0;
break;
}
Write_DispBuf(0,0x0b,SearchCount,i>>4,i&0x0f); //b功能
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -