标题: 51单片机P2口赋值问题 [打印本页]

作者: jhz931920    时间: 2020-4-21 11:09
标题: 51单片机P2口赋值问题
请教一个问题:

#define motor(x) {p2&=0xf0;p2|=x},这是怎么给P2口赋值的,谢谢!

作者: 一天会    时间: 2020-4-21 11:37
你确定是这个端口吗
作者: 一天会    时间: 2020-4-21 11:37
我觉得这个端口不对吧
作者: jhz931920    时间: 2020-4-21 15:15
主函数中调用motor(x),x=0x01等,该程序是驱动步进电机的,分别给不同相供电
作者: gongnn    时间: 2020-4-21 20:39
这个得结合电路连接了,看似是P2低位四位驱动输出,先清0,再赋值的,如果是那种玩具电机,就逐位为1.
作者: 权威人物    时间: 2020-4-22 11:58
在51中一般你这个是P2端口组,代表这P2^0到P2^7的8个端口,p2&=0xf0,把0xf0转变为二进制为11110000再与P2的8个IO口做位与运算,是把P2^0到P2^3四个IO口赋值为0,P2^4到P2^7端口不变,p2|=x就是将X的值赋值给P2的8个IO,x为1字节=8个比特,每个比特代表一个IO
作者: jhz931920    时间: 2020-4-22 17:21
十分感谢各位回复!谢谢!
作者: 红尘有你    时间: 2020-4-22 19:22
#define motor(x) {p2&=0xf0;p2|=x},
等于
#define motor(x)  {p2=p2&0xf0;p2=p2|x},
p2&0xf0低4位 置0,
作者: 红尘有你    时间: 2020-4-22 22:58
权威人物 发表于 2020-4-22 11:58
在51中一般你这个是P2端口组,代表这P2^0到P2^7的8个端口,p2&=0xf0,把0xf0转变为二进制为11110000再与P2 ...

p2|=x就是将X的值赋值给P2的8个IO,----这一句是有误的。
p2|=x相当:p2=p2|x   p2与x进行或运算再赋值给p2.
作者: jhz931920    时间: 2020-4-23 07:52
@权威人物@红尘有你,二位的解答让我学习了,非常感谢!
作者: wo4fisher    时间: 2020-4-23 10:16
宏定义里前一句,与0xf0求&,是为了给低4位清零,高4位保持原来的值不变,这个是&的逻辑运算特性决定的。下一句是P2口在上一句结果上和输入参数x求或操作。
其实这两句最后的结果应该是在保持高4位不变的情况下,把x的值传入P2口。从而也可以猜出来,x的值低4位有效(有效指的是有可能值是0,也可能非0),而高4位应该是0。如果不是0,会修改P2高4位值,与第一句操作不符。
作者: 银河天地    时间: 2020-4-23 10:49
motor(x) 等效为 {p2=p2&0xf0;p2=p2|x}
作者: jhz931920    时间: 2020-4-23 13:11
银河天地 发表于 2020-4-23 10:49
motor(x) 等效为 {p2=p2&0xf0;p2=p2|x}

假如x分别等于0x09和ox01,P2值各是多少?
作者: 593013535    时间: 2020-4-23 13:33
P2口高四位 为1,带参数的宏定义的话,则P2|=x,即只会对低四位进行操作看具体赋值多少即可。
作者: 和i和i    时间: 2020-4-23 13:36
学习了
作者: 红尘有你    时间: 2020-4-24 11:09
jhz931920 发表于 2020-4-23 13:11
假如x分别等于0x09和ox01,P2值各是多少?

p2=0x09&0xf0   =  0
p2= o|0x09 = 0x09
x=0x01时也是一样。楼主要加强位运算的学习啊
作者: jhz931920    时间: 2020-4-24 16:46
红尘有你 发表于 2020-4-24 11:09
p2=0x09&0xf0   =  0
p2= o|0x09 = 0x09
x=0x01时也是一样。楼主要加强位运算的学习啊

收到!谢谢指导!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1