consoleyou 发表于 2024-6-26 23:26:27

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

我需要用单片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】

lzl1okOK 发表于 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;
}

zhange 发表于 2024-6-27 05:28:35

lzl1okOK 发表于 2024-6-27 01:28
用函数封装一下,你试试下面的行不行,其他的高级方法我也不会
unsigned char add (void)
{


这个也是一个思路

moto_yufo 发表于 2024-6-27 08:52:45

用联合体

_奶咖君_ 发表于 2024-6-27 09:12:44

moto_yufo 发表于 2024-6-27 08:52
用联合体

联合体好像没法用于sbit变量吧,,你测试过么

consoleyou 发表于 2024-6-27 09:19:32

wnagming 发表于 2024-6-27 02:26
有点看不懂,矩阵是设置4行或列,读取4列或行,封装为一个字节没有意义,行列是分开的 ...

我是想把几个IO口拼成一个类似于P0P1P2口 这样的,我就可以通过操作AJ达到操作这几个IO口。

wangxiangtan 发表于 2024-6-27 09:56:51

没有好方法就用笨方法,写个函数,定义个全局字节变量,挨个判断x1~y4、变量对应的位置1或置0

angmall 发表于 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位单独操作。



网老四 发表于 2024-6-27 11:21:50

angmall 发表于 2024-6-27 10:14
可以用bdata 定义个字节变量。




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

consoleyou 发表于 2024-6-27 11:35:43

angmall 发表于 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;
不知道这样是不是可以?
页: [1] 2 3 4
查看完整版本: 新手问个技术问题,我怎么把8个bit数据封装成一个字节BYTE。