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

PIC单片机C与汇编混合编程之模拟SPI接口发送数据

PIC单片机C与汇编混合编程之模拟SPI接口发送数据

#include <htc.h>
#define _XTAL_FREQ 4000000

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


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


#define bDAT 1
#define bRCK 2
#define bCLK 0

unsigned char buf;
unsigned char temp;


/*************************
时序CLK的脉宽>=10us
发送顺序:MSB->LSB
*************************/
void SPI_SendByte(void)
{

#asm

MOVLW
8

MOVWF
_temp
Clock:

NOP

NOP

NOP

NOP

NOP

bcf
_GPIO,bCLK
//1us

btfss
_buf, 7
//1us

GOTO
ClearBit
//1/2us
SetBit:

NOP


bsf
_GPIO, bDAT
//第5us,DAT=1

GOTO
SetupOver
//5+2= 7us
ClearBit:

bcf
_GPIO, bDAT
//1+1+1+2+1 = 5us

NOP

NOP
//7us
SetupOver:

NOP

NOP

NOP
//10us

bsf
_GPIO, bCLK

RLF
_buf, f

decfsz
_temp, f

GOTO
Clock

NOP

NOP

NOP

NOP

NOP

NOP

NOP

bcf
_GPIO, bCLK

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

#endasm
}


int main(void)
{

TRISGPIO = 0xf8;
//1111 1000

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

CLK = 0;

RCK = 0;

DAT = 0;



while(1)


{


RCK = 1;

buf = 0x81;

SPI_SendByte();


buf = 0x55;

SPI_SendByte();


buf = 0x06;

SPI_SendByte();


buf = 0x06;

SPI_SendByte();


buf = 0x6a;

SPI_SendByte();


buf = 0x6d;
//5

SPI_SendByte();


buf = 0x6f; //9

SPI_SendByte();


buf = 0x55;

SPI_SendByte();


RCK = 0;

__delay_us(50);

}

return 0;
}
返回列表