当前位置:文档之家› NRF24L01的发送和接收程序 1602 显示

NRF24L01的发送和接收程序 1602 显示

NRF24L01的发送和接收程序 1602 显示
NRF24L01的发送和接收程序 1602 显示

发送:

#include

#include

typedef unsigned char uchar;

typedef unsigned char uint;

//****************************************NRF24L01端口定义***************************************

sbit CE =P2^0;

sbit CSN =P2^5;

sbit SCK =P2^1;

sbit MOSI =P2^4;

sbit MISO =P2^2;

sbit IRQ=P2^3;

#define TX_ADR_WIDTH 5 // 本机地址宽度设置

#define RX_ADR_WIDTH 5 // 接收方地址宽度设置

#define TX_PLOAD_WIDTH 20 // 4 字节数据长度

#define RX_PLOAD_WIDTH 20 // 4 字节数据长度

uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0xb2,0xb2,0xb3,0xb4,0x01};

uchar code RX_ADDRESS[RX_ADR_WIDTH] = {0xb2,0xb2,0xb3,0xb4,0x01};

uchar RX_BUF[RX_PLOAD_WIDTH];

uchar TX_BUF[TX_PLOAD_WIDTH]=

{

2,1,3

};

uchar flag,status;

uchar DA TA = 0x01;

uchar bdata sta;

sbit RX_DR = sta^6;

sbit TX_DS = sta^5;

sbit MAX_RT = sta^4;

//*************************************NRF24L01******************************************** ******

#define TX_ADR_WIDTH 5 // 本机地址宽度设置

#define RX_ADR_WIDTH 5 // 接收方地址宽度设置

#define TX_PLOAD_WIDTH 20 // 4 字节数据长度

#define RX_PLOAD_WIDTH 20 // 4 字节数据长度

//*****************************NRF24L01寄存器指令,详细请对照,Page18******************************

#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)寄存器地址,详细请对照,Page18-24**********************

#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式

#define EN_AA0x01 // 自动应答功能设置

#define EN_RXADDR 0x02 // 可用信道设置

#define SETUP_AW 0x03 // 收发地址宽度设置

#define SETUP_RETR 0x04 // 自动重发功能设置

#define RF_CH 0x05 // 工作频率设置

#define RF_SETUP 0x06 // 发射速率、功耗功能设置

#define STA TUS 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_STA TUS 0x17 // FIFO栈入栈出状态寄存器设置

//************************************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 NRF24L01Int();

void SetRX_Mode(void);

void SetTX_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);

/**************************************************/

/************************************************** 函数: init_io()

描述:

初始化IO

/**************************************************/ void init_io(void)

{

CE = 0; // 待机

CSN = 1; // SPI禁止

SCK = 0; // SPI时钟置低

IRQ = 1; // 中断复位

}

/**************************************************/

/************************************************** 函数:delay_ms()

描述:

延迟x毫秒

/**************************************************/ void delay_ms(uchar x)

{

uchar i, j;

i = 0;

for(i=0; i

{

j = 250;

while(--j);

j = 250;

while(--j);

}

}

/**************************************************/

/**************************************************

函数:SPI_RW()

描述:

根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01

读出一字节

/**************************************************/

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0; i<8; i++) // 循环8次

{

MOSI = (byte & 0x80); // byte最高位输出到MOSI

byte <<= 1; // 低一位移位到最高位

SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据

byte |= MISO; // 读MISO到byte最低位

SCK = 0; // SCK置低

}

return(byte); // 返回读出的一字节

}

/**************************************************/

/**************************************************

函数:SPI_RW_Reg()

描述:

写数据value到reg寄存器

/**************************************************/

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字

SPI_RW(value); // 然后写数据到该寄存器

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:SPI_Read()

描述:

从reg寄存器读一字节

/**************************************************/

uchar SPI_Read(uchar reg)

{

uchar reg_val;

CSN = 0; // CSN置低,开始传输数据

SPI_RW(reg); // 选择寄存器

reg_val = SPI_RW(0); // 然后从该寄存器读数据

CSN = 1; // CSN拉高,结束数据传输

return(reg_val); // 返回寄存器数据

}

/**************************************************/

/**************************************************

函数:SPI_Read_Buf()

描述:

从reg寄存器读出bytes个字节,通常用来读取接收通道

数据或接收/发送地址

/**************************************************/

uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)

{

uchar status, i;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; i

pBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:SPI_Write_Buf()

描述:

把pBuf缓存中的数据写入到nRF24L01,通常用来写入发

射通道数据或接收/发送地址

/**************************************************/

uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)

{

uchar status, i;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字

for(i=0; i

SPI_RW(pBuf[i]); // 逐个字节写入nRF24L01

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:TX_Mode()

描述:

这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),

130us后启动发射,数据发送结束后,发送模块自动转入接收

模式等待应答信号。

/**************************************************/

void TX_Mode(uchar * BUF)

{

CE = 0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同

SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO

SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); // 使能接收通道0自动应答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); // 使能接收通道0

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次

SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电

CE = 1;

}

/**************************************************/

/**************************************************

函数:Check_ACK()

描述:

检查接收设备有无接收到数据包,设定没有收到应答信

号是否重发

/**************************************************/

uchar Check_ACK(bit clear)

{

while(IRQ);

sta = SPI_RW(NOP); // 返回状态寄存器

if(MAX_RT)

if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发

SPI_RW(FLUSH_TX);

SPI_RW_Reg(WRITE_REG + STA TUS, sta); // 清除TX_DS或MAX_RT中断标志

IRQ = 1;

if(TX_DS)

return(0x00);

else

return(0xff);

}

void main(void)

{

init_io(); // 初始化IO

while(1)

{

TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据

Check_ACK(1); // 等待发送完毕,清除TX FIFO

delay_ms(250);

delay_ms(250);

}

}

接收

#include

#include

typedef unsigned char uchar;

typedef unsigned char uint;

sbit lcdrs=P2^5;

sbit lcdrw=P2^6;

sbit lcden=P2^7;

//****************************************NRF24L01端口定义***************************************

sbit C E =P2^0;

sbit C SN =P2^5;

sbit SCK =P2^1;

sbit MOSI =P2^4;

sbit MISO =P2^2;

sbit IRQ =P2^3;

//*********************************************NRF24L01*********************** **************

#define TX_ADR_WIDTH 5 // 5 uints TX address width

#define RX_ADR_WIDTH 5 // 5 uints RX address width

#define TX_PLOAD_WIDTH 20 // 20 uints TX payload

#define RX_PLOAD_WIDTH 20 // 20 uints TX payload

uint const TX_ADDRESS[TX_ADR_WIDTH]= {0xb2,0xb2,0xb3,0xb4,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0xb2,0xb2,0xb3,0xb4,0x01}; //接收地址

uchar RX_BUF[RX_PLOAD_WIDTH];

uchar TX_BUF[TX_PLOAD_WIDTH];

uchar flag,status;

uchar DA TA = 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_AA0x01 // 自动应答功能设置

#define EN_RXADDR 0x02 // 可用信道设置

#define SETUP_A W 0x03 // 收发地址宽度设置

#define SETUP_RETR 0x04 // 自动重发功能设置

#define RF_CH 0x05 // 工作频率设置

#define RF_SETUP 0x06 // 发射速率、功耗功能设置

#define STA TUS 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_STA TUS 0x17 // FIFO栈入栈出状态寄存器设置

//***************************************************************************** *********

void Delay(unsigned int s);

void inerDelay_us(unsigned char n);

void init_NRF24L01(void);

void NRF24L01Int();

uint SPI_RW(uint uchar);

uchar SPI_Read(uchar reg);

void SetRX_Mode(void);

void SetTX_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);

//***************************************************************************** *************

uint bdata sta; //状态标志

sbit RX_DR =sta^6;

sbit TX_DS =sta^5;

sbit MAX_RT =sta^4;

void delay1(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P0=com;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

void write_data(uchar date)

{

lcdrs=1;

lcden=0;

P0=date;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

void init()

{

lcdrw=0;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

}

void write_sfm(uchar add,unsigned char* RxBuf) {

write_com(0x80+add);

write_data(0x30+RxBuf[0]);

write_data(0x30+RxBuf[1]);

write_data(0x30+RxBuf[2]);

}

/**************************************************/

/**************************************************

函数: init_io()

描述:

初始化IO

/**************************************************/

void init_io(void)

{

CE = 0; // 待机

CSN = 1; // SPI禁止

SCK = 0; // SPI时钟置低

IRQ = 1; // 中断复位

}

/**************************************************/

/**************************************************

函数:delay_ms()

描述:

延迟x毫秒

/**************************************************/

void delay_ms(uchar x)

{

uchar i, j;

i = 0;

for(i=0; i

{

j = 250;

while(--j);

j = 250;

while(--j);

}

}

/**************************************************/

/**************************************************

函数:SPI_RW()

描述:

根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节

/**************************************************/

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0; i<8; i++) // 循环8次

{

MOSI = (byte & 0x80); // byte最高位输出到MOSI

byte <<= 1; // 低一位移位到最高位

SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据

byte |= MISO; // 读MISO到byte最低位

SCK = 0; // SCK置低

}

return(byte); // 返回读出的一字节

}

/**************************************************/

/**************************************************

函数:SPI_RW_Reg()

描述:

写数据value到reg寄存器

/**************************************************/

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字

SPI_RW(value); // 然后写数据到该寄存器

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:SPI_Read()

描述:

从reg寄存器读一字节

/**************************************************/

uchar SPI_Read(uchar reg)

{

uchar reg_val;

CSN = 0; // CSN置低,开始传输数据

SPI_RW(reg); // 选择寄存器

reg_val = SPI_RW(0); // 然后从该寄存器读数据

CSN = 1; // CSN拉高,结束数据传输return(reg_val); // 返回寄存器数据

}

/**************************************************/

/**************************************************

函数:SPI_Read_Buf()

描述:

从reg寄存器读出bytes个字节,通常用来读取接收通道

数据或接收/发送地址

/**************************************************/ uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)

{

uchar status, i;

CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; i

pBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:SPI_Write_Buf()

描述:

把pBuf缓存中的数据写入到nRF24L01,通常用来写入发

射通道数据或接收/发送地址

/**************************************************/ uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)

{

uchar status, i;

CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; i

SPI_RW(pBuf[i]); // 逐个字节写入nRF24L01 CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器

}

/**************************************************/

/**************************************************

函数:RX_Mode()

描述:

这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包

/**************************************************/

void RX_Mode(void)

{

CE = 0;

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址

SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); // 使能接收通道0自动应答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); // 使能接收通道0

SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC 校验,上电,接收模式

CE = 1; // 拉高CE启动接收设备

}

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

{

sta = SPI_Read(STA TUS); // 读状态寄存器

if(RX_DR) // 判断是否接受到数据

{

status=sta;

status&=0x0e;

status>>=1;

SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); // 从RX FIFO读出数据

flag = 1;

}

SPI_RW_Reg(WRITE_REG + STA TUS, sta); // 清除RX_DS中断标志

return flag;

}

//************************************主函数************************************************************

void main(void)

{

init_io(); // 初始化IO

init();

while(1)

{

RX_Mode(); // 设置为接收模式

if(nRF24L01_RxPacket(RX_BUF))

write_sfm(4,RX_BUF);

// delay_ms(250);

delay_ms(100);

}

}

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

NRF24L01发送程序

#include #include typedef unsigned int uint; typedef unsigned char uchar; #define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节 #define TX_DATA_WITDH 8// #define RX_DATA_WITDH 8 #define R_REGISTER 0x00 // 读寄存器 #define W_REGISTER 0x20 // 写寄存器 #define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式 #define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式 #define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式 #define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式 #define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射 #define NOP 0xFF // 空操作,可以用来读状态寄存器 #define CONFIG 0x00 // 配置寄存器 #define EN_AA 0x01 // “自动应答”功能寄存 #define EN_RX_ADDR 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 // 数据通道1有效数据宽度设置寄存器 #define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器 #define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器 #define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器 #define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

NRF24L01无线模块收发程序(实测成功 多图)

NRF24L01无线模块收发程序(实测成功多图) 本模块是NRF24L01无线传输模块,用于无线传输数据,距离不远,一般只是能够满足小距离的传输,目测是4-5m,价格一般是4元左右,可以方便的买到。 51最小系统学习板就可以,当时是用了两块学习板,一块用于发送,一块用于接收。 小车也是比较容易购到的,四个端口控制两个电机,两个控制一个电机,当两个端口高低电平不同时电机就会转动,即为赋值1和0是电机转动,赋值可以用单片机作用,当然这是小车启动部分,前进后退左转右转就是你赋值0和1的顺序问题了。

整体思路是用发射端的按键控制小车,即为按键按下就前进,再按其他按键实现其他功能,本次程序是在用NRF24L01发射数据在接收端用1602显示的基础上改变。 下面是程序源码(有好几个文件,分别创建) ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////// #include #include #include'1602.h' #include'delay.h' #include 'nrf24l01.h' #define uint unsigned int #define uchar unsigned char uint Weight_Shiwu=1234; unsigned char KeyScan(void);//键盘扫描 // unsigned char KeyScan(void);//键盘扫描 //#define KeyPort P0 sbit KEY1 = P0^0; sbit KEY2 = P0^1; sbit KEY3 = P0^2; sbit KEY4 = P0^3; sbit KEY5 = P0^4; void main() { // char TxDate[4]; // LCD_Init(); //初始化液晶屏 // LCD_Clear(); //清屏

NRF24L01无线模块收发程序例程

//下面是接收的NRF24L01的程序。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include "nrf24l01.h" #include #define uchar unsigned char #define uint unsigned int sbit IRQ =P1^2;//输入 sbit MISO =P1^3; //输入 sbit MOSI =P1^1;//输出 sbit SCLK =P1^4;//输出 sbit CE =P1^5;//输出 sbit CSN =P1^0;//输出 uchar RevTempDate[5];//最后一位用来存放结束标志 uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址 /*****************状态标志*****************************************/ uchar bdata sta; //状态标志 sbit RX_DR=sta^6; sbit TX_DS=sta^5; sbit MAX_RT=sta^4; /*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) // 循环8次 { if(date&0x80) MOSI=1; else MOSI=0; // byte最高位输出到MOSI date<<=1; // 低一位移位到最高位 SCLK=1; if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位 SCLK=0; // SCK置低 } return(date); // 返回读出的一字节 } /**********************NRF24L01初始化函数*******************************/ void NRF24L01Int() {

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序 24MHz晶振 #include #include #include #include #include #include #define U8 unsigned char #define U16 unsigned int #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节 #define TX_DATA_WITDH 1//发送数据宽度1个字节 #define RX_DATA_WITDH 1//接收数据宽度1个字节 #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器 #define R_RX_PAYLOAD 0x61//读取RX有效数据 #define W_TX_PAYLOAD 0xa0//写TX有效数据 #define FLUSH_TX 0xe1//清除TXFIFO寄存器 #define FLUSH_RX 0xe2//清除RXFIFO寄存器 #define REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作 #define CONFIG 0x00//配置寄存器 #define EN_AA 0x01//使能自动应答 #define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #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接收地址

nrf24l01无线模块NRF24L01模块收发c程序

//许多人都在找nrf24l01无线模块的c程序;我以前刚接触无线//时用的就是nrf24l01模块;搜索了许多程序有很多都没法直接用;甚至还怀疑模块是不是被我搞坏了;拿去让别人检测模块又是好的;为避免大家走弯路;我将我的程序发出来供大家参考; 这是nrf24l01无线模块pcb图; 下面有Nrf24l01无线模块的收发c程序;以下程序经本人亲自测试;绝对能用!! 请注意以下几点: 1、24L01模块的电源电压是否为3V-3.6V之间; 2、如果您用的单片机是5V的话,请在IO口与模块接口之间串一个1K电阻; 3、检查模块的GND是否与单片机的GND相连接 4、先用程序进行调试,如果IO口不同,请更改IO口或相关时序; 5、如果是51系列单片机,晶振请选用11.0592M Hz; 模块供电最好用asm1117 5v转3.3v 稳压 测试单片机是stc89c52;at89c52 通用; 收发一体;

一大截不废话了;上程序;此程序是按键控制led;当按下s的时候对应接受的led会闪闪发光;很简单的~如果要实现其他更先进的功能;自己发掘吧~~ 务必将硬件连接正确;否则;它不会工作的~~当然做什么都要严谨~~错一点就差大了~~ 《《收发一体程序》》 #include #include typedef unsigned char uchar; typedef unsigned char uint; //****************************************NRF24L01端口定义

*************************************** sbit M ISO =P1^3; sbit M OSI =P1^4; sbit SCK =P1^2; sbit CE =P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //************************************按键*************************************************** sbit KEY=P2^0; //***************************************************************************** sbit led=P2^1; //*********************************************NRF24L01*********************** ************** #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload 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接收数据地址

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

NRF24L01无线发射简易教程

NRF24L01 简易教程

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下: 首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。 我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。 作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。 具体的要求如下: 1、具备发送和接收的能力。 2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形 式。 3、把接收到的数据传送到PC 进行查看。 4、发送端每隔大约1.5 秒发送一次数据,永久循环。以上是程序的要求,若您想自行 设计出硬件接口,您也是可以添加一条呢:使用DIY 方 式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。 我们使用的方式是画PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O! 我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。 为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤波电容。

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

NRF24L01发送程序(可用)

//***************************************************发送程序**********************************************************// #include #include typedef unsigned char uchar; //****************************************NRF24L01端口定义*************************************** sbit M ISO =P1^5; sbit M OSI =P1^1; sbit SCK =P1^6; sbit CE =P1^7; sbit CSN =P1^2; sbit IRQ =P1^0; //***********************************发送缓冲区********************************************* uchar TxBuf[32]= { 0x01,0x22,0x32,0x04,0x08,0x01,0x07,0x08, 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16, 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24, 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32, }; //

//*********************************************NRF24L01************************ ************* #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 32 // 20 uints TX payload #define RX_PLOAD_WIDTH 32 // 20 uints TX payload uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uchar 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 // 可用信道设置

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

相关主题
文本预览
相关文档 最新文档