|
硬件平台为C8051F120
这段程序作用是将P1,P2口输入的值所对应的数组数加1,P1,P2是一个12位数,输入引脚经过特别选择以使得P1,P2口的值能刚好直接用于DPTR指针。
VPU是一个2字节数来自P1,P2,SPE[4096]是一个4字节数的数组,共4096个数。
C语言为:
SPE[VPU]++; //对应数组中数加1
本人写的代码,有问题敬请指正,这些代码如何嵌入进C程序中,是否需要补充些东西,编译软件为uvision4,我在加上#pragma asm和#pragma endasm写入硬件仿真后运行立即失去响应并且PC软件崩溃。
INC32INT:
MOV DPH,P1
MOV DPL,P2 //装入数组地址指针
MOVX A,@DPTR //从地址装入31-24位
MOV R4,A
INC DPTR
MOVX A,@DPTR //从地址装入23-16位
MOV R5,A
INC DPTR
MOVX A,@DPTR //从地址装入15-8位
MOV R6,A
INC DPTR
MOVX A,@DPTR //从地址装入7-0位
INC A //7-0位加1
MOV R7,A //自加后7-0位装入R7,使得R4,R5,R6,R7组成一个32位数
JC INC16 //检查是否进位,进位则跳转搭配8-15位加1
MOV A,R7 //此时DPTR在7-0位的地址
MOVX @DPTR,A //外部RAM装入7-0位
MOV DPH,P1 //重装地址指针到31-24位
MOV DPL,P2
MOV A,R4
MOVX @DPTR,A //31-24
MOV A,R5
INC DPTR
MOVX @DPTR,A //23-16
MOV A,R6
INC DPTR
MOVX @DPTR,A //15-8
INC16: //8-15位数加1
CLR C
INC R6
JC INC24 //检查是否进位。进位则跳转到16-23位
RET
INC24: //16-23位数加1
CLR C
INC R5
JC INC32 //检查是否进位。进位则跳转到24-31位
RET
INC32: //24-31位数加1
CLR C
INC R4
RET //32位数还溢出?HOW TERRIBLE!!!!
|
|