现以P2端口测试为例:
/*------------------------------------
P2端口测试
主要测试管脚接电源或地及相临管脚的短路
-------------------------------------*/
unsigned char Port2Test(void)
{
unsigned char testval;
P2 = 0x55;//奇数管脚发低电平
_nop_();//延时
testval = P2 ^ 0x55;//比较发送及接收结果
P2 = 0xaa;//偶数管脚发低电平
_nop_();//延时
testval |= P2 ^ 0xaa;//比较发送及接收结果(2次的)
P2 = 0xff;//释放P1口,防止外部接入电源
return testval;//测试成功返回0
}
技术解析:
由于51的IO地址不能间接寻址,故直接寻址逼迫写出不同的测试函数PortXTest().
对于每个IO口的8个IO管脚,发送0x55或0xaa实际就是测试相邻管脚或任意管脚(见我其他相关程序)的短接情况.
1) P2 = 0x55;//奇数管脚发低电平
即奇数管脚为输出,偶数管脚为输入.
如果某一奇数管脚与某一偶数管脚短接时,就如同键扫描一样,偶数管脚接收
到高电平时,表示"无键压下"即奇数管脚肯定没与偶数管脚短接!!!
但一旦收到低电平时,问题就复杂了.
若P2口用于外接RAM的地址总线时,P2肯定为输出.故判定地址总线错误.
2) _nop_();//延时
相当与"键盘消抖"...
3) testval = P2 ^ 0x55;//比较发送及接收结果
在1)中,P2口发送的是0x55,那么接收回来的应该也是0x55.则0x55 ^ 0x55 == 0x00.
若出错,则P2 ^ 0x55的结果testval肯定非零.
4) P2 = 0xaa;//偶数管脚发低电平
由于1)~3)只测试了偶数管脚,必须再测试奇数管脚.
测试奇数管脚当然是偶数管脚发低电平了.
5) testval |= P2 ^ 0xaa;//比较发送及接收结果(2次的)
同3)但合并了2次结果.
既testval非零必错!!!
深度探索:
在各IO测试程序中,IO管脚接地出错很好理解---就认为是"有键压下"!!!
但IO管脚接电源又该如何呢???
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。