浦江一水
发表于 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试一试?
都把砖搬到你脚下了,还要我砌上去证明是砖吗?