📄 main.c
字号:
#include <reg931.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FALSE 0
//-------------------------------------------------------------------------------------------------------
typedef unsigned char BOOL;
// Data
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
/*******************************************************************************************/
/*//////////////////// LCD12864 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*\
/********************************************************************************************/
//LCD 引脚定义
sbit SCLK = P0^1;
sbit SID = P2^0;
sbit A0 = P0^0;
sbit CS1 = P1^7;
sbit RES = P2^1;
uchar code ComTable[]={3,2,1,0,7,6,5,4,};
#define DISPLAY_ON() Write_Instruction(0xaf) // Display on
#define DISPLAY_OFF() Write_Instruction(0xae) // Display off
#define SET_ADC() Write_Instruction(0xa1) // Reverse disrect (SEG131-SEG0)
#define CLEAR_ADC() Write_Instruction(0xa0) // Normal disrect (SEG0-SEG131)
#define REVERSE_DISPLAY_ON() Write_Instruction(0xa7) // Reverse display : 0 illuminated
#define REVERSE_DISPLAY_OFF() Write_Instruction(0xa6) // Normal display : 1 illuminated
#define ENTIRE_DISPLAY_ON() Write_Instruction(0xa5) // Entire dislay Force whole LCD point
#define ENTIRE_DISPLAY_OFF() Write_Instruction(0xa4) // Normal display
#define SET_BIAS() Write_Instruction(0xa3) // bias 1
#define CLEAR_BIAS() Write_Instruction(0xa2) // bias 0
#define SET_MODIFY_READ() Write_Instruction(0xe0) // Stop automatic increment of the column address by the read instruction
#define RESET_MODIFY_READ() Write_Instruction(0xee) // Cancel Modify_read, column address return to its initial value just before the Set Modify Read instruction is started
#define RESET() Write_Instruction(0xe2)
#define SET_SHL() Write_Instruction(0xc8) // SHL 1,COM63-COM0
#define CLEAR_SHL() Write_Instruction(0xc0) // SHL 0,COM0-COM63
/*******************************************************************************************/
/*//////////////////// CC2500 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*\
/********************************************************************************************/
sbit SPI_CS = P0^2;
sbit SPI_SI = P0^5;
sbit SPI_SO = P0^3;
sbit SPI_SCK = P0^4;
//sbit SPI_GDO0 = P1^6;
//#define REPORT_LEN 8
#define PACKAGE_LEN 64
xdata uchar rxBuffer[PACKAGE_LEN];
// CC2500 状态
//#define CCxxx0_Ready() SO
#define CRC_OK 0x80
#define BYTES_IN_RXFIFO 0x7F //突发访问TX FIFO
#define STATE_IDLE 0x01
#define RSSI 0
#define LQI 1
// Definitions to support burst/single access:
#define WRITE_BURST 0x40
#define READ_SINGLE 0x80
#define READ_BURST 0xC0
//CC2500配置寄存器位于SPI地址从0x00到0x2F之间
#define CCxxx0_IOCFG2 0x00 // GDO2 输出脚配置
#define CCxxx0_IOCFG1 0x01 // GDO1 输出脚配置
#define CCxxx0_IOCFG0 0x02 // GDO0 输出脚配置
#define CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO 门限
#define CCxxx0_SYNC1 0x04 // 同步词汇,高字节
#define CCxxx0_SYNC0 0x05 // 同步词汇,低字节
#define CCxxx0_PKTLEN 0x06 // 数据包长度
#define CCxxx0_PKTCTRL1 0x07 // 数据包自动控制
#define CCxxx0_PKTCTRL0 0x08 // 数据包自动控制
#define CCxxx0_ADDR 0x09 // 设备地址
#define CCxxx0_CHANNR 0x0A // 信道数
#define CCxxx0_FSCTRL1 0x0B // 频率合成器控制
#define CCxxx0_FSCTRL0 0x0C // 频率合成器控制
#define CCxxx0_FREQ2 0x0D // 频率控制词汇,高字节
#define CCxxx0_FREQ1 0x0E // 频率控制词汇,中间字节
#define CCxxx0_FREQ0 0x0F // 频率控制词汇,低字节
#define CCxxx0_MDMCFG4 0x10 // 调制器配置
#define CCxxx0_MDMCFG3 0x11 // 调制器配置
#define CCxxx0_MDMCFG2 0x12 // 调制器配置
#define CCxxx0_MDMCFG1 0x13 // 调制器配置
#define CCxxx0_MDMCFG0 0x14 // 调制器配置
#define CCxxx0_DEVIATN 0x15 // 调制器背离设置
#define CCxxx0_MCSM2 0x16 // 主通信控制状态机配置
#define CCxxx0_MCSM1 0x17 // 主通信控制状态机配置
#define CCxxx0_MCSM0 0x18 // 主通信控制状态机配置
#define CCxxx0_FOCCFG 0x19 // 频率偏移补偿配置
#define CCxxx0_BSCFG 0x1A // 位同步配置
#define CCxxx0_AGCCTRL2 0x1B // AGC控制
#define CCxxx0_AGCCTRL1 0x1C // AGC控制
#define CCxxx0_AGCCTRL0 0x1D // AGC控制
#define CCxxx0_WOREVT1 0x1E // 高字节时间0暂停
#define CCxxx0_WOREVT0 0x1F // 低字节时间0暂停
#define CCxxx0_WORCTRL 0x20 // 电磁波激活控制
#define CCxxx0_FREND1 0x21 // 前末端RX配置
#define CCxxx0_FREND0 0x22 // 前末端TX配置
#define CCxxx0_FSCAL3 0x23 // 频率合成器校准
#define CCxxx0_FSCAL2 0x24 // 频率合成器校准
#define CCxxx0_FSCAL1 0x25 // 频率合成器校准
#define CCxxx0_FSCAL0 0x26 // 频率合成器校准
#define CCxxx0_RCCTRL1 0x27 // RC振荡器配置
#define CCxxx0_RCCTRL0 0x28 // RC振荡器配置
#define CCxxx0_FSTEST 0x29 // 频率合成器校准控制
#define CCxxx0_PTEST 0x2A // 产品测试
#define CCxxx0_AGCTEST 0x2B // AGC 测试
#define CCxxx0_TEST2 0x2C // 不同的测试设置
#define CCxxx0_TEST1 0x2D // 不同的测试设置
#define CCxxx0_TEST0 0x2E // 不同的测试设置
//对0x30-0x3D间的地址来说,突发位用以在状态寄存器和命令滤波之间选择(如下)。
//状态寄存器只读。突发读取对状态寄存器是不可取的,故它们每次只能被读一个。
//命令滤波 这些命令用来关闭晶体振荡器,开启传输模式和电磁波激活等
#define CCxxx0_SRES 0x30 // 重启芯片
#define CCxxx0_SFSTXON 0x31 // 开启和校准频率合成器(若MCSM0.FS_AUTOCAL=1)
#define CCxxx0_SXOFF 0x32 // 关闭晶体振荡器
#define CCxxx0_SCAL 0x33 // 校准频率合成器并关断(开启快速启动)
#define CCxxx0_SRX 0x34 // 启用RX。若上一状态为空闲且MCSM0.FS_AUTOCAL=1则首先运行校准。
#define CCxxx0_STX 0x35 // 空闲状态:启用TX。若MCSM0.FS_AUTOCAL=1首先运行校准。
// 在RX状态且CCA启用:若信道为空则进入TX
#define CCxxx0_SIDLE 0x36 // 离开RX/TX,关断频率合成器并离开电磁波激活模式若可用
#define CCxxx0_SAFC 0x37 // 运行频率合成器的AFC调节
#define CCxxx0_SWOR 0x38 // 运行自动RX选举序列(电磁波激活)
#define CCxxx0_SPWD 0x39 // 当CSn为高时进入功率降低模式。
#define CCxxx0_SFRX 0x3A // 冲洗RX FIFO缓冲
#define CCxxx0_SFTX 0x3B // 冲洗TX FIFO缓冲
#define CCxxx0_SWORRST 0x3C // 重新设置真实时间时钟
#define CCxxx0_SNOP 0x3D // 无操作. 可能用来为更简单的软件将滤波命令变为2字节。
//状态寄存器
#define CCxxx0_PARTNUM 0x30 //CC2550的组成部分数目
#define CCxxx0_VERSION 0x31 //当前版本数
#define CCxxx0_FREQEST 0x32 //频率偏移估计
#define CCxxx0_LQI 0x33 //连接质量的解调器估计
#define CCxxx0_RSSI 0x34 //接收信号强度指示
#define CCxxx0_MARCSTATE 0x35 //控制状态机状态
#define CCxxx0_WORTIME1 0x36 //WOR计时器高字节
#define CCxxx0_WORTIME0 0x37 //WOR计时器低字节
#define CCxxx0_PKTSTATUS 0x38 //当前GDOx状态和数据包状态
#define CCxxx0_VCO_VC_DAC 0x39 //PLL校准模块的当前设定
#define CCxxx0_TXBYTES 0x3A //TX FIFO中的下溢和比特数
#define CCxxx0_RXBYTES 0x3B //RX FIFO中的下溢和比特数
#define CCxxx0_RCCTRL1_STATUS 0x3C //RC振荡器状态
#define CCxxx0_RCCTRL0_STATUS 0x3D
#define CCxxx0_PATABLE 0x3E //用来选择PA能量控制设置
#define CCxxx0_TXFIFO 0x3F //单字节访问TX FIFO
#define CCxxx0_RXFIFO 0x3F
uchar package[64];
void SPI_WAIT()
{
uchar i;
for (i=0; i<10; i++);
}
void halWait(uint timeout)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--timeout);
}
void OpenSpi()
{
SPI_SCK =0;
SPI_SI =0;
SPI_CS =0;
while (SPI_SO);
}
void CloseSpi()
{
SPI_CS =1;
}
void WriteByte(uchar Data)
{
uchar i;//,temp_si;
for (i=0; i<8; i++)
{
if (Data&0x80)
SPI_SI=1;
else
SPI_SI=0;
_nop_();
_nop_();
_nop_();
SPI_SCK=1;
_nop_();
_nop_();
_nop_();
_nop_();
SPI_SCK=0;
Data<<=1;
}
}
uchar ReadByte()
{
uchar i;
uchar Data;
for (i=0; i<8; i++)
{
Data<<=1;
_nop_();
_nop_();
SPI_SCK=0;
if (SPI_SO)
Data |= 0x01;
else
Data &= 0xfe;
_nop_();
_nop_();
_nop_();
_nop_();
SPI_SCK=1;
_nop_();
_nop_();
}
return Data;
}
/*
uchar _crc_ibutton_update(uchar crc,uchar data_t)
{
uchar i;
crc = crc^data_t;
for (i = 0; i < 8; i++)
{
if (crc & 0x01)
crc = (crc >> 1)^0x8C;
else
crc >>= 1;
}
return crc;
}
// 8位CRC检验码
uchar crc8_ibutton(uchar *data_t, uchar n)
{
char crc = 0x00;
while(n)
{
crc = _crc_ibutton_update(crc, *data_t ++);
--n;
}
return crc;
}*/
void SPI_Master_Init()
{
//设置SS SI SCK为输出(P0.2 P0.5 P0.4)(11开漏输出,10仅为输入(高阻),01推挽(上拉),准双向口),其他为输入P0.3
P0M1 =0x08;
P0M2 =0x34;
P1M1 =0x40; //P1.2 P1.3只能配置为输入口或开漏口。
P2M2 =0x00;
}/*
void mcu_init()
{
SPI_Master_Init();
}*/
void halSpiStrobe(BYTE strobe)
{
OpenSpi();
WriteByte(strobe);
SPI_WAIT();
CloseSpi();//拉高CS,数据发送完毕
}
BYTE halSpiReadReg(BYTE addr)
{
uchar x;
x=0;
OpenSpi();
WriteByte(addr|READ_SINGLE);
SPI_WAIT();
x=ReadByte();
CloseSpi();
return x;
}/**/
void halSpiWriteReg(BYTE addr,BYTE value)
{
OpenSpi();
WriteByte(addr);
SPI_WAIT();
WriteByte(value);
SPI_WAIT();
CloseSpi();
}
void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
uchar i;
OpenSpi();
WriteByte(addr|WRITE_BURST);
SPI_WAIT();
for(i=0;i<count;i++)
{
WriteByte(buffer[i]);
SPI_WAIT();
}
CloseSpi();
}
void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
uchar i;
OpenSpi();
WriteByte(addr|READ_BURST);
SPI_WAIT();
for(i=0;i<count;i++)
{
buffer[i]=ReadByte();
SPI_WAIT();
}
CloseSpi();
}/**/
BYTE halSpiReadStatus(BYTE addr)
{
uchar x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -