完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
板子弄好了 ,但是只是液晶亮了而已 。其他没反应 附上电路图 和程序 新人求解
#include #include typedef unsigned char uchar; typedef unsigned char uint; typedef unsigned char U8; /*variable 无符号8位整型变量 */ typedef signed char S8; /* variable 有符号8位整型变量 */ typedef unsigned int U16; /*variable 无符号16位整型变量 */ typedef signed int S16; /*variable 有符号16位整型变量 */ typedef unsigned long U32; /*variable 无符号32位整型变量 */ typedef signed long S32; /*variable 有符号32位整型变量 */ typedef float F32; /*variable (32bits) 单精度浮点数(32位长度) */ typedef double F64; /*variable (64bits) 双精度浮点数(64位长度) */ //***************************IO端口定********************************* ***it MISO =P1^3; ***it MOSI =P1^1; ***it SCK =P1^4; ***it CE =P3^2; ***it CSN =P1^0; ***it IRQ =P1^2; ***it LCD_RS = P2^7 ; ***it LCD_RW = P2^6 ; ***it LCD_EN = P2^5 ; //**************************DHT11端口设****************************** ***it P2_0 = P2^0 ; U8 U8FLAG,k; U8 U8count,U8temp; U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata; uchar data temp_data[2]={0x00,0x00}; //温度湿度采集数据缓冲区 uchar dispaly[4]; //显示缓冲区 uint bdata sta; //NRF24L01状态标志 ***it RX_DR =sta^6; ***it TX_DS =sta^5; ***it MAX_RT =sta^4; //*************************************NRF24L01*********************** #define TX_ADR_WIDTH 5 // 本机地址宽度设置 #define RX_ADR_WIDTH 5 // 接收方地址宽度设置 #define TX_PLOAD_WIDTH 10 // 4 字节数据长度 #define RX_PLOAD_WIDTH 10 // 4 字节数据长度 uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 //***************NRF24L01寄存器指令**************** #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留 //*************SPI(nRF24L01)寄存器地址************** #define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 // 自动应答功能设置 #define EN_RXADDR 0x02 // 可用信道设置 #define SETUP_AW 0x03 // 收发地址宽度设置 #define SETUP_RETR 0x04 // 自动重发功能设置 #define RF_CH 0x05 // 工作频率设置 #define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能 #define CD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址 #define RX_ADDR_P1 0x0B // 频道1接收数据地址 #define RX_ADDR_P2 0x0C // 频道2接收数据地址 #define RX_ADDR_P3 0x0D // 频道3接收数据地址 #define RX_ADDR_P4 0x0E // 频道4接收数据地址 #define RX_ADDR_P5 0x0F // 频道5接收数据地址 #define TX_ADDR 0x10 // 发送地址寄存器 #define RX_PW_P0 0x11 // 接收频道0接收数据长度 #define RX_PW_P1 0x12 // 接收频道0接收数据长度 #define RX_PW_P2 0x13 // 接收频道0接收数据长度 #define RX_PW_P3 0x14 // 接收频道0接收数据长度 #define RX_PW_P4 0x15 // 接收频道0接收数据长度 #define RX_PW_P5 0x16 // 接收频道0接收数据长度 #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置 #define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ; //************************************NRF24L01函数申明**************** void Delay(unsigned int s); void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void); uint SPI_RW_Reg(uchar reg, uchar value); uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); //**************************DHT11函数申明************************ void Delay1(U16 j); void Delay_10us(void); void COM(void); void RH(void); //***************************LCD1602函数声明************************* void delay2(int ms); bit lcd_busy(); void lcd_wcmd(uchar cmd); void lcd_wdat(uchar dat); void lcd_init(); void lcd_pos(uchar pos); void LCD_disp_char(uchar x,uchar y,uchar dat); void LCD_disp_str(uchar x,uchar y,uchar *str); //***************************LCD1602相关函数************************ void delay2(int ms) { unsigned char y ; while(ms--) { for(y = 0 ; y<250 ; y++) { _nop_() ; _nop_() ; _nop_() ; _nop_() ; } } } /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ bit lcd_busy() { bit result ; LCD_RS = 0 ; LCD_RW = 1 ; LCD_EN = 1 ; delayNOP() ; result = (bit)(P0&0x80) ; LCD_EN = 0 ; return(result) ; } /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ void lcd_wcmd(uchar cmd) { while(lcd_busy()) ; LCD_RS = 0 ; LCD_RW = 0 ; LCD_EN = 0 ; _nop_() ; _nop_() ; P0 = cmd ; delayNOP() ; LCD_EN = 1 ; delayNOP() ; LCD_EN = 0 ; } /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ void lcd_wdat(uchar dat) { while(lcd_busy()) ; LCD_RS = 1 ; LCD_RW = 0 ; LCD_EN = 0 ; P0 = dat ; delayNOP() ; LCD_EN = 1 ; delayNOP() ; LCD_EN = 0 ; } /* LCD初始化设定 */ void lcd_init() { delay2(15) ; lcd_wcmd(0x01) ; //清除LCD的显示内容 lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据 delay2(5) ; lcd_wcmd(0x38) ; delay2(5) ; lcd_wcmd(0x38) ; delay2(5) ; lcd_wcmd(0x0c) ; //显示开,关光标 delay2(5) ; lcd_wcmd(0x06) ; //移动光标 delay2(5) ; lcd_wcmd(0x01) ; //清除LCD的显示内容 delay2(5) ; } /* 设定显示位置 */ void lcd_pos(uchar pos) { lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量 } void LCD_disp_char(uchar x,uchar y,uchar dat) { uchar address; if(y==1) address=0x80+x; else address=0xc0+x; lcd_wcmd(address); lcd_wdat(dat); } /*模块名称:LCD_disp_str(); /*功 能:LCD1602显示字符串函数,在某个屏幕起始位置{X(0-15),y (1-2)}上显示一个字符串。 void LCD_disp_str(uchar x,uchar y,uchar *str) { uchar address; if(y==1) address=0x80+x; else address=0xc0+x; lcd_wcmd(address); while(*str!=' |