|
楼主 |
发表于 2013-1-18 00:40:07
|
显示全部楼层
#include <avr/io.h>
#include "iolgt8f0xa.h"
#define nIRQ PA0 //JRF模块 中断信号,平时为高电平
#define SDN PA1 //JRF模块 芯片关断模式输入(高电平有效)
#define nSEL PA2 //JRF模块 SPI 片选输入(低电平有效)
#define SCK PA3 //JRF模块 SPI 串口时钟输入
#define SDI PA4 //JRF模块 SPI 串口数据输入
#define SDO PA5 //JRF模块 SPI 串口数据输出
#define Test PA7 //
void usDelay(unsigned int dat)
{
while(dat>0){
dat--;
//asm("nop");//--这里取消与不取消,查看反汇编代码对比一下
}
}
void write_spi(unsigned char dat)
{ //write data into the SPI register
unsigned int i;
PORTA &=~_BV(SCK);//SCLK==0;
for (i=0;i<8;i++)
{
if ((dat & 0x80)==0x80) //判断发送0或发送1
{
PORTA |=_BV(SDI);//SDI==1;
}
else
{
PORTA &=~_BV(SDI);//SDI==0;
}
usDelay(10);
PORTA |=_BV(SCK);//SCLK==1;
dat <<= 1;
usDelay(10);
PORTA &=~_BV(SCK);//SCLK==0;
usDelay(10);
}
}
void MCU_Init(void)
{
DDRA=0xde;
PORTA=0x21;
}
int main(void)
{
MCU_Init();
write_spi(0x55);
while(1)
{
;
}
}
以上代码编译后的反汇编代码如下(已经没有了延时函数的存在):
--- LGT_Test3.c ----------------------------------------------------------------------------------
24: }
+0000004A: 9508 RET Subroutine return
@0000004B: write_spi
27: { //write data into the SPI register
+0000004B: 9813 CBI 0x02,3 Clear bit in I/O register
+0000004C: E020 LDI R18,0x00 Load immediate
+0000004D: E030 LDI R19,0x00 Load immediate
34: if ((dat & 0x80)==0x80) //判断发送0或发送1
+0000004E: FF87 SBRS R24,7 Skip if bit in register set
+0000004F: C002 RJMP PC+0x0003 Relative jump
36: PORTA |=_BV(SDI);//SDI==1;
+00000050: 9A14 SBI 0x02,4 Set bit in I/O register
+00000051: C001 RJMP PC+0x0002 Relative jump
40: PORTA &=~_BV(SDI);//SDI==0;
+00000052: 9814 CBI 0x02,4 Clear bit in I/O register
44: PORTA |=_BV(SCK);//SCLK==1;
+00000053: 9A13 SBI 0x02,3 Set bit in I/O register
48: PORTA &=~_BV(SCK);//SCLK==0;
+00000054: 9813 CBI 0x02,3 Clear bit in I/O register
32: for (i=0;i<8;i++)
+00000055: 5F2F SUBI R18,0xFF Subtract immediate
+00000056: 4F3F SBCI R19,0xFF Subtract immediate with carry
+00000057: 3028 CPI R18,0x08 Compare with immediate
+00000058: 0531 CPC R19,R1 Compare with carry
+00000059: F011 BREQ PC+0x03 Branch if equal
46: dat <<= 1;
+0000005A: 0F88 LSL R24 Logical Shift Left
+0000005B: CFF2 RJMP PC-0x000D Relative jump
+0000005C: 9508 RET Subroutine return
55: DDRA=0xde;
+0000005D: ED8E LDI R24,0xDE Load immediate
+0000005E: B981 OUT 0x01,R24 Out to I/O location
56: PORTA=0x21;
+0000005F: E281 LDI R24,0x21 Load immediate
+00000060: B982 OUT 0x02,R24 Out to I/O location
57: }
+00000061: 9508 RET Subroutine return
@00000062: main
59: {
+00000062: ED8E LDI R24,0xDE Load immediate
+00000063: B981 OUT 0x01,R24 Out to I/O location
56: PORTA=0x21;
+00000064: E281 LDI R24,0x21 Load immediate
+00000065: B982 OUT 0x02,R24 Out to I/O location
61: write_spi(0x55);
+00000066: E585 LDI R24,0x55 Load immediate
+00000067: 940E004B CALL 0x0000004B Call subroutine
+00000069: CFFF RJMP PC-0x0000 Relative jump
61: write_spi(0x55);
+0000006A: 94F8 CLI Global Interrupt Disable
+0000006B: CFFF RJMP PC-0x0000 Relative jump |
|