📄 wendu-jieshou.c
字号:
CSN_1;
NRF905_Delay(10);
TRX_CE_1;
}
//=========DR检测,当 收到数据后DR置1,当把数据读出来后DR清0=====================
unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready
{
if ((P2IN&0x40))
{
return 1;
}
else
{
return 0;
}
}
//=============================接收模式=========================================
void SetRxMode(void)
{
TXEN_0;
TRX_CE_1;
NRF905_Delay(1); // delay for mode change(>=650us)
}
//==========================NRF905数据接收流程================================
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while (CheckDR()==0);
NRF905_Delay(10);
RxPacket(); // Recive data by nRF905
NRF905_Delay(10);
}
//========================延时约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) ; // now : XX.X 度
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) ;
}
//====================================温度 显示 ================================
void wd_xianshi()
{
DisoneChar(1,3,0x4e) ; // now : XX.X 度
DisoneChar(1,4,0x4f) ;
DisoneChar(1,5,0x57) ;
DisoneChar(1,6,0x20) ;
DisoneChar(1,8,seg[TxRxBuf[2]]) ;
DisoneChar(1,9,seg[TxRxBuf[1]]) ;
DisoneChar(1,10,0x2e) ;
DisoneChar(1,11,seg[TxRxBuf[0]]) ;
DisoneChar(1,12,0xdf) ;
DisoneChar(1,13,0x43) ;
}
//=================================主函数======================================
void main(void)
{
char i;
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
InitSys(); // 时钟初始化
nRF905_IO_set(); // NRF905端口设置
LED_IO_set(); //LED端口设置
BELL_IO_set();
LCD_IO_set(); //LCD端口设置
Config905(); //NRF905寄存器配置
init_uart0(); //串口0初始化
LcdReset(); //LCD初始化
NewmsgJASK3000();
LED1_0;LED2_0;BELL_1 ;
while(1)
{
RX(); //接收数据
if(TxRxBuf[0]) //软件检验一下
{
LED1_1;
temp[0]=TxRxBuf[3]; //符号位
temp[2]=((TxRxBuf[2]<<4)|TxRxBuf[1]); //整数位
temp[1]=TxRxBuf[0]; //小数位
temp[4]=TxRxBuf[2]; //十位
temp[5]=TxRxBuf[1]; //个位
for(i=0;i<3;i++)
{
R_S_Byte(temp[2-i]); //串口上传温度
NRF905_Delay(10);
}
}
if(temp[2]>=53)//大于35度时报警,0x35转换成10进制为53
{
BELL_0; //打开蜂明器报警
}
else
{
BELL_1 ;//关闭蜂明器报警
}
LED1_0;
wd_xianshi(); //LCD温度显示
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -