找回密码
 立即注册
查看: 1955|回复: 36

新手问个技术问题,我怎么把8个bit数据封装成一个字节BYTE。

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:447
  • 最近打卡:2025-04-30 11:36:47

7

主题

64

回帖

659

积分

高级会员

积分
659
发表于 2024-6-26 23:26:27 | 显示全部楼层 |阅读模式
我需要用单片8个IO口输出一个字节(BYTE)数据,比如:
sbit aj_x1 = P3^6    //设置矩阵键盘X1行接P3.6
sbit aj_x2 = P3^7    //设置矩阵键盘X2行接P3.7
sbit aj_x3 = P1^1    //设置矩阵键盘X3行接P1.1
sbit aj_x4 = P1^0    //设置矩阵键盘X4行接P1.0
sbit aj_y1 = P1^4    //设置矩阵键盘y1行接P1.4
sbit aj_y2 = P1^5    //设置矩阵键盘y2行接P1.5
sbit aj_y3 = P1^6    //设置矩阵键盘y3行接P1.6
sbit aj_y4 = P1^7    //设置矩阵键盘y4行接P1.7

怎么样才能把他们封装成一个字节?【我想用8个位(aj_x1,aj_x2,aj_x3,aj_x4,aj_y1,aj_y2,aj_y3,aj_y4)组成一个字节 AJ】
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:413
  • 最近打卡:2025-05-01 08:31:52

5

主题

296

回帖

2030

积分

金牌会员

积分
2030
发表于 2024-6-27 01:28:09 | 显示全部楼层
本帖最后由 lzl1okOK 于 2024-6-27 01:32 编辑

用函数封装一下,你试试下面的行不行,其他的高级方法我也不会
unsigned char add (void)
{
unsigned char a =P1&0xf0;
a|=((P3&0XC0)>>6);
if(aj_x4) a|=0x08;
if(aj_x3) a|=0x04;
return a;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2025-04-30 16:08:37

61

主题

818

回帖

1490

积分

金牌会员

积分
1490
发表于 2024-6-27 05:28:35 | 显示全部楼层
lzl1*** 发表于 2024-6-27 01:28
用函数封装一下,你试试下面的行不行,其他的高级方法我也不会
unsigned char add (void)
{

这个也是一个思路
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2024-08-17 09:45:18

1

主题

14

回帖

117

积分

注册会员

积分
117
发表于 2024-6-27 08:52:45 | 显示全部楼层
用联合体
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-6-27 09:12:44 | 显示全部楼层

联合体好像没法用于sbit变量吧,,你测试过么
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:447
  • 最近打卡:2025-04-30 11:36:47

7

主题

64

回帖

659

积分

高级会员

积分
659
发表于 2024-6-27 09:19:32 | 显示全部楼层
wnag*** 发表于 2024-6-27 02:26
有点看不懂,矩阵是设置4行或列,读取4列或行,封装为一个字节没有意义,行列是分开的 ...

我是想把几个IO口拼成一个类似于P0  P1  P2口 这样的,我就可以通过操作AJ达到操作这几个IO口。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:512
  • 最近打卡:2025-05-01 09:14:27

21

主题

564

回帖

2674

积分

金牌会员

积分
2674
发表于 2024-6-27 09:56:51 | 显示全部楼层
没有好方法就用笨方法,写个函数,定义个全局字节变量,挨个判断x1~y4、变量对应的位置1或置0
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-6-27 10:14:23 | 显示全部楼层
本帖最后由 angmall 于 2024-6-27 10:16 编辑

可以用bdata 定义个字节变量。


bdata是keil c51中特殊类型,是一种存储器类型说明。比如我定义了一个:
bdata BData=0x00;
然后用:
sbit BData_1=BData^1;  //表示取bit1
sbit BData_7=BData^7;  //表示取bit7
这样就可以把一个byte拆成8个bit位,每个bit位单独操作。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:365
  • 最近打卡:2025-05-02 00:20:03

6

主题

319

回帖

2206

积分

金牌会员

积分
2206
发表于 2024-6-27 11:21:50 | 显示全部楼层
angm*** 发表于 2024-6-27 10:14
可以用bdata 定义个字节变量。

IO管脚不能这么干吧?
BDAT只是同一个寄存器不同的位进行独立操作,楼主用的IO管脚并非同一个IO端口,不在一个字节内,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:447
  • 最近打卡:2025-04-30 11:36:47

7

主题

64

回帖

659

积分

高级会员

积分
659
发表于 2024-6-27 11:35:43 | 显示全部楼层
angm*** 发表于 2024-6-27 10:14
可以用bdata 定义个字节变量。

unsigned char bdata AL;
sbit P3^6 = AL^0;
sbit P3^7 = AL^1;
sbit P1^1 = AL^2;
sbit P1^0 = AL^3;
sbit P1^4 = AL^4;
sbit P1^5 = AL^5;
sbit P1^6 = AL^6;
sbit P1^7 = AL^7;
不知道这样是不是可以?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:34 , Processed in 0.124901 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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