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

📄 spidvr.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
字号:
#include "18f6520PinDef.h"
/****************************************************************/
//: delay1*/
//: 延时dlenght个_nop_()的时间*/
//: unsigned char dlength*/
//: None*//****************************************************************/
void delay1(unsigned char dlength)
{ 
  unsigned char i;
  for (i=0;i<dlength;i++)
  {
       _nop_();
  }
}

/****************************************************************/
//: rev *///: 该函数从FM1702SL的SPI口接收一个字节*/
//: N/A */
//: 接收的字节*/
/****************************************************************/
//时钟由MCU提供,在每一个时钟的上升沿,MCU读RF-MISO上的电平,8BIT为一个字节
//先高位,后低位
unsigned char rev()
{
	unsigned char i;
	unsigned char var;
		HQCCLK=0;		
		var=0;
		for (i=0;i<8;i++)    
		{ 
			HQCCLK=1;                 // 产生SCK脉冲
			var<<=1;
			var=(var&(unsigned char HQCDI));             
			HQCCLK=0;    
	 	}
	HQCCLK=0;		
	return(var);                      // 返回	
} 

/****************************************************************/
//: Send */
//: 该函数发送一个字节到FM702SL*/
//: 待发送的数据 */
//: N/A*/
/****************************************************************/
void Send(unsigned char var) 

{ 
	unsigned char data i,tem;
	for (i=0;i<8;i++)          		  // 8位字节输出
	{
		HQCCLK=0; 
	    tem=var&0x80;                 // 选择高位
		if (tem==0x80) HQCDO=1;       // 输出高位
      		else HQCDO=0;
		HQCCLK=1;                     // 使SCK为1,上升沿有效
		_nop_();
		var<<=1;					  // 左移1位
		delay1(1);	 
		HQCCLK=0; 	                  // 使SCK为低电平						
	}         
	HQCDO=1;
}                  

/****************************************************************/
//: read_reg */
//: 该函数根据给定的地址读取FM1702SL的寄存器*/
//: 寄存器地址 */
//: 寄存器值*/
/****************************************************************/
unsigned char read_reg(unsigned char SpiAddress)
{
		unsigned char rdata;
		SpiAddress=SpiAddress<<1;      //将地址的低6位放在BYTE的中间
		SpiAddress=SpiAddress | 0x80;  //因为是读数据,所以最高位要置1
		HQCMN=0;	                   //打开片选
		Send(SpiAddress);              //发送一个字节到FM1702
		rdata=rev();                   //接受一个字节
//		Send(0);			           //停止SIP总线
		HQCMN=1;		               //
		return(rdata);
}

/****************************************************************/
//: write_reg */
//: 该函数根据给定的地址写入FM1702SL的寄存器*/
//: 寄存器地址,待写入的值 */
//: N/A*/
/****************************************************************/
void write_reg(unsigned char SpiAddress,unsigned char dat)
{
		SpiAddress=SpiAddress<<1;     //将地址的低6位放在BYTE的中间
		SpiAddress=SpiAddress &0x7f;  //因为是读数据,所以最高位要置0
		HQCMN=0;                      //打开片选
		//HQCDI=0;
		Send(SpiAddress);             //发送一个地址字节到FM1702
		Send(dat);                    //发送一个字节数据到FM1702
		HQCMN=1;					  //关闭片选
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -