📄 rf905-jieshou.c
字号:
TRX_CE_0;
CSN_0; // SPI使能(Spi enable for write a spi command)
Delay(1);
SpiWrite(RRP); // 读SPI数据命令(Read payload command)
for (i = 0 ;i < 32 ;i++)
{
TxRxBuf[i]=SpiRead(); // Read data and save to buffer
}
CSN_1;
Delay(10);
TRX_CE_1;
}
//==========================NRF905数据接收流程================================
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while (CheckDR()==0);
Delay(10);
RxPacket(); // Recive data by nRF905
Delay(10);
}
//======================?????==============================================
void init_uart0(void)
{
//====================串口工作模式设置========================================
U0CTL=0x00; // U0CTL包含串口0通信协议、通信模式、校验位等设置,允许UART0
U0CTL +=CHAR; //(CHAR=0x10)当CHAR=0时位7位数据,当 CHAR=1时为8位数据
//不需要校验,数据位为8位,无反馈,异步UART通信,UART被允许
//====================串口发送操作设置========================================
U0TCTL=0x00; //U0TCTL包含串口0发送功能操作
U0TCTL +=SSEL0; //波特率发生器选择ACLK
//#define SSEL1 (0x20) #define SSEL0 (0x10)
//====================串口拨特率设置9600====================================
//===================拨特率计算公式:拨特率=BRCLK/(UBR+(M7+M6+。。。。+M0)/8)
UBR0_0=0x03; //UBR0_0为串口0波特率整数部分低地址
UBR1_0=0x00; //UBR1_0为串口0波特率整数部分高地址
UMCTL_0=0x4A; //UBR1_0为串口0波特率小数部分高地址
//===================串口收发使能控制=========================================
ME1 |= UTXE0; //串口0发送功能使能
ME1 |= URXE0; //串口0接收功能使能
//===================串口中断使能控制=========================================
IE1 |= URXIE0; //串口0接收中断使能
// IE1 |= UTXIE0; //串口0发送中断使能
//===================端口第二功能使能=========================================
P3SEL |=BIT4; //设置P3。4为UART0 的TXD
P3SEL |=BIT5; //设置P3。5为UART0 的RXD
P3DIR |=BIT4; //设置P3。4为输出
}
//==============================================================================
void R_S_Byte(char R_Byte)
{
while((IFG1&UTXIFG0)==0); //????????
TXBUF0=R_Byte;
}
//========================延时约5ms=============================================
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
//========================等待1602液晶完成内部操作==============================
void WaitForEnable(void)
{
P4DIR &= 0x00; //将P4口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR |= 0xFF; //将P4口切换为输出状态
}
//==========================向液晶模块写入命令==================================
//=================cmd--命令,chk--是否判忙的标志,1:判忙,0:不判=============
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
//=====================向液晶显示的当前地址写入显示数据=========================
void LcdWriteData( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
//==================向液晶输入显示字符位置的坐标信息============================
void LocateXY(uchar x,uchar y)
{
uchar temp;
x&= 0x01;
temp = y&0x0f;
if(x) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,0);
}
//==========================在某个位置显示一个字符==============================
//============x--位置的列坐标 y--位置的行坐标data--显示的字符数据=============
void DisoneChar(uchar x,uchar y,uchar data)
{
LocateXY( x, y );
LcdWriteData( data );
}
//==============================让液晶从某个位置起连续显示一个字符==============
//==============================y--位置的列坐标 x--位置的行坐标================
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
DisoneChar(x++,y,temp[i]);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
//让液晶从某个位置起连续显示N个字符
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
{
uchar i;
for (i=0;i<n;i++)
{
DisoneChar(x++,y,ptr[i]);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
//========================对1602液晶模块进行复位操作============================
void LcdReset(void)
{
LcdWriteCommand(0x38, 0); //规定的复位操作
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
}
//==================================NEWMSG-JASK3000=============================
void NewmsgJASK3000()
{
DisoneChar(0,1,0x4e) ;
DisoneChar(0,2,0x45) ;
DisoneChar(0,3,0x57) ;
DisoneChar(0,4,0x4d) ;
DisoneChar(0,5,0x53) ;
DisoneChar(0,6,0x47) ;
DisoneChar(0,7,0x2d) ;
DisoneChar(0,8,0x2d) ;
DisoneChar(0,9,0x4a) ;
DisoneChar(0,10,0x41) ;
DisoneChar(0,11,0x53) ;
DisoneChar(0,12,0x4b) ;
DisoneChar(0,13,0x33) ;
DisoneChar(0,14,0x30) ;
DisoneChar(0,15,0x30) ;
DisoneChar(0,16,0x30) ;
Delay5ms();
DisoneChar(1,5,0x3c) ;
DisoneChar(1,6,0x55) ;
DisoneChar(1,7,0x73) ;
DisoneChar(1,8,0x69) ;
DisoneChar(1,9,0x6e) ;
DisoneChar(1,10,0x67) ;
DisoneChar(1,11,0x3e) ;
}
//==================================主函数=====================================
void main(void)
{
char i;
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
InitSys();
nRF905_IO_set();
LED_IO_set();
LCD_IO_set(); //LCD端口设置
init_uart0(); //串口初始化
Config905(); // NRF905初始化
LcdReset(); //LCD初始化
NewmsgJASK3000();
LED1_1;LED2_1;
while(1)
{
RX();
if((TxRxBuf[0]==0x01)&&(TxRxBuf[31]==0x32))//校验
{
LED1_0;
for(i=0;i<32;i++)
{
R_S_Byte(TxRxBuf[i]);
Delay(100);
}
LED1_1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -