PIC单片机C语言与汇编混合编程之模拟SPI接口接收数据
- UID
- 852722
|
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;
} |
|
|
|
|
|