现以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管脚接电源又该如何呢???
|
|
文章评论(0条评论)
登录后参与讨论