找回密码
 立即注册
楼主: consoleyou

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-6-27 11:59:18 | 显示全部楼层
//如果已经这样定义: (复制原文)
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


那么这样试试看:
// 编写一个发送字节的函数...
// 可直接发送字节(AJ)到端口...
void SendAJ(unsigned char AJ)
{
   if(AJ & 0x01)aj_x1 = 1; else aj_x1 = 0;     //如果AJ变量的最低位是1, 那么aj_x1端口置1, 否则置零;
   if(AJ & 0x02)aj_x2 = 1; else aj_x2 = 0;     //含义同上... 下略...
   if(AJ & 0x04)aj_x3 = 1; else aj_x3 = 0;     //...
   if(AJ & 0x08)aj_x4 = 1; else aj_x4 = 0;
   if(AJ & 0x10)aj_y1 = 1; else aj_y1 = 0;
   if(AJ & 0x20)aj_y2 = 1; else aj_y2 = 0;
   if(AJ & 0x40)aj_y3 = 1; else aj_y3 = 0;     //...
   if(AJ & 0x80)aj_y4 = 1; else aj_y4 = 0;     //如果AJ变量的最高位是1, 那么aj_y4端口置1, 否则置零;
}


一般用8个IO组成4x4矩阵键盘, 使用翻转算法, 需要发送字节到端口, 另外还要从端口读取一个字节.
因此还需要编写一个读取字节的函数, 函数原型为:
unsigned char  ReadAJ(void);

......

尚未上机实验, 仅供参考...



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-6-27 14:18:38 | 显示全部楼层
  1. uchar bdata Byte;
  2. //uchar ebdata Byte; //STC32用 ebdata
  3. sbit Bit0 = Byte^0;
  4. sbit Bit1 = Byte^1;
  5. ...
  6. sbit Bit6 = Byte^6;
  7. sbit Bit7 = Byte^7;
  8. void GPIO_WR(uchar dat)
  9. {
  10.         Byte = dat;
  11.         aj_x1 = Bit0;
  12.         ...
  13.         aj_x8 = Bit7;       
  14. }
  15. uchar GPIO_RD()
  16. {
  17.         Bit0 = aj_x1;
  18.         ...
  19.         Bit7 = aj_x8;
  20.         return Byte;
  21. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

好思路!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-6-27 15:06:17 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-6-27 15:08 编辑

也不知道这样行不行:
AJ=(aj_x1<<7)|(aj_x2<<6)|(aj_x3<<5)|(aj_x4<<4)|(aj_x5<<3)|(aj_x6<<2)|(aj_x7<<1)|aj_x8;
要不,就先读取各引脚放到变量,再用读到的变量进行组装。
总之,觉得有点难度。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2024-08-22 11:09:57

4

主题

4

回帖

219

积分

中级会员

积分
219
发表于 2024-6-27 15:17:09 | 显示全部楼层
你这八个位分散在两个字节里,不好弄啊。

Keil肯定做不到,IAR可以试试下面的定义:
  1. #pragma location=0x90
  2. __sfr __no_init volatile union
  3. {
  4.     unsigned char byte;
  5.     struct
  6.     {
  7.         unsigned char x4 : 1;
  8.         unsigned char x3 : 1;
  9.         unsigned char :2;
  10.         unsigned char y1 : 1;
  11.         unsigned char y2 : 1;
  12.         unsigned char y3      : 1;
  13.         unsigned char y4      : 1;
  14.     };
  15. } Matrix_keyboard_2;
  16. #pragma location=0xB0
  17. __sfr __no_init volatile union
  18. {
  19.     unsigned char byte;
  20.     struct
  21.     {
  22.         unsigned char :6;
  23.         unsigned char x1 : 1;
  24.         unsigned char x2 : 1;
  25.     };
  26. } Matrix_keyboard_1;   
复制代码



打倒Keil私扩!打倒Unix暴政!自由属于光荣的中国51人!
回复 支持 反对

使用道具 举报 送花

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

7

主题

64

回帖

659

积分

高级会员

积分
659
发表于 2024-6-27 17:31:00 | 显示全部楼层
浦江*** 发表于 2024-6-27 11:59
//如果已经这样定义: (复制原文)
sbit aj_x1 = P3^6    //设置矩阵键盘X1行接P3.6
sbit aj_x2 = P3^7    // ...

感觉这个方法可行
回复 支持 反对

使用道具 举报 送花

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

1

主题

14

回帖

117

积分

注册会员

积分
117
发表于 2024-6-27 20:00:15 | 显示全部楼层
本帖最后由 moto_yufo 于 2024-6-27 20:06 编辑
_奶*** 发表于 2024-6-27 09:12
联合体好像没法用于sbit变量吧,,你测试过么

可以的,用过
union         
{
    unsigned char a;
    struct
    {
        unsigned char  a0:1;
        unsigned char  a1:1;
        unsigned char  a2:1;
        unsigned char  a3:1;
        unsigned char  a4:1;
        unsigned char  a5:1;
        unsigned char  a6:1;
        unsigned char  a7:1;
    } b;
} KEY;
回复 支持 反对

使用道具 举报 送花

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

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2024-6-27 20:04:39 | 显示全部楼层
conso*** 发表于 2024-6-27 17:31
感觉这个方法可行

如果感觉还可行的话, 就再补充一个读取字节函数:

//读取一个字节函数
unsigned char  ReadAJ(void)
{
    unsigned char  Buf = 0;
    if(aj_x1) Buf  |= 0x01;
    if(aj_x2) Buf  |= 0x02;
    if(aj_x3) Buf  |= 0x04;
    if(aj_x4) Buf  |= 0x08;
    if(aj_y1) Buf  |= 0x10;
    if(aj_y2) Buf  |= 0x20;
    if(aj_y3) Buf  |= 0x40;
    if(aj_y4) Buf  |= 0x80;
    reutrn Buf;    //返回端口字节状态值
}

这样就可以用翻转法, 结合使用发送字节函数和读取字节函数,  就可读取4*4矩阵按键的键值了...  
具体读键函数, 可参考本论坛中我的《基于STC32G12K128实验箱V9.62_实验之行列矩阵8按键输入》一帖,
其中读键模块的写法,如果考虑区分各键的短按和长按,16键则可返回32个键值。


仅供参考...





回复 支持 1 反对 0

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-6-28 08:45:26 | 显示全部楼层
moto_*** 发表于 2024-6-27 20:00
可以的,用过
union         
{

你这是啥变量,,,人家要的啥变量,,你把char换成楼主说的sbit试一试?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

1

主题

14

回帖

117

积分

注册会员

积分
117
发表于 2024-6-28 22:01:42 | 显示全部楼层
_奶*** 发表于 2024-6-28 08:45
你这是啥变量,,,人家要的啥变量,,你把char换成楼主说的sbit试一试?

都把砖搬到你脚下了,还要我砌上去证明是砖吗?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:19 , Processed in 0.254094 second(s), 123 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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