用过mt8880的大虾给点意见问题是在 “while((mt8880_Status&0x02)!=0x02); //判断数据是否发送完毕”为什么读出SR的B1位总是0呢??是什么原因?多谢各位大虾指教!!!
sbit RW=P2^4; //定义MT8880的引脚sbit
CS=P2^5; D0^D3接在P20^P23
sbit CK=P2^6;
sbit RS=P2^7;
void mt8880_ReadStatus() //读mt8880的状态寄存器
{ P2=0xFF; //先将P2口全置1,才能正确读出P2口的内容
CK=0;
CS=0;
RW=1;
RS=1;
CK=1;
_nop_();
_nop_();
CK=0;
mt8880_Status=P2; //存储读出状态寄存器的数据
RS=0; RW=0; CS=1; CK=0;}
void mt8880_WriteData(uchar SendData) //向mt8880写入一位数据
{ CK=0; CS=0; RS=0; RW=0; CK=1;
_nop_(); P2|=SendData; _nop_();
CK=0; _nop_();
RW=1; RS=1;
CS=1;
CK=0;
}
void mt8880_Initial() //mt8880初始化\RW\CS\CK\RS
{ mt8880_ReadStatus();
CK=0; //写CRA
CS=0; RS=1; RW=0; CK=1; _nop_(); P2&=0xf0; _nop_(); _nop_(); CK=0; short_delay();
RW=0; //写CRA CK=1; _nop_(); P2&=0xf0; _nop_(); CK=0; short_delay(); RW=0; //8写入控制寄存器A,下一周期写入控制寄存器B CK=1; _nop_(); P2&=0xf0;
P2|=0x08;
_nop_(); CK=0; short_delay(); CK=1;
P2&=0xf0; //写CRB _nop_(); CK=0; short_delay();
mt8880_ReadStatus(); CK=0;
CS=1;
}
void mt8880_Dial() //拨号子程序
{ unsigned char tel,i;
unsigned char array[8]={1,4,7,1} ;
CK=0; CS=0; RS=1; RW=0; CK=1; _nop_();
P2&=0xFD; //置mt8880为DTMF模式和中断模式
_nop_(); CK=0; _nop_(); _nop_(); CK=1; _nop_();
P2&=0xF0; //写CRB设置为突发模式
_nop_(); CK=0; _nop_();
SW_MAIN=1; //模拟摘机
tel=array[0]; //取预制电话号码
for(i=0;i <=7;i++)
{ mt8880_WriteData(tel);
mt8880_ReadStatus();
Display(mt8880_Status);
while((mt8880_Status&0x02)!=0x02); //判断数据是否发送完毕
i++; tel=array[i]; //取下一位电话号码
}
}