本帖最后由 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_(); }
|