?? main.c
字號:
/************************************************************************
* 廣州周立功單片機發展有限公司 http://www.zlgmcu.com *
************************************************************************/
/************************************************************************
* *
* SJA1000 BasicCAN模式的通訊測試 *
* *
************************************************************************/
/************************************************************************
* *
* 目的: 建立直觀的BasicCAN測試平臺 *
* 文件名: main.c *
* *
* 模塊名: sjanetdemo *
* *
* 目標系統: 任何基于任何兼容8051指令的微處理器同SJA1000組成的CAN系統*
* *
* 應用語言: Keil C51 *
* *
************************************************************************
* 版本 :V1.0 *
* *
************************************************************************
* 廣州周立功單片機發展有限公司 保留所有的版權 *
************************************************************************/
#include <AT89X51.H>
#include <intrins.h>
#include "time_module.C"
#include "sja_bcanFunc.C"
//#include "sja_peliConf.h"
#include "seriele.c"
#include "keyled.c"
//數據類型定義
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
//設置系統數據緩沖區
static uchar data SetSystemBuf[10]; //系統設置數據緩沖區
static uchar data BandRateBuf; //設置總線波特率值緩沖區
static uchar idata EditMsSendCount; //編輯自動發送的頻率
static uchar idata EditMsSendSave; //保存自動發送的頻率
static uchar idata SendDataCount; //發送數據顯示
//鍵盤操作函數
extern void Write_Xdata(uint Xadr,uchar Info); // 將info送入外部地址xadr中
extern uchar Read_Xdata(uint Xadr); //從外部地址xadr中讀取數據
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); //確認鍵
void IncKey(void); //增加鍵
void QuitKey(void); //退出鍵
void CanSendKey(void); //發送鍵
void EnterNext(void); //按確認鍵后進入下一小項處理
//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);//寫入顯示緩沖區
extern uchar GetLedData(void); //將顯示的值換算
extern void Error_disp(uchar ErrByte); //將錯誤字送顯
void InitCPU(void); //初始化函數
// 配置sja1000
uchar Config_SJA(void); //配置sja1000
void CanRcv_Prg(void); //can總線數據接收后處理
void CanSend_Prg(void); //can發送數據
void CanErr_Prg(void); //發現錯誤后處理
void CanDtOver_Prg(void); //超載處理
void CanWui_Prg(void); //喚醒中斷處理
void UartRcv_Prg(void); //串口接收到數據處理
void DrecDisplay(uchar *databuf); //直通顯示處理函數
void TestDispPrg(void); //測試處理函數
void ClearDispPrg(uchar *databuf); //消隱處理函數
void FlightDispPrg(uchar *databuf); //閃爍處理函數
void LiftCrcDispPrg(uchar *databuf); //左循環顯示處理
void RightCrcDispPrg(uchar *databuf); //右循環顯示處理
void AutoSendDataToCanBus(void); //自動發送
// 外部中斷0
static uchar bdata CanBusFlag=0; //can標志
sbit CanRcv_Good=CanBusFlag^0; //成功接收標志
sbit CanSend_Good=CanBusFlag^1; //成功發送標志
sbit CanErrFlag=CanBusFlag^2; //can總線錯誤標志
sbit CanDtOverFlag=CanBusFlag^3; //can總線超載標志
sbit CanWuiFlag=CanBusFlag^4; //can總線喚醒中斷
/*-------------------------------------------------------------------------------------------
外部中斷0處理程序
-------------------------------------------------------------------------------------------*/
void ex0_Val(void) interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT;
CanBusFlag=*SJA_BCANAdr; //保存sja1000中斷標志
}
/*-------------------------------------------------------------------------------------------
main程序
-------------------------------------------------------------------------------------------*/
void main(void)
{
uchar status; //狀態字
Delay_50us(100) ; //50us*100=5ms
status=Config_SJA(); //配置sja1000
InitCPU(); //初始化
if(status!=0) Error_disp(status); //配置sja1000出現錯誤
else
{ Disp_Can(); //無措顯示CAN1
Exe_Scon(0xaa,0,0);
}
Write_Xdata(Mode_Select,0x00);
//設置并行方式
TimeOut_Start(20); //20*50us=1ms,定時周期1ms
while(1)
{
if(_testbit_(T0IR)) //1ms時間到
{
LED_SelBit(); //位選
Key_Scan();
Show_LED();
AutoSendDataToCanBus();
TimeOut_Start(20); //20*50us=1ms,定時周期1ms
}
// CanBusFlag=Read_Xdata(REG_INTERRUPT);
if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中斷標志
if(_testbit_(CanSend_Good)) CanSend_Prg(); //是發送中斷標志
if(_testbit_(CanErrFlag)) CanErr_Prg(); //是錯誤中斷標志
if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超載中斷標志
if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是喚醒中斷標志
if(_testbit_(UartRcvGood)) UartRcv_Prg(); //串口接收成功標志
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; //進入功能標志
static uchar data FunckeyCount; //功能選項計數
void FundationKey(void)
{
ClearDispAttr();
if(FunckeyFlag)
{
if(++FunckeyCount>3)FunckeyCount=0;
switch(FunckeyCount)
{
case 0:
FunckeyFlag=0;
Disp_Can(); //上電顯示CAN1
DispFlag=0x00;
break;
case 1:
Write_DispBuf(0,0x0b,0x01,0,0); //進入b功能
FlightLed3=1; //led3閃爍
break;
case 2:
Write_DispBuf(0,0x0c,0x01,0,0); //進入c功能
FlightLed3=1; //led3閃爍
break;
case 3:
Write_DispBuf(0,0x05,0x0d,0,0);
break;
default:
break;
}
}
else
{
FunckeyFlag=1;
Write_DispBuf(0,0x0a,0x01,0,0); //a1功能
FlightLed3=1; //led3閃爍
}
}
//檢索鍵處理
static uchar data SearchCount; //檢索計數器
void SearchKey(void) //檢索鍵
{
if(FunckeyFlag)
{
switch(DispBuf[1])
{
case 0x0a:
SearchCount=DispBuf[2]; //檢索a功能項
if(++SearchCount>3)SearchCount=1;
DispBuf[2]=SearchCount;
break;
case 0x0b: //檢索b功能項
SearchCount=DispBuf[2];
if(++SearchCount>10)SearchCount=1;
DispBuf[2]=SearchCount;
break;
case 0x0c:
default:
break;
}
}//if結束
}
//移位鍵處理
static bit MoveFlag=0; //移位計數
void MoveKey(void) //移位鍵
{
if(FunckeyFlag)
{
MoveFlag=~ MoveFlag; //移位
if(MoveFlag)
{FlightLed3=0;ClearLed3=0;
FlightLed4=1;
}
else
{
FlightLed3=1;
FlightLed4=0;ClearLed4=0;
}
}
}
//增加鍵處理
void IncKey(void) //增加鍵
{
if(FunckeyFlag)
{
if(MoveFlag)
{
if(++DispBuf[4]>0x0f)DispBuf[4]=0;
}
else
if(++DispBuf[3]>0x0f)DispBuf[3]=0;
}
}
//退出鍵處理
void QuitKey(void) //退出鍵
{
if(FunckeyFlag)
{
FunckeyFlag=0;
Disp_Can(); //上電顯示CAN1
DispFlag=0x00;
}
}
//確認鍵處理
void EnterKey(void) //確認鍵
{
uchar Tempdata;
if(FunckeyFlag)
{
Tempdata=GetLedData();
if(DispBuf[1]==0x0a)
{
switch(DispBuf[2])
{
case 0x01:
SetSystemBuf[0]=Tempdata;
EnterNext();
break;
case 0x02:
SetSystemBuf[1]=Tempdata;
if(!BCAN_ENTER_RETMODEL())
{
BCAN_SET_OBJECT(SetSystemBuf[0],SetSystemBuf[1]);
BCAN_QUIT_RETMODEL();
}
else Error_disp(CAN_ENTRESET_ERR );
EnterNext();
break;
case 0x03:
BandRateBuf=Tempdata;
if(Tempdata>12) Error_disp(NO_BANDRATE_SIZE);
else{
if(!BCAN_ENTER_RETMODEL())
{
BCAN_SET_BANDRATE(Tempdata);
BCAN_QUIT_RETMODEL();
}
DispBuf[2]=1;
DispBuf[3]=0;DispBuf[4]=0;
FlightLed3=1;
FlightLed4=0;ClearLed4=0;
}
break;
default:
break;
}
}
if(DispBuf[1]==0x0b)
{
if(0<DispBuf[2])
{
SetSystemBuf[DispBuf[2]-1]=Tempdata;
if(DispBuf[2]==0x0a)
{
DispBuf[2]=1;
DispBuf[3]=0;DispBuf[4]=0;
FlightLed3=1;
FlightLed4=0;ClearLed4=0;
}
else EnterNext();
}
}
if(DispBuf[1]==0x0c)
{
switch(DispBuf[2])
{
case 1:
EditMsSendCount =Tempdata;
EditMsSendSave =Tempdata;
DispBuf[1]=0x05;
DispBuf[2]=0x0d;
FunckeyCount++;
ClearDispAttr();
MoveFlag=0;
break;
default:
break;
}
}
}
}
//按確認鍵后進入下一小項處理
void EnterNext(void) //按確認鍵后進入下一小項處理
{
DispBuf[3]=0;DispBuf[4]=0;
FlightLed3=1;
FlightLed4=0;ClearLed4=0;
MoveFlag=0;
DispBuf[2]++;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -