首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

PIC单片机C语言与汇编混合编程之模拟SPI接口接收数据

PIC单片机C语言与汇编混合编程之模拟SPI接口接收数据

#include <htc.h>
//#include <pic12f509.h>
#define _XTAL_FREQ 4000000

__IDLOC(1234);
__CONFIG(OSC_IntRC & WDT_OFF & CP_OFF & MCLRE_ON);

#define bRCK
2
//GP2
#define bCLK
4
//GP4
#define bDAT
0
//GP0
#define bSDn
5
//GP5, SD-
#define bSDp
1
//GP1, SD+
#define bC   
0
#define bZ
2


volatile bit DAT        @ ((unsigned)&GPIO*8)+0;
volatile bit SDp        @ ((unsigned)&GPIO*8)+1;
volatile bit RCK        @ ((unsigned)&GPIO*8)+2;
volatile bit CLK        @ ((unsigned)&GPIO*8)+4;
volatile bit SDn        @ ((unsigned)&GPIO*8)+5;

unsigned char temp1,temp2;
unsigned char buf;
unsigned char byte[8];


void ClearAllBuffer(void)
{

byte[0]=0x00;

byte[1]=0x00;

byte[2]=0x00;

byte[3]=0x00;

byte[4]=0x00;

byte[5]=0x00;

byte[6]=0x00;

byte[7]=0x00;
}

void SystemInit(void)
{


TRISGPIO = 0xdd; //1101 1101

#asm

bcf
_GPIO, bSDp  //SD+ = 0

bsf
_GPIO, bSDn
//SD- = 1;

#endasm

OPTION = 0x82;
//Time0时钟分频比为1:8
}

/********************************************
接收8 byte数据
使用全局变量情况:

temp1, buf, byte[]
********************************************/
void ReceiveData(void)
{

#asm

MOVLW   8

  
MOVWF   _temp2

MOVLW
_byte+7
//取数组名byte表示的立即数即为取数组地址,不能使用movf _byte+7, W

MOVWF
_FSR  
//FSR=&byte[7]

btfss
_GPIO, bRCK

GOTO
NoData

ReceiveByte:

MOVLW   8

  
MOVWF   _temp1


CLRF
_buf
//1+1+1 = 3us
      
CheckLowLevel:


BTFSC
_GPIO, bCLK


GOTO
CheckLowLevel
CheckRiseEdge:


BTFSS
_GPIO, bCLK


GOTO
CheckRiseEdge  

bcf
_STATUS,bC
   
BTFSC   _GPIO, bDAT

   
bsf
_STATUS,bC

RLF     _buf, f

   
DECFSZ
_temp1, f
// 1+1+1+1+1 = 5us

GOTO   
CheckLowLevel
// 2us

MOVF
_buf,W

MOVWF
_INDF

DECF
_FSR,f

decfsz
_temp2

GOTO
ReceiveByte
// 1+1+1+1+1+1+1+2 = 9us
NoData:

#endasm
}

int main(void)
{

SystemInit();

while(1)

{

ReceiveData();


if((byte[7]==0x81)&&(byte[5]==0x06)&&(byte[4]==0x06))

{

#asm

bsf
_GPIO, bSDp


bcf
_GPIO, bSDn


#endasm


__delay_ms(5);

#asm

bcf
_GPIO, bSDp


bsf
_GPIO, bSDn


#endasm


__delay_ms(5);



}else{

#asm

bcf
_GPIO, bSDp


bsf
_GPIO, bSDn


#endasm


}

ClearAllBuffer();

}

return 0;
}
返回列表