|
发表于 2008-7-18 11:25:09
|
显示全部楼层
代码例子:
#include <avr/io.h>
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
int main(void)
{
unsigned char chValue = 0x00;
unsigned char i=0;
DDRA=0xFF;
for(i=0;i<10;i++)
{
(*(BYTEBIT *)(&chValue)).BIT0 = 1;
chValue=chValue+PINA;
PORTA=chValue;
}
return(TRUE);
}
汇编成机器指令(部分代码):
17: unsigned char chValue = 0x00;
+00000053: 8219 STD Y+1,R1 Store indirect with displacement
20: DDRA=0xFF;
+00000054: EF8F SER R24 Set Register
+00000055: BB8A OUT 0x1A,R24 Out to I/O location
+00000056: E020 LDI R18,0x00 Load immediate
25: (*(BYTEBIT *)(&chValue)).BIT0 = 1;
+00000057: 8199 LDD R25,Y+1 Load indirect with displacement
+00000058: 6091 ORI R25,0x01 Logical OR with immediate
+00000059: 8399 STD Y+1,R25 Store indirect with displacement
27: chValue=chValue+PINA;
+0000005A: B389 IN R24,0x19 In from I/O location
+0000005B: 0F89 ADD R24,R25 Add without carry
+0000005C: 8389 STD Y+1,R24 Store indirect with displacement
29: PORTA=chValue;
+0000005D: BB8B OUT 0x1B,R24 Out to I/O location
22: for(i=0;i<10;i++)
+0000005E: 5F2F SUBI R18,0xFF Subtract immediate
+0000005F: 302A CPI R18,0x0A Compare with immediate
+00000060: F7B1 BRNE PC-0x09 Branch if not equal
32: }
+00000058使用了逻辑或,操作很正常啊! |
|