标题: 单片机如何读不同IO口的数据 [打印本页]

作者: xyxiyangyaang    时间: 2021-11-16 16:56
标题: 单片机如何读不同IO口的数据
C8051F330的单片机,需要读8位数字,依次是P1^5,P1^4,P1^3,P1^1,P1^2,P1^0,P0^7,P0^4,我想把它们写到一个数据里面,



#include <c8051f330.h>
sbit T8 = P1^5;
sbit T7 = P1^4;
sbit T6 = P1^3;
sbit T5 = P1^1;
sbit T4 = P1^2;
sbit T3 = P1^0;
sbit T2 = P0^7;
sbit T1 = P0^4;


void main()
{
        unsigned char dat = 0;
        dat |= T8<<0;
        dat |= T7<<1;
        dat |= T6<<2;
        dat |= T5<<3;
        dat |= T4<<4;
        dat |= T3<<5;
        dat |= T2<<6;
        dat |= T1<<7;

}

编译的时候报错,显示‘<<’:bad operand type.
不知道为什么。
如果这个方案不可行,有没有别的办法,谢谢!

作者: 188610329    时间: 2021-11-16 22:18
T8 是一个位, 你让 位去移位,往那里移?
其实,不该这么写,但是考虑到你 T1~T8 的定位,可能是虚构的,还是这么写吧。
unsigned char  Combi_Data();
{
      unsigned char dat;
      if(T1)  dat |=1;
      dat <<=1;
      if(T2)  dat |=1;
      dat <<=1;
      if(T3)  dat |=1;
      dat <<=1;
      if(T4)  dat |=1;
      dat <<=1;
      if(T5)  dat |=1;
      dat <<=1;
      if(T6)  dat |=1;
      dat <<=1;
      if(T7)  dat |=1;
      dat <<=1;
      if(T8)  dat |=1;
      return dat;
}
作者: wulin    时间: 2021-11-17 06:36
实际电路设计中尽可能避免这种无序、交叉使用端口,会给编程带来麻烦,稍不仔细就会出错
  1. //宏定义 标识符     7(0.4)       6(0.7)       5(1.0)   4(1.2)3(1.1)    2(1.3)       1(1.4)       0(1.5)
  2. #define P_read ((P0<<3&0x80)|(P0>>1&0x40)|(P1<<5&0x20)|(P1<<2&0x18)|(P1>>2&0x04)||(P1>>2&0x02)|(P1>>5&0x01))
复制代码

作者: munuc_w    时间: 2021-11-17 08:33
一个端口的可以一次读取,不同的端口只能分别读取,有特殊需要,只能后期再组合。
作者: wps10025    时间: 2021-11-17 09:19
可以宏定义
#define    T    P1
对T进行8位位移操作,单个IO不能位移
作者: zhaobolove    时间: 2021-11-17 09:35
dat |= (char)T1<<7;  全部这样 加强制类型转换 即可.
作者: zhaobolove    时间: 2021-11-17 09:37
我在是这样弄的,  没有问题

         char cbB1=         (char)X7<<7 | (char)X6<<6 | (char)X5<<5 | (char)X4<<4 | (char)X3<<3 | (char)X2<<2 | (char)X1<<1 | (char)X0  ;

sbit X0 = P0^0;    // X0-X7
sbit X1 = P0^3;
sbit X2 = P2^2;
sbit X3 = P1^3;
作者: yzwzfyz    时间: 2021-11-18 14:20
试试:
A^7 = P1^5;
A^6  = P1^4;
A^5  = P1^3;
A^4  = P1^1;
A^3  = P1^2;
A^2  = P1^0;
A^1  = P0^7;
A^0  = P0^4;
作者: pianzisiquanjia    时间: 2021-11-18 21:10
在读取一个变量的函数里,如 char read(){ char a,b,c; a=P1&0xe0;  b=P2&0x1e;  c=P3&0x03; a=a+b+c; return a; } 大概构思就是这样;
作者: xyxiyangyaang    时间: 2021-11-19 09:01
,谢谢各位!
作者: cool1456    时间: 2021-11-19 09:13
T1 T2都是一个位而已,就只能有0,1,做不到右移8位的
作者: hezezeze    时间: 2021-11-19 18:32
采用 P0、P1、P2 和 P3的方式,一次可以读取 8 个 IO 口




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