?? fasong.c
字號:
//#pragma src
#include <REGX52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
/*---------------------*/
//#include <nrf905.h>
//#include "hotins.h"
/*---------------------*/
#pragma NOAREGS
void MainInit(void);//系統初始化
void SystemInit(void);//系統初始化
void SystemSetup(void);//系統設置
void SystemIoInit(void);//系統接口初始化
void TimeInit(void);//定時器定時參數設置
void UserSetup(void);//用戶運行環境設置
void ClrWdt(void);//喂狗
void BeepSetup(unsigned char mode);//蜂鳴器發聲模式設置
void Beep(void);//蜂鳴器發聲驅動
void KeyInit(void);//鍵盤初始化
void KeyCommandExec(unsigned char commgroup, unsigned char commnum);//執行鍵盤命令
void Key00(void);//壓鍵事件
void Key01(void);
void Key02(void);
void Key03(void);
void Key10(void);//放鍵事件
void Key11(void);
void Key12(void);
void Key13(void);
void Key20(void);//長鍵事件
void Key21(void);
void Key22(void);
void Key23(void);
/*-----------------------------------------------
nrf905庫函數定義
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char);
void WriteTXBuffer(const unsigned char[]);
unsigned char ReadStatus(void);
void nRFPowerUP(void);
void nRFInit(void);//無線模塊初始化
unsigned char VerifynRFConfig(void);//校驗配置nRF905
void WritenRFConfig(unsigned char[]);//寫配置nRF905
void ReadnRFConfig(unsigned char[]);//讀配置nRF905
void FastWritenRFConfig(unsigned char);//快速配置nRF905
void SetTxMode(void);//設置發送模式
void SetRxMode(void);//設置接收模式
void StartTx(void);//開始發送
void nRFReadWrite(void);//無線收發模塊
//data SystemData SystemBuffers;//申請系統數據結構
//idata SioData SioBuffers;//申請系統數據結構
/*------------------------------------------------
SPI讀寫一體化函數SpiReadWrite()
入口參數:
val 寫入命令或數據
出口參數:
R7 讀出數據
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char val) using 0
{
unsigned char i;
ACC = val;
for (i = 8; i > 0; i --)
{
CY = MISO;//取數據SO
_rlca_();//存數據ACC.0讀數據ACC.7同時進行,acc循環左移,acc.7移入cy(出),cy(入)移到acc.0
MOSI = CY;//送數據SI
SCK = 1;//上升沿打入數據
_nop_();
SCK = 0;//下降沿讀入數據(首次為假動作)
}
return ACC;
}
/*------------------------------------------------
寫入nRF905發送數據函數WriteTXBuffer()
入口參數:
buffer 發送數據包
出口參數:
無
------------------------------------------------*/
void WriteTXBuffer(const unsigned char buffer[]) using 0
{
unsigned char i;
TRX_CE = 0;//設置nRF905為待機方式
_nop_();
CSN=0;//打開SPI
SpiReadWrite(WTA);//寫發送地址
for (i = 0; i < 4; i++)
{
SpiReadWrite(buffer[i]); // Write 32 bytes Tx data
}
CSN=1;//關閉SPI
_nop_();
CSN=0;// Spi enable for write a spi command
SpiReadWrite(WTP); // Write payload command
for (i = 0; i < 32; i++)
{
SpiReadWrite(buffer[i]); // Write 32 bytes Tx data
}
CSN=1;// Spi disable
TRX_CE = !TX_EN;//
}
void FastWritenRFConfig(unsigned char low_ch_no) using 0
{
TRX_CE = 0;//設置nRF905為待機方式
_nop_();
CSN=0;//打開SPI
SpiReadWrite(CC PA_PWR_10dBm HFREQ_PLL_433MHz CH_NO_BIT8);
SpiReadWrite(low_ch_no);//CH_NO
CSN=1;// Spi disable
TRX_CE = !TX_EN;//
}
void StartTx(void) using 0
{
_nop_();
_nop_();
_nop_();
TRX_CE=1; // Set TRX_CE high,start Tx data transmission
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRX_CE=0; // Set TRX_CE low
}
/*------------------------------------------------
讀入nRF905狀態函數ReadStatus()
入口參數:
無
出口參數:
nRF905狀態字
------------------------------------------------*/
unsigned char ReadStatus(void) using 0
{
unsigned char val;
CSN = 0;//打開SPI
val = SpiReadWrite(RC);//讀狀態
CSN = 1;//關閉SPI
return val;//返回nRF905狀態字
}
void nRFPowerUP(void) using 0
{
CSN = 1;//關閉SPI
SCK = 0;//拉低時鐘
DR = 1;//設置DR為輸入方式
AM = 1;//設置AM為輸入方式
PWR_UP = 1;// nRF905上電
TRX_CE = 0;//設置nRF905為待機方式
TX_EN = 0;//設置接收方式
}
void main(void)
{
// ReadnRFConfig(SystemBuffers.nRFTxBuff);
MainInit();//系統初始化
while (1) {//主循環
IE = 0xb2;//保證中斷可靠EA,ET2,ES,ET0
TCON = 0x55;//保證定時器開
PCON = SMOD_ + GF0_ + IDL_;//進入空閑狀態并喂軟件狗
_nop_();
_nop_();
}
}
void MainInit(void) using 0//系統初始化
{
_start_();
ClrWdt();//清除看門狗計數器
SystemIoInit();//系統接口初始化
SystemInit();//系統上電初始化
SystemSetup();//系統運行環境設置
UserSetup();//用戶運行環境設置
}
void SystemInit(void) using 0//系統初始化
{
unsigned char i;
for (i = 0; i < 32; i ++) {
SioBuffers.SioTxBuff[i] = 0;
SioBuffers.SioRxBuff[i] = 0;
}
if (SystemBuffers.RamTest != 0x55aa) {//內存初始化
for (i = 0; i < 32; i ++) {
SystemBuffers.nRFTxBuff[i] = 0;
SystemBuffers.nRFRxBuff[i] = 0;
}
SystemBuffers.nRFRxBuff[0] = RX_ADDRESS_0;//本機地址
SystemBuffers.nRFRxBuff[1] = RX_ADDRESS_1;
SystemBuffers.nRFRxBuff[2] = RX_ADDRESS_2;
SystemBuffers.nRFRxBuff[3] = RX_ADDRESS_3;
SystemBuffers.nRFRxBuff[8] = CH_NO_BYTE;
SystemBuffers.nRFTxBuff[8] = CH_NO_BYTE;
SystemBuffers.RamTest = 0x55aa;
}
else {
}
}
void SystemSetup(void) using 0//系統設置
{
TimeInit();
IP = 0x05;//中斷優先級EX0>EX1>ET0>ET1
SystemBuffers.TestTime = 0;
SystemBuffers.WaitTime = 0;
}
void TimeInit() using 0
{
// TCON = 0x55;//啟動定時器
/*----------------------------------
定時器0定時參數設置
----------------------------------*/
TL0 = 0;
TH0 = 0;
TR0 = 1;//啟動定時器0
/*----------------------------------
定時器1定時參數設置
----------------------------------*/
TMOD = 0x20; //timer1 working mode 1
TL1 = 0xfd; //f7=9600 for 16mhz Fosc,and ...
TH1 = 0xfd; //...fd=19200 for 11.0592mhz Fosc
SCON = 0xd8; //uart mode 3,ren==1
PCON = 0x80;
SioBuffers.SioTXCount = 0;//無發送數據
SioBuffers.SioRXCount = 32;//允許接收串口數據
TR1 = 1;//啟動定時器1
/*----------------------------------
定時器2定時參數設置
----------------------------------*/
TIMEER2 = T2_5mS;
RCAP = T2_5mS;
TR2 = 1;//啟動定時器2
}
void nRFInit(void) using 0//無線模塊初始化
{
do{
WritenRFConfig(SystemBuffers.nRFRxBuff);//配置nRF905
}
while(VerifynRFConfig());
SetRxMode();//設置接收模式
SystemBuffers.nRFTxCount = 0;//清空無線發送數據緩沖區
SystemBuffers.nRFRxCount = 0;//清空無線接收數據緩沖區
}
void ReadnRFConfig(unsigned char rxaddr[]) using 0//讀配置nRF905
{
unsigned char i;
TRX_CE = 0;//設置nRF905為待機方式
_nop_();
CSN = 0;// Spi enable for write a spi command
SpiReadWrite(RC); // Read config command
for (i = 10; i < 20; i ++) rxaddr[i] = SpiReadWrite(0xff);
CSN = 1;// Disable Spi
TRX_CE = !TX_EN;//
}
void WritenRFConfig(unsigned char rxaddr[]) using 0//配置nRF905
{
TRX_CE = 0;//設置nRF905為待機方式
_nop_();
CSN = 0;// Spi enable for write a spi command
SpiReadWrite(WC); // Write config command
SpiReadWrite(rxaddr[8]); //中心頻率低8位
SpiReadWrite(PA_PWR_10dBm HFREQ_PLL_433MHz); //發射+10dBm,發射頻率433MHz,中心頻率第9位=0
SpiReadWrite(TX_AFW_4BYTE RX_AFW_4BYTE); //接收地址寬度4字節,發送地址寬度4字節
SpiReadWrite(RX_PW_32BYTE); //接收數據寬度32字節
SpiReadWrite(TX_PW_32BYTE); //發送數據寬度32字節
SpiReadWrite(rxaddr[0]); //接收有效地址第1字節
SpiReadWrite(rxaddr[1]); //接收有效地址第2字節
SpiReadWrite(rxaddr[2]); //接收有效地址第3字節
SpiReadWrite(rxaddr[3]); //接收有效地址第4字節
SpiReadWrite(CRC16_EN XOF_16MHz); //CRC16模式使能,晶體振蕩器頻率16MHz
CSN = 1;// Disable Spi
TRX_CE = !TX_EN;//
}
unsigned char VerifynRFConfig(void) using 0//校驗配置nRF905
{
unsigned char error = 0;
TRX_CE = 0;//設置nRF905為待機方式
_nop_();
CSN = 0;// Spi enable for write a spi command
SpiReadWrite(RC); // Read config command
SpiReadWrite(0xff); //中心頻率低8位
if (SpiReadWrite(0xff) != (PA_PWR_10dBm HFREQ_PLL_433MHz)) error ++; //發射+10dBm,發射頻率433MHz,中心頻率第9位=0
if (SpiReadWrite(0xff) != (TX_AFW_4BYTE RX_AFW_4BYTE)) error ++; //接收地址寬度4字節,發送地址寬度4字節
if (SpiReadWrite(0xff) != (RX_PW_32BYTE)) error ++; //接收數據寬度32字節
if (SpiReadWrite(0xff) != (TX_PW_32BYTE)) error ++; //發送數據寬度32字節
SpiReadWrite(0xff); //接收有效地址第1字節
SpiReadWrite(0xff); //接收有效地址第2字節
SpiReadWrite(0xff); //接收有效地址第3字節
SpiReadWrite(0xff); //接收有效地址第4字節
if (SpiReadWrite(0xff) != (CRC16_EN XOF_16MHz)) error ++; //CRC16模式使能,晶體振蕩器頻率16MHz
CSN = 1;// Disable Spi
TRX_CE = !TX_EN;//
return error;
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void) using 0
{
_nop_();
_nop_();
_nop_();
TX_EN=1;
_nop_();
TRX_CE=0;
_nop_();
_nop_();
_nop_();
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void) using 0
{
_nop_();
_nop_();
_nop_();
TX_EN=0;
_nop_();
TRX_CE=1;
//650uS
_nop_();
_nop_();
_nop_();
}
void SystemIoInit(void) using 0
{
IE = 0x00;//關閉中斷
P2 = 0x9d;//P2口初始化
P0 = 0xff;//P0口初始化
P1 = 0xff;//P1口初始化
P3 = 0xff;//P3口初始化
// nRFPowerUP();
}
void UserSetup(void) using 0//用戶運行環境設置
{
KeyInit();//鍵盤初始化
nRFInit();//無線模塊初始化
SystemBuffers.TimeCount = 0;
}
void ClrWdt(void) using 0//喂狗
{
WDTRST = 0x1e;//89s52內狗
WDTRST = 0xe1;//89s52內狗
}
/*------------------------------------
定時器T0中斷服務程序
------------------------------------*/
void t0proc() interrupt TF0_VECTOR using 1
{
}
/*------------------------------------
定時器T1中斷服務程序
------------------------------------*/
void t1proc() interrupt TF1_VECTOR using 1
{
}
/*------------------------------------
定時器T2中斷服務程序(5mS)
------------------------------------*/
void t2proc() interrupt TF2_VECTOR using 0
{
unsigned char key;
code unsigned char KeyPosTab[] = {0x01, 0x02, 0x04, 0x08};
TF2 = 0;
if (PCON & GF0_) {//中斷是從主循環內跳入的才能喂狗
ClrWdt();//清除看門狗計數器
PCON &= ~GF0_;//清除標志
}
key = ~P0;//接收鍵盤數據每次可取多鍵)
if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有鍵壓下(每次只取1鍵以實現“零耗時消除鍵盤抖動”)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -