51单片机C语言里有读引脚和读锁存器之分吗?这个P1 = P1 || 5; 请问这个读的是锁存器还是引脚?

还有io口在用C编程时 作为输入口时需要写1吗?我知道汇编是需要写1的,据说C的时候编译器自动写1,那如果这样的话c语言里IO口输入输出如何被分别的呢??怎么看出来这个口是输出口或者是输入口?最好用C语言解释TKS

1.读引脚是通过读锁存器的值来读取的
2.这不是读语句,是改变P1口的状态(P1=1),使P1.0输出高电平。
3.需要写1的,C编程不会自动写1是复位后,I/O自动被置位高电平。
4.分辨一个端口是输入或者输出,是根据读这个端口(作为输入),或这写这个端口(输出口)来区分的。
如P1=0x08;P1做输出,
a=P1; P1做输入口追问

P1 = P1 | 5;这个呢?是读锁存器还是读引脚?在C语言里怎么区分
、? 还有你回答的第一个貌似不对啊,引脚和锁存器是不同的啊

追答

P1=P1|5相当于汇编的ORL P1,#05h。意思是5或到P1寄存器,不存在读寄存器和引脚
引脚是硬件电路,单片机读的是引脚的装态,是通过读相应端口寄存器的位来实现的。
汇编 mov C,P1.0;
在C51里读引脚的值是下面方法读的,
sbit p10=P1^0; //位定义p10代替P1.0口
if(p10==0) //读P1.0口的值
p10=1; //写P1.0口的值

追问

P1 = P1 | 5;a=P0; a = P1 | 5;分别是读引脚还是读锁存器啊,我还是没搞懂,你看第一位的回答,而且书上明确说读分读引脚和读锁存器的

追答

P1 = P1 | 5;写锁存器,
a=P0;读锁存器
a = P1 | 5;读锁存器
在C里直接读引脚只能按我上面说的那么样做,也就是先要把该引脚定义出来,才能进行读写操作。否测都是对锁存器进行操作的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-04
51单片机的通用io一般都是双向的,就是没有寄存器控制io口是作为输入还是输出(事实上这很危险,如果某一个io外接电源,而在程序中让此io口置低,则可能引起引脚的短路)。不像arm有gpio,可以规定是输入还是输出。所以某个引脚的功能完全由编程者决定,硬件只会直接按你的语句对io口置位。
方式和汇编一样,最好开始全部置1,安全。
第2个回答  推荐于2018-03-28
“P1 = P1 || 5;”
应该是P1 = P1 | 5;,如果编译成ANL指令的话就是读锁存器。

“据说C的时候编译器自动写1”
谣言。追问

ANL是读锁存器,但是我这现在是C语言啊 ,到底是读的是锁存器还是引脚呢??P1 = P1 | 5;这个。或者比如a = P1 | 5;读的是引脚还是锁存器

追答

要看编译器编译出的是什么玩意儿。C不是汇编,究竟是读引脚还是读锁存器应当以汇编为准。

另外犯了个低级错误:应当是ORL指令。

P1 = P1 | 5在Keil PK51中编译出来是ORL P1,#0x05,是读锁存器,但并不代表所有编译器都是相同的编译结果。因此不能断言说C语言的什么什么就一定是读引脚或读锁存。C语言毕竟只是个中间商。

追问

光看C语言看不出来嘛?怎么可能呢?那我用C语言处理问题的时候我不知道是读的是引脚或者是锁存器那还怎么设计呢?

追答

只能以锁定编译器的前提下进行设计。
尤其对于嵌入式而言,正规的C语言程序开头都要声明“编译环境”的。
给你个典型的程序说明吧:

程序名称 Name of the project
版本 Version
作者 Author
功能说明 Functional Description
硬件平台 Hardware Platform
编译环境 Build Environment
变更记录 Changelog
....

追问

那P1 = P1 | 5;a=P0; a = P1 | 5;这几个分别是读引脚还是读锁存器呢?我用的是KEIL编译器

追答

看看反汇编结果不就知道了。
P1 = P1 | 5;编译为ORL P1(0x90),#0x05
读锁存器

a = P0;编译为MOV R7,P0(0x80)
读引脚

a = P1 | 5;编译为
MOV A,P1(0x90)
ORL A,#0x05
MOV R7,A
读引脚

这也是很多教材上的结论,说第一种写法编译成读引脚而存在隐患、建议按第三种写法。

本回答被提问者和网友采纳

51单片机C语言里有读引脚和读锁存器之分吗?这个P1 = P1 || 5; 请问...
1.读引脚是通过读锁存器的值来读取的 2.这不是读语句,是改变P1口的状态(P1=1),使P1.0输出高电平。3.需要写1的,C编程不会自动写1是复位后,I\/O自动被置位高电平。4.分辨一个端口是输入或者输出,是根据读这个端口(作为输入),或这写这个端口(输出口)来区分的。如P1=0x08;P1做...

51单片机读引脚与读锁存器的问题
51单片机的P1读的是引脚上的电平 即使你把io口置位 也可能被外部电路拉低 所以有没有外设读到的电平可能会不一样 因为51单片机io口没有三态 所以读io口时要先将io口置位

关于单片机P1口读所存器与读引脚!
楼主没有弄清楚,标准51单片机IO脚采用准双向口,引脚输入是没有锁存的,只有输出是带锁存器,在设置P1口为高电平时,P1实际上既可以作为高电平输出,也可以作为输入(这要求外部源有足够的驱动能力,至少能够吸收1mA电流),所以MOV A,P1就是一次读8个引脚, maxiurui说的逻辑指令可以一次读一个引脚...

...作为输入口使用时,为什么要区分" 读引脚" 和"读锁存器"
不光是P0口,标准51单片机的所有IO口都有“读引脚”和“读锁存器”的问题。其实这类问题也很好解释,自己去看看51单片机的IO脚框图就豁然开朗了。读引脚的意思就是直接读P0外部引脚的电位,而读端口(锁存器)读的是内部与数据总线链接的锁存器的电位。一般来说,读取P0的数据,都是读引脚,目的是...

51的并行io口信息有两种读取方法
读引脚,读锁存器。1、读引脚:是直接读取并行IO口的电平状态。2、读锁存器:是读取并行IO口锁存器的状态,在51单片机中,并行IO口需要外接上拉电阻,读取锁存器的状态可以避免因输入信号不稳定而导致的错误读取。

c51中读引脚和读锁存器的指令分别是什么
1”,也即是对P0锁存器写0xff,再读引脚值。可是这样跟前面时刻输出的0xf0不就冲突了吗?回答: 对P0写1,实际上产生的动作就是 将P0口与外围电路断开。理解这一点就行了。至于你要不要写1,就看你想读取什么条件下的值了(你想断开还是不想断开)。希望我的回答能对你有所帮助。

51单片机 读引脚与读锁存器的问题
P1口有上拉,读的时候就会直接读到上拉的点,接了外设,由于外设的原因造成端口被拉低,读取的时候就会读到低电平。如果外设的接口也是高电平,那就是高电平。

有关单片机读端口、读引脚的问题
我有更好的答案推荐于2017-12-16 12:45:49 最佳答案 80C51单片机有P0-P3四个P口,以P0为例说明:要搞清这个问题,就要明白p0口的内部结构。P0口是由锁存器经两个驱动场效应管和外部引脚相连的。读引脚的意思就是直接读P0外部引脚的电位,而读端口(锁存器)读的是内部与数据总线链接的锁存器的电位。两者不...

89C51单片机中度端口锁存器和“读引脚”有何不同?各使用那种指令?
单片机的引脚,输出了数据后,其电压,受到外接电路的影响,会发生改变。读引脚,和读锁存器,数值,就不一定相同。读引脚:MOV A, P1 读锁存:ORL P1, #0FH. 这是"读改写"指令。

89C51单片机中度端口锁存器和“读引脚”有何不同
设计就是读锁存器的,况且读引脚容易引起误判,例如当你在读取的时候有个输入信号来了刚好在判断高低电平的中间,那怎么判?

相似回答