⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 st7565P,nt7534液晶控制芯片在128X64点阵下的51环境液晶驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -