读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!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
kevin_me
1楼-- · 2020-02-07 12:49
顶一下,各位早上好。请关注。谢谢!
kevin_me
2楼-- · 2020-02-07 15:11
大家有遇到过这样的问题吗?再来顶个帖
jswd0810
3楼-- · 2020-02-07 17:10
是否其它地方重新定义了该引脚的功能?
leolong03
4楼-- · 2020-02-07 21:17
在线debug看看,RD8并无特殊功能啊
cooleryou
5楼-- · 2020-02-07 23:34
 精彩回答 2  元偷偷看……
xinbihui
6楼-- · 2020-02-07 23:44
要把相应口上的模拟量输入功能关了就好了

一周热门 更多>