浦江一水 发表于 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 charReadAJ(void);

......

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



Lkck8210 发表于 2024-6-27 14:18:38

uchar bdata Byte;
//uchar ebdata Byte; //STC32用 ebdata
sbit Bit0 = Byte^0;
sbit Bit1 = Byte^1;
...
sbit Bit6 = Byte^6;
sbit Bit7 = Byte^7;

void GPIO_WR(uchar dat)
{
        Byte = dat;
        aj_x1 = Bit0;
        ...
        aj_x8 = Bit7;       
}

uchar GPIO_RD()
{
        Bit0 = aj_x1;
        ...
        Bit7 = aj_x8;
        return Byte;
}

xxkj2010 发表于 2024-6-27 15:01:59

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




好思路!{:4_250:}

xxkj2010 发表于 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;
要不,就先读取各引脚放到变量,再用读到的变量进行组装。
总之,觉得有点难度。

jingkaimori 发表于 2024-6-27 15:17:09

你这八个位分散在两个字节里,不好弄啊。

Keil肯定做不到,IAR可以试试下面的定义:#pragma location=0x90
__sfr __no_init volatile union
{
    unsigned char byte;
    struct
    {
      unsigned char x4 : 1;
      unsigned char x3 : 1;
      unsigned char :2;
      unsigned char y1 : 1;
      unsigned char y2 : 1;
      unsigned char y3      : 1;
      unsigned char y4      : 1;
    };
} Matrix_keyboard_2;

#pragma location=0xB0
__sfr __no_init volatile union
{
    unsigned char byte;
    struct
    {
      unsigned char :6;
      unsigned char x1 : 1;
      unsigned char x2 : 1;
    };
} Matrix_keyboard_1;   


consoleyou 发表于 2024-6-27 17:31:00

浦江一水 发表于 2024-6-27 11:59
//如果已经这样定义: (复制原文)
sbit aj_x1 = P3^6    //设置矩阵键盘X1行接P3.6
sbit aj_x2 = P3^7    // ...

感觉这个方法可行

moto_yufo 发表于 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 chara0:1;
      unsigned chara1:1;
      unsigned chara2:1;
      unsigned chara3:1;
      unsigned chara4:1;
      unsigned chara5:1;
      unsigned chara6:1;
      unsigned chara7:1;
    } b;
} KEY;

浦江一水 发表于 2024-6-27 20:04:39

consoleyou 发表于 2024-6-27 17:31
感觉这个方法可行

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

//读取一个字节函数
unsigned charReadAJ(void)
{
    unsigned charBuf = 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个键值。


仅供参考...





_奶咖君_ 发表于 2024-6-28 08:45:26

moto_yufo 发表于 2024-6-27 20:00
可以的,用过
union         
{

你这是啥变量,,,人家要的啥变量,,你把char换成楼主说的sbit试一试?

moto_yufo 发表于 2024-6-28 22:01:42

_奶咖君_ 发表于 2024-6-28 08:45
你这是啥变量,,,人家要的啥变量,,你把char换成楼主说的sbit试一试?

都把砖搬到你脚下了,还要我砌上去证明是砖吗?
页: 1 [2] 3 4
查看完整版本: 新手问个技术问题,我怎么把8个bit数据封装成一个字节BYTE。