ARM求教

[复制链接]
1215|9
 楼主| hegawell 发表于 2015-1-16 14:41 | 显示全部楼层 |阅读模式
一个0-63的十进制数,例如31写成六位二进制为011111,六个bit分别控制p0.4,p0.5,p0.7,p0.8,p0.9,p0.10的GPIO输出电平,keil代码该如何编写?
pb1005 发表于 2015-1-16 21:13 | 显示全部楼层
这个是51单片机吗,是ARM吗?
icekoor 发表于 2015-1-16 23:08 | 显示全部楼层
抛砖引玉
unsigned char a = 0x31;
p0.4 = a & 0x01;
p0.5 = (a>>1) & 0x01;
p0.7 = (a>>2) & 0x01;
p0.8 = (a>>3) & 0x01;
p0.9 = (a>>4) & 0x01;
p0.10 = (a>>5) & 0x01;
江陵龙少 发表于 2015-1-17 10:43 来自手机 | 显示全部楼层
楼主的问题很典型,不能以解决问题而结束,而应该形成编程思想,
首先,不管是arm还是单片机都会涉及到对gpio比特位的读写,
其次,对gpio有读和写2种操作,
第三,对于具体的单片机或arm,读写gpio口的方式会有不同,比如单片机可位寻址,对于stm 32有比特位带法,对于nxp的arm一个gpio口组(16个比特),至少对应3个不同功能的寄存器来控制它,一个写1置位,写0无影响;一个写1置0,写0无影响,还有一个状态寄存器,只读。
最后,由于不同器件操作不同,对于某个特定器件,应该以宏定义形成头文件方式,供调用,形成一劳永逸。
说得有点多了,呵呵!
江陵龙少 发表于 2015-1-17 10:45 来自手机 | 显示全部楼层
思想决定高度!
永远在路上 发表于 2015-1-17 22:55 | 显示全部楼层
我认为:若是ARM(如ARM9),则一般不可位操作吧。一般是由一组GPIO端口控制。则需要GPxCON,GPXDAT,GPXUP三个寄存器控制,尤其是前两个。若控制输出,则至少先让对应引脚的GPxCON的对应两位为01,再使GPxDAT的相应位与你要输出的二进制位值相等即可。单片机端口就没这么麻烦了。
ningling_21 发表于 2015-1-20 09:51 | 显示全部楼层
不连续的位只能分开来操作,不能同时
ayb_ice 发表于 2015-1-20 10:29 | 显示全部楼层
这都不会吗
prettyxp 发表于 2015-1-21 11:56 | 显示全部楼层
本帖最后由 prettyxp 于 2015-1-21 12:03 编辑

GPIO0_DATA = ((0x31 & 0x3) | ((0x31 & 0xc) << 1) << 4);
写那么多代码,占空间呀!
prettyxp 发表于 2015-1-21 11:57 | 显示全部楼层
本帖最后由 prettyxp 于 2015-1-21 12:04 编辑

GPIO0_DATA |=((0x31 & 0x3) | ((0x31 & 0xc) << 1) << 4);
完美一点是这样写法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部