找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2414|回复: 11
打印 上一主题 下一主题
收起左侧

单片机如何读不同IO口的数据

  [复制链接]
跳转到指定楼层
楼主
ID:980872 发表于 2021-11-16 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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.
不知道为什么。
如果这个方案不可行,有没有别的办法,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 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;
}
回复

使用道具 举报

板凳
ID:213173 发表于 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))
复制代码
回复

使用道具 举报

地板
ID:752974 发表于 2021-11-17 08:33 | 只看该作者
一个端口的可以一次读取,不同的端口只能分别读取,有特殊需要,只能后期再组合。
回复

使用道具 举报

5#
ID:578842 发表于 2021-11-17 09:19 | 只看该作者
可以宏定义
#define    T    P1
对T进行8位位移操作,单个IO不能位移
回复

使用道具 举报

6#
ID:115923 发表于 2021-11-17 09:35 | 只看该作者
dat |= (char)T1<<7;  全部这样 加强制类型转换 即可.
回复

使用道具 举报

7#
ID:115923 发表于 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;
回复

使用道具 举报

8#
ID:123289 发表于 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;
回复

使用道具 举报

9#
ID:982347 发表于 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; } 大概构思就是这样;
回复

使用道具 举报

10#
ID:980872 发表于 2021-11-19 09:01 | 只看该作者
,谢谢各位!
回复

使用道具 举报

11#
ID:982425 发表于 2021-11-19 09:13 | 只看该作者
T1 T2都是一个位而已,就只能有0,1,做不到右移8位的
回复

使用道具 举报

12#
ID:982617 发表于 2021-11-19 18:32 | 只看该作者
采用 P0、P1、P2 和 P3的方式,一次可以读取 8 个 IO 口
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表