📄 demo-ptr.c
字号:
// POINTERS AND INDEXED TABLES
#pragma chip PIC18C252
char tab1[10];
char tab2[10];
bank2 uns24 tu2[10];
bank3 uns24 tu3[10];
uns24 *px;
void pointers( void)
{
// p1 is 8 bit wide
char *p1 = tab1;
char s = 0;
do
s += *p1 & 3;
while (++p1 < &tab1[10]);
// px is 16 bit wide because it can access elements from 2 banks
px = tu2;
px = &tu3[9];
uns24 e = *px;
// low level pointer access
FSR0 = &tab1[1];
FSR1 = &tab2[0];
char a = 10-1;
do {
POSTINC0 = POSTINC1; // *FSR0++ = *FSR1++;
} while (--a > 0);
char *px, i;
i = *px;
i = *FSR0; // MOVFF INDF0,i
i = *FSR0++; // MOVFF POSTINC0,i
i = *FSR0--; // MOVFF POSTDEC0,i
i = *++FSR0; // MOVFF PREINC0,i
i = *--FSR0; // MOVF POSTDEC0,W,0 , MOVFF INDF0,i
}
typedef struct {
uns16 ab;
struct {
uns8 l1;
uns8 l2;
} vx;
} Txx;
Txx ax, bx[2], *pxx;
void sub( void)
{
pxx = &ax;
ax.ab = 1000;
pxx->vx.l1 = 3;
pxx = &bx[0];
pxx->ab = 0;
pxx ++;
pxx->vx.l2 = 0;
}
/* An array that need to cross page boundaries can optionally be
assigned a specific start address. This start address is only
required when the array is less than 257 bytes and need to cross
a 256 byte boundary. */
uns16 large[256] @ 0x400; // bank 4 and 5
size2 uns16 *lp;
uns16 sub2( void)
{
if (++lp >= &large[256])
lp = &large[0];
return *lp;
}
uns16 sub3( void)
{
return *lp;
}
void main(void)
{
pointers();
sub();
lp = &large[0];
uns16 z = sub2();
z += sub3();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -