读IO口电平状态,无论IO口是什么电平,读上来的总位1,为何

2020-02-07 09:42发布

很简单的电路,很简单的程序。
就是读取IO口引脚上输入的电平状态,高电平读出来是1,低电平读出来是0.

使用的是dspic30f6014A的片子,用的PORTD这一组,一共16个IO口,从RD0到RD15。

先初始化IO口为输入方向。

TRISD=0XFFFF;

然后在主程序中while(1)死循环中读取PORTD的状态,因为PORTD是16位,因此用串口分两次发上来看,先发高8位,再发低8位。

while(U1STAbits.TRMT==0){}     //串口发数据
U1TXREG=PORTD>>8;              //发送高8位的电平状态值

while(U1STAbits.TRMT==0){}     //串口发数据
U1TXREG=PORTD&0x00ff;          //发送低8位的电平状态值

但是我连续焊了两块板子,都出现同样的问题,我甚至更好了新的单片机,问题依旧。问题表现是RD8,即高8位的最低位,读上来的总是0,不论该IO口实际输入的电平是高还是低,从串口看总是0。而其余15个IO口的电平从串口发上来均是正确的。

反复确认了硬件,应该没问题,然后看了芯片手册,读IO口的状态就是这样嘛。

不知道到底哪出了问题,怀疑过我使用串口发送数据的程序有问题,这样改过:

先定义:int DI_Status; //开关量输入,整型,16位,正好对应PORTD的16个IO口

然后在主程序中先这样读:

DI_Status=PORTD;

然后:

while(U1STAbits.TRMT==0){}     //串口发数据
U1TXREG=(unsigned char)(DI_Status>>8); //高8位

while(U1STAbits.TRMT==0){}     //串口发数据
U1TXREG=(unsigned char)(DI_Status&0x00ff); //低8位

问题依旧。

然后这样试过,直接读取有问题的RD8的电平状态:

while(U1STAbits.TRMT==0){}     //串口发数据
U1TXREG=PORTDbits.RD8;

问题依旧。

求指导,我通过万用表测量过,当接入RD8的电平发生变化时,RD8引脚上的电平也变化,高对应5V~4.99V,低电平对应0.12V左右。

可是通过串口读上来总为0。 fuck!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
yangxuezhi
2020-02-08 09:43
kevin_me 发表于 2013-12-13 20:49
我已经做了第二版的电路板,跳开了RD8,改用别的组的端口,同样的代码,一切正常。 ...

我是_config里面把JTAGEN_ON 打开了,那几个引脚正好是JTAG的。关掉就ok了。

一周热门 更多>