新手问个技术问题,我怎么把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: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;
} lzl1okOK 发表于 2024-6-27 01:28
用函数封装一下,你试试下面的行不行,其他的高级方法我也不会
unsigned char add (void)
{
这个也是一个思路 用联合体 moto_yufo 发表于 2024-6-27 08:52
用联合体
联合体好像没法用于sbit变量吧,,你测试过么 wnagming 发表于 2024-6-27 02:26
有点看不懂,矩阵是设置4行或列,读取4列或行,封装为一个字节没有意义,行列是分开的 ...
我是想把几个IO口拼成一个类似于P0P1P2口 这样的,我就可以通过操作AJ达到操作这几个IO口。 没有好方法就用笨方法,写个函数,定义个全局字节变量,挨个判断x1~y4、变量对应的位置1或置0 本帖最后由 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位单独操作。
angmall 发表于 2024-6-27 10:14
可以用bdata 定义个字节变量。
IO管脚不能这么干吧?
BDAT只是同一个寄存器不同的位进行独立操作,楼主用的IO管脚并非同一个IO端口,不在一个字节内, 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;
不知道这样是不是可以?