打印

求教IO口 指针

[复制链接]
3177|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lk0623|  楼主 | 2011-6-11 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人对指针不是很了解,望大家赐教:
比如说下面这个函数里的IO口(OUT_IO_RXD和OUT_IO_TXD  )想用指针来代替
sbit RS232_1_TXD_OUT = P3^4;
sbit RS232_1_RXD_OUT = P3^5;

调用: Select_Channel_1_8_OUT(temp[1],RS232_2_RXD_OUT,RS232_2_TXD_OUT);   

函数是:void  Select_Channel_1_8_OUT(uchar Channel, uchar OUT_IO_RXD,uchar OUT_IO_TXD  )
{
switch(Channel)
  {
   case RS232_1_IN:          //RS232 1号进
      RS232_1_TXD_IN   = OUT_IO_RXD;  //IO口赋值
      OUT_IO_TXD = RS232_1_RXD_IN;
      break;
  }
}

貌似原先的写法RS232_1_TXD_IN   = OUT_IO_RXD;这句可以赋值
但是OUT_IO_TXD = RS232_1_RXD_IN;赋值不了...
想尝试用指针看看

相关帖子

沙发
lk0623|  楼主 | 2011-6-11 20:22 | 只看该作者
补充下 :
sbit RS232_1_TXD_IN  = P1^6;
sbit RS232_1_RXD_IN  = P1^7;

使用特权

评论回复
板凳
123jj| | 2011-6-12 10:15 | 只看该作者
但是OUT_IO_TXD = RS232_1_RXD_IN;赋值不了...

方法1.  将 OUT_IO_TXD 定义为 bit 类型。
方法2.  强制转换,如 OUT_IO_TXD = (char)RS232_1_RXD_IN。

这上面用指针没必要,并且还要经过上述类型转换。

使用特权

评论回复
地板
lk0623|  楼主 | 2011-6-12 22:29 | 只看该作者
方法一 之前试过 不行
2 我明天试试看,回及时汇报的

使用特权

评论回复
5
lk0623|  楼主 | 2011-6-13 08:53 | 只看该作者
方法2 也不可以,还有其他方法嘛 ?

使用特权

评论回复
6
原野之狼| | 2011-6-13 10:40 | 只看该作者
sbit之后 并不是一种数据类型

使用特权

评论回复
7
lk0623|  楼主 | 2011-6-13 11:08 | 只看该作者
所以如果我想用于io口赋值(比如P0^3=P0^4),应该如何编写呢?

使用特权

评论回复
8
xwj| | 2011-6-13 11:23 | 只看该作者
布通CPU情况不一样。

对于51,其内存映射分配方式、寻址方式决定了IO寄存器只能用直接地址访问,而不能间址操作,否则就算是地址正确也会访问到RAM上去了。
所以其端口是不可能用直针访问的。

使用特权

评论回复
9
xwj| | 2011-6-13 11:27 | 只看该作者
但如果想用变量来操作统一端口的不同位的话,却可以通过灵活使用以为来解决,但这也不是指针,而且效率不高。

使用特权

评论回复
10
lws| | 2011-6-13 16:49 | 只看该作者
判断后=1,=0 就行了,你以为是变量啊

使用特权

评论回复
11
lk0623|  楼主 | 2011-6-13 20:18 | 只看该作者
判断后=1,=0 就行了,你以为是变量啊
lws 发表于 2011-6-13 16:49

我所说的变量,不是指IO的状态 1 或者0的变化,而是不同的IO口,P1.1,P1.2

使用特权

评论回复
12
lk0623|  楼主 | 2011-6-13 20:23 | 只看该作者
但如果想用变量来操作统一端口的不同位的话,却可以通过灵活使用以为来解决,但这也不是指针,而且效率不高。
xwj 发表于 2011-6-13 11:27

那应该如何解决这个问题呢, 我现在就是很多IO口都需要调用上面那个函数,如果不把IO口改成变量的话,需要写很多类似的子函数,最奇怪的是,函数中的2个变量,一个可以用,令一个不行,(不行的那个换成固定的IO口就可以)查了好几天了,

使用特权

评论回复
13
lk0623|  楼主 | 2011-6-14 14:05 | 只看该作者
就是希望能够找到个方法,能实现将io口当成函数的参数传递

使用特权

评论回复
14
johnwjl| | 2011-6-14 16:47 | 只看该作者
LZ你需要的这个IO 指针是无法实现的。
因为函数要改变实参的值只能通过指针形参来实现,IO口则需要用位指针来实现,而位指针是非法的,所以。。。你知道的。
需要改变你的编程思路。

使用特权

评论回复
15
123jj| | 2011-6-15 07:53 | 只看该作者
帮LZ测试了一下,定义混乱,不配套!

sbit RS232_1_TXD_OUT = P3^4;    <----->    RS232_1_TXD_IN。

sbit RS232_1_RXD_OUT = P3^5;    <----->    RS232_1_RXD_IN。


改成一致即编译通过~~~

使用特权

评论回复
16
lk0623|  楼主 | 2011-6-15 08:58 | 只看该作者
LZ你需要的这个IO 指针是无法实现的。
因为函数要改变实参的值只能通过指针形参来实现,IO口则需要用位指针来实现,而位指针是非法的,所以。。。你知道的。
需要改变你的编程思路。 ...
johnwjl 发表于 2011-6-14 16:47
你又好的建议嘛?想了好久没想到新方法

使用特权

评论回复
17
lk0623|  楼主 | 2011-6-15 09:01 | 只看该作者
帮LZ测试了一下,定义混乱,不配套!

sbit RS232_1_TXD_OUT = P3^4;        RS232_1_TXD_IN。

sbit RS232_1_RXD_OUT = P3^5;        RS232_1_RXD_IN。


改成一致即编译通过~~~
123jj 发表于 2011-6-15 07:53


sbit RS232_1_TXD_IN  = P1^6;
sbit RS232_1_RXD_IN  = P1^7;

sbit RS232_1_TXD_OUT = P3^4;        
sbit RS232_1_RXD_OUT = P3^5;

我需要的是将RS232_1_RXD_IN  赋值给 RS232_1_TXD_OUT,而不是让他们2相同,

使用特权

评论回复
18
123jj| | 2011-6-15 10:02 | 只看该作者
sbit RS232_1_TXD_IN  = P1^6;
sbit RS232_1_RXD_IN  = P1^7;

sbit RS232_1_TXD_OUT = P3^4;        
sbit RS232_1_RXD_OUT = P3^5;

我需要的是将RS232_1_RXD_IN  赋值给 RS232_1_TXD_OUT,而不是让他们2相同, ...
lk0623 发表于 2011-6-15 09:01


RS232_1_TXD_OUT = RS232_1_RXD_IN;   // 这样不就赋值啦

使用特权

评论回复
19
lk0623|  楼主 | 2011-6-15 13:01 | 只看该作者
是的,但是由于实际中需要很多次的调用不同IO间赋值,所以需要一个子函数,IO变量作为函数的参数来传递,问题出在,当IO口变量被赋值的时候,无效.而IO口变量赋值给其他IO口的时候可以实现。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

109

帖子

0

粉丝