单片机驱动1602 C语言问题高分求教大神

单片机驱动1602 C语言问题高分求教大神,第1张

for(i=0i<8i++)

{

if(tf&0x01)

dischar(addr+i,"1")

else

dischar(addr+i,"0")

}

dischar是lcd的字符输入驱动,addr是显示地址

#include <reg52.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5

#define TX_DATA_WITDH 8

#define RX_DATA_WITDH 8

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

// nRF24L01指令格式:

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

#define R_REGISTER0x00 // 读寄存器

#define W_REGISTER0x20 // 写寄存器

#define R_RX_PLOAD0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#define W_TX_PLOAD0xA0 // 写TX FIFO有效数据,1-32字节,写 *** 作从字节0开始,应用于发射模式

#define FLUSH_TX0xE1 // 清除TX FIFO寄存器,应用于发射模式

#define FLUSH_RX0xE2 // 清除RX FIFO寄存器,应用于接收模式

#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#define NOP 0xFF // 空 *** 作,可以用来读状态寄存器

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

// nRF24L01寄存器地址

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

#define CONFIG 0x00 // 配置寄存器

#define EN_AA 0x01 // “自动应答”功能寄存器

#define EN_RX_ADDR 0x02 // 接收通道使能寄存器

#define SETUP_AW0x03 // 地址宽度设置寄存器

#define SETUP_RETR 0x04 // 自动重发设置寄存器

#define RF_CH 0x05 // 射频通道频率设置寄存器

#define RF_SETUP0x06 // 射频设置寄存器

#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_P00x11 // 数据通道0有效数据宽度设置寄存器

#define RX_PW_P10x12 // 数据通道1有效数据宽度设置寄存器

#define RX_PW_P20x13 // 数据通道2有效数据宽度设置寄存器

#define RX_PW_P30x14 // 数据通道3有效数据宽度设置寄存器

#define RX_PW_P40x15 // 数据通道4有效数据宽度设置寄存器

#define RX_PW_P50x16 // 数据通道5有效数据宽度设置寄存器

#define FIFO_STATUS 0x17 // FIFO状态寄存器

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

uchar sta // 状态变量

#define RX_DR (sta &0x40) // 接收成功中断标志

#define TX_DS (sta &0x20) // 发射成功中断标志

#define MAX_RT (sta &0x10) // 重发溢出中断标志

sbit CE=P2^0

sbit IRQ=P2^5

sbit CSN=P2^1

sbit MOSI=P2^3

sbit MISO=P2^4

sbit SCK=P2^2

sbit LED=P3^2

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01}

uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}

uchar RX_Buffer[RX_DATA_WITDH]

void _delay_us(uint x)

{

uint i,j

for (j=0j<xj++)

for (i=0i<12i++)

}

void _delay_ms(uint x)

{

uint i,j

for (j=0j<xj++)

for (i=0i<120i++)

}

void nRF24L01_Init(void)

{

_delay_us(2000)

CE=0

CSN=1

SCK=0

IRQ=1

}

uchar SPI_RW(uchar byte)

{

uchar i

for(i=0i<8i++)

{

if(byte&0x80)

MOSI=1

else

MOSI=0

byte<<=1

SCK=1

if(MISO)

byte|=0x01

SCK=0

}

return byte

}

uchar SPI_W_Reg(uchar reg,uchar value)

{

uchar status

CSN=0

status=SPI_RW(reg)

SPI_RW(value)

CSN=1

return status

}

uchar SPI_R_byte(uchar reg)

{

uchar status

CSN=0

SPI_RW(reg)

status=SPI_RW(0)

CSN=1

return status

}

uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)

{

uchar reg_value,i

CSN=0

reg_value=SPI_RW(reg)

for(i=0i<Dleni++)

{

Dat_Buffer[i]=SPI_RW(0)

}

CSN=1

return reg_value

}

uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)

{

uchar reg_value,i

CSN=0

reg_value=SPI_RW(reg)

for(i=0i<Dleni++)

{

SPI_RW(TX_Dat_Buffer[i])

}

CSN=1

return reg_value

}

void nRF24L01_Set_RX_Mode(void)

{

CE=0//待机

SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH)

SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH)

SPI_W_Reg(W_REGISTER+EN_AA,0x01)//auot ack

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01)

SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a)

SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH)

SPI_W_Reg(W_REGISTER+RF_CH,0)

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07)//0db,lna

SPI_W_Reg(W_REGISTER+CONFIG,0x0f)

CE=1

_delay_ms(5)

}

uchar nRF24L01_RX_Data(void)

{

//uchar i,status

sta=SPI_R_byte(R_REGISTER+STATUS)

if(RX_DR)

{

CE=0

SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH)

//P3=RX_Buffer[0]

SPI_W_Reg(W_REGISTER+STATUS,0xff)

CSN=0

SPI_RW(FLUSH_RX)

CSN=1

return 1

}

else

return 0

}

void main(void)

{

uchar i

P0=0xff

P1=0xff

P2=0xff

P3=0xff

_delay_us(1000)

nRF24L01_Init()

while(1)

{

nRF24L01_Set_RX_Mode()

_delay_ms(100)

if(nRF24L01_RX_Data())

{

LED=0

//delay_ms(300)

}

else

LED=1

}

}

这个是通过测试了的,您可以参考一下,没有用到中断,是用查询的方式,希望对你有帮助吧~!!

ADXL345使用独立5v电源 SPI方式可以参考ti例子因为初始化是固定的呀

比如

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

// MSP-FET430P140 Demo - USART0, SPI Full-Duplex 3-Wire Slave P1.x Exchange

//

// Description: SPI Master communicates at fast as possible, full-duplex with

// SPI Slave using 3-wire mode. The level on P1.4/5 is TX'ed and RX'ed to P1.0

// and P1.1. Master will pulse slave Reset on init to insure synch start.

// Slave normal mode is LPM4.

// ACLK = n/a, MCLK = SMCLK = DCO ~ 800kHz, ULCK = external

//

// fet140_slav0 fet140_mstr0

// MSP430F169 Slave MSP430F169 Master

// ----------------- -----------------

//| XIN|-/|\| XIN|-

//| | | | |

//| XOUT|- --|RST XOUT|-

//| | /|\| |

//| RST|--+<----|P3.0 |

// LED <-|P1.0 || P1.4|<-

// LED <-|P1.1 || P1.5|<-

// ->|P1.4 || P1.0|->LED

// ->|P1.5 || P1.1|->LED

//| SIMO0/P3.1|<-------|P3.1 |

//| SOMI0/P3.2|------->|P3.2 |

//|UCLK/P3.3|<-------|P3.3 |

//

// M. Buccini

// Texas Instruments Inc.

// Feb 2005

// Built with IAR Embedded Workbench Version: 3.21A

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

#include <msp430x14x.h>

void main(void)

{

WDTCTL = WDTPW + WDTHOLD// Stop watchdog

P1OUT = 0x00// P1.0 setup for LED output

P1DIR |= 0x03

P3SEL |= 0x0E // P3.1,2,3 SPI option select

U0CTL = CHAR + SYNC + SWRST // 8-bit, SPI

U0TCTL = CKPL + STC // Polarity, 3-wire

U0BR0 = 0x02// SPICLK = SMCLK/2

U0BR1 = 0x00

U0MCTL = 0x00

ME1 |= USPIE0 // Module enable

U0CTL &= ~SWRST // SPI enable

IE1 |= URXIE0 + UTXIE0 // RX and TX interrupt enable

_BIS_SR(LPM4_bits + GIE)// Enter LPM4 w/ interrupt

}

#pragma vector=USART0RX_VECTOR

__interrupt void SPI0_rx (void)

{

P1OUT = RXBUF0 // RXBUF0 to TXBUF0

}

#pragma vector=USART0TX_VECTOR

__interrupt void SPI0_tx (void)

{

unsigned int i

i = P1IN

i = i >>4

TXBUF0 = i // Transmit character

}

知识豪杰,快来加入430f149团队吧,一起答疑助人,没你不行!团队地址:http://zhidao.baidu.com/team/view/430f149


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11834844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存