关于位寻址的问题

liuconghan 2010-12-11 02:57:15
我用的是 C8051f020单片机。由于其P4~7口只能直接寻址,无法位寻址。现在由于要用到高位端口做液晶显示的数据端口。我该如何我该如何对这些高端口的每一位进行位操作呢?望各位高人指点一下?问分感谢!
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuconghan 2010-12-11
  • 打赏
  • 举报
回复
我还想问问像我那样的宏定义可以吗?能不能像“#define DB P1” 这种把P5口的三位和P6口五位也用宏定义成一个类似比如像“#define DB P5&P6”,能这样定义吗?如果不行该怎么定义?
zyzhang365 2010-12-11
  • 打赏
  • 举报
回复
液晶操作应该还有个R/W同步信号,即使你按位操作应该也是可以的。

P6 &= ~(0x1F);
P6 |= (data & 0x1F); // 设置低5 bits

P5 &= ~(0xE0);
P5 |= (data & 0xE0); // 设置高3 bits

liuconghan 2010-12-11
  • 打赏
  • 举报
回复
谢谢解答!我现在是用P5口的三位和P6口的五位来做液晶显示的8位数据位。还有一些控制位也是高位端口的。因为在给数据位写数据的话不可能一位一位的读写,我想合并成一个8位数据位。我用的是宏定义
#define DB0 P6 &=0x10
#define DB1 P6 &=0x08
#define DB2 P6 &=0x04
#define DB3 P6 &=0x02
#define DB4 P6 &=0x01
#define DB5 P5 &=0x80
#define DB6 P5 &=0x40
#define DB7 P5 &=0x20
#define DB ???//该怎么写(合并成八位)
不知道以上用法行不行?还请指教,谢谢
zyzhang365 2010-12-11
  • 打赏
  • 举报
回复
输入就更简单了,读入端口值,判断需要的位就可以了。

if(Px & (0x01 << y))就可以判断第y位是否为‘1’了。
liuconghan 2010-12-11
  • 打赏
  • 举报
回复
谢谢了!但是如果该位是数字输入,它的值是事先不知道,是由外设决定。这样的话我想问的是否能像低端接口就是定义该位而不给其置位。就是的把某一位独立出来,不知道是否能设置?该怎么设置?谢谢
zyzhang365 2010-12-11
  • 打赏
  • 举报
回复
Px &=~(0x01<< y), 将port或变量的第y清‘0’,其余位不变;
Px |=(0x01 << y),将端口或变量的第y位置‘1’,其余位不变。

使用同样的方法可以同时操作多位。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧