最近翻译一段汇编程序,使用的c8051f505
单片机,与
FPGA之间是地址数据总线通讯,通过中断在地址中读取数据,汇编程序能顺利跑起来,我翻译成c后发现进入中断怎么也读取不到地址的数据,求大神指点,汇编代码如下:
LJMP MAIN
ORG 000BH
LJMP A1CDF
ORG 001BH
LJMP A1CC8
MAIN:
ANL PCA0MD, #0BFh
MOV SFRPAGE, #CONFIG_PAGE
MOV OSCICN, #0C5H
MOV P0SKIP, #03H
MOV P1SKIP , #0E0H
MOV 0, #00H ;交叉开关使能
MOV XBR1, #0C0H
MOV XBR2, #040H
MOV P2MDIN, #0FH ;端口配置,P0开漏,p1,P4口为推挽输出
MOV P1MDOUT, #0E7H
MOV P2MDOUT, #0FH
MOV P3MDOUT, #0FFH ;P0-p4端口为数字输入,p2四位模拟输入端口
MOV P4MDOUT, #0FFH
MOV EMI0CF, #09H
MOV EMI0TC, #045H
MOV SFRPAGE, #AC
tiVE_PAGE ;外部储存器设置
CLR P1.1
LCALL A1D30
CLR P1.0 ;15530主复位
CLR P1.4 ;开接收
SETB EA ;清中断屏蔽位,开CPU中断
A1CC8: PUSH DPL ;接收中断服务子程(T1中断)
PUSH DPH
PUSH ACC
MOV DPTR,#02001H
MOVX A,@DPTR
JB B.0,A1D19
MOV RMSB,A
MOV COM_DATA,#00H
;SETB P2.1
JNB P1.3,A1D1D
MOV COM_DATA,#0FFH
A1D1D: SETB B.0
SJMP LP5
A1D19: MOV RLSB,A
SETB B.3
SJMP LP5
翻译成c后
#include
#include // SFR declarations
#include
void Oscillator_Init(void)
{
SFRPAGE = CONFIG_PAGE;
OSCICN = 0xC5;
SFRPAGE = ACTIVE_PAGE;
}
//定时器初始化//A1D30
void Timer_Init(void)
{
ET0=1;
ET1=1;
TR0=1;
TR1=1;
TMOD=0x66;
TL0=0xF8;
TH0=0xF8;
TL1=0xF8;
TH1=0xF8;
}
void EMI_IN(void)
{
SFRPAG=CONFIG_PAGE;
EMI0CF = 0x09; //配置EMIF端口复用方式,带块选择的分片方式,<4k用内存,>4k用外存
EMI0TC = 0x45; //最小地址建立时间、最大保持时间。原值55H
SFRPAGE=ACTIVE_PAGE ;
}
void Port_IO_Init(void)
{
SFRPAGE = CONFIG_PAGE;
P0SKIP = 0x03; // Skip P0.0 and P0.1
P1SKIP = 0xE0;
XBR0 = 0x00;
XBR1 = 0xC0; //T2、T1、T0连接到端口引脚
XBR2 = 0x40; //使能交叉开关
P2MDIN = 0x0F; //设置P2口没有模拟输入
P1MDOUT = 0xE7; //推挽输出带负载能力强
P2MDOUT = 0x0F;
P3MDOUT = 0xFF;
P4MDOUT = 0xFF;
SFRPAGE=ACTIVE_PAGE ;
}
INTERRUPT(TIMER1_ISR, INTERRUPT_TIMER1)
{
if(BB0)
{
RLSB=XBYTE[0X2001];
BB3=1;
}
else
{
RMSB=XBYTE[0X2001];
COM_DATA=0x00;
if(P13==0)BB0=1;
else
{
COM_DATA=0xff;
BB0=1;
}
}
}
在c中RMSB=XBYTE[0X2001]这句有没有啥问题?没读取到数,复用地址数据总线