本帖最后由 codenew 于 2014-9-10 20:58 编辑
下面程序第一行先显示063,第二行先显示001,很快第一行变成001,而且第二行的001还在不断闪。
#include<reg51.h> #include<intrins.h> typedef unsigned char uchar; typedef unsigned char uint; unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字 //*********NRF24L01 IO端口定义**********// sbit MISO =P1^2; sbit MOSI =P1^3; sbit SCK =P1^4; sbit CE =P1^6; sbit CSN =P1^5; sbit IRQ =P1^0; //***液晶1602定义,数据口接P0口**// sbit rs=P3^3;//LCD数据/命令选择端(H/L) sbit rw=P3^4;//LCD读/写选择端(H/L) sbit en=P3^5;//LCD使能控制 //*************NRF24L01寄存器指令***********// #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 //*************SPI(nRF24L01)寄存器地址********// #define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 // 自动应答功能设置 void inerDelay_us(unsigned char n); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); uint SPI_RW_Reg(uchar reg, uchar value); void delays(uint x); void write_com(uchar com); void display_temp1(unsigned char x); void write_date(uchar date); /***************************************************** 函数功能:主函数 ***************************************************/ void main(void) { unsigned int TN; unsigned int TD; inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // Spi clock line init high write_com(0x38); //设置工作方式 write_com(0x0c); //设置光标 write_com(0x06); //设置输入方式 write_com(0x01); //清屏 TN=SPI_Read(EN_AA); write_com(0x80); display_temp1(TN);// 期望值显示的是063(十进制),NRF24L01上电后,EN_AA默认值是 0011 1111,即十进制63。 delays(200); delays(200); delays(200); delays(200); delays(200); delays(200); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); TD=SPI_Read(EN_AA); write_com(0x80+0x40); display_temp1(TD); //期望值显示的是001,因为前面向EN_AA写入了0x01。 delays(200); delays(200); delays(200); delays(200); delays(200); delays(200); } /***************************************************** 函数功能:显示十进制数 入口参数:x ***************************************************/ void display_temp1(unsigned char x) { unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位 j=x/100; //取百位 k=(x%100)/10; //取十位 l=x%10; //取个位 write_date(digit[j]); //将百位数字的字符常量写入LCD write_date(digit[k]); //将十位数字的字符常量写入LCD write_date(digit[l]); //将个位数字的字符常量写入LCD delays(50); //延时1ms给硬件一点反应时间 } /***********1602液晶显示部分子程序****************/ void write_com(uchar com) { rs=0;//命令 rw=0; P0=com; delays(5); en=1; delays(5); en=0; } void write_date(uchar date) { rs=1;//数据 rw=0; P0=date; delays(5); en=1; delays(5); en=0; } /****************************************************************************************************/ /*功能:NRF24L01读写寄存器函数 /****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value) { uint status; CSN = 0; // CSN low, init SPI transaction status = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. CSN = 1; // CSN high again return(status); // return nRF24L01 status uchar } /**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg) /****************************************************************************************************/ uchar SPI_Read(uchar reg) { uchar reg_val; CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue CSN = 1; // CSN high, terminate SPI communication return(reg_val); // return register value } /**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /****************************************************************************************************/ uint SPI_RW(uint uchar) { uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit { MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; // ..then set SCK low again } return(uchar); // return read uchar } //*****************长延时*********************************// void delays(uint x) //毫秒级延时函数 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } //********************************************************// //*延时函数 //********************************************************// void inerDelay_us(unsigned char n) { for(;n>0;n--) _nop_(); }
|