OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4410|回复: 6

怎么把多个bit,一起读/写;

[复制链接]

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
发表于 2013-6-20 10:43:33 | 显示全部楼层 |阅读模式
本人还在初学STM32正处在“过渡期”所以问题比较多请谅解!
例如:按键程序(8个按键吧),由于硬件原因按键们不会像的那样在一起(那51来说,不会都在P0,P1口上),可能会东一个,西一个的,读起来比较麻烦,
这时就需要将几个“不同端口”,"不连续",的位进行“合并“在一起,方便一起读/写,以便控制。
例:
KEY1:    PA.3
KEY2:    A.9
KEY3:    A.12
KEY4:    B.0
KEY5:    B.3
KEY6:    B.9
KEY7:    A.5
KEY8:    B.10

定义一个变量 u8 key;它的每一位对应这每一个按键?
求大神指点,



一知半解!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-20 11:11:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-20 11:14:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-20 11:28:19 | 显示全部楼层
fpga
回复 支持 反对

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2012-3-19
在线时间
37 小时
发表于 2013-6-20 12:02:25 | 显示全部楼层
1楼方法可行
先全部读取出来,存进结构体
然后判断就可以“连续”“在一起”,具体没测试过,理论猜想的,请慎重考虑
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-20 13:42:19 | 显示全部楼层
回复【楼主位】liawei123:
---------------------------------
#define pin_cs               (1 << 7)//pd7
#define pin_rs               (1 <<  11)//pd11
#define pin_wr               (1 <<  5)//pd5
#define pin_rd               (1 <<  4)//pd4
#define pin_reset            (1 <<  1)//pe1
                         
#define lcd_cs(x)             GPIOD->ODR = (GPIOD->ODR & ~pin_cs) | (x ? pin_cs: 0);                                                                                                
#define lcd_rs(x)             GPIOD->ODR = (GPIOD->ODR & ~pin_rs) | (x ? pin_rs: 0);                                                 
#define lcd_wr(x)             GPIOD->ODR = (GPIOD->ODR & ~pin_wr) | (x ? pin_wr: 0);                                                 
#define lcd_rd(x)             GPIOD->ODR = (GPIOD->ODR & ~pin_rd) | (x ? pin_rd: 0);
#define lcd_reset(x)          GPIOE->ODR = (GPIOE->ODR & ~pin_reset) | (x ? pin_reset: 0);
回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-6-21 09:40:32 | 显示全部楼层
你说的是位域吧,以前我很少用过,花了点时间看了下,这总方法是可行的。
先开始自己定义了位域,但是编译器总是报错,后来发现报错也是可以使用的。一下是我写的程序:

struct byte 
{
int b0:1;
int b1:1;
int b2:1;
int b3:1;
int b4:1;
int b5:1;
int b6:1;
int b7:1;
};  

int main(void)
{  
struct byte dat;  
int bb=0;
////假设为输出,并输出0xf0;
PAout(3)=0;
PAout(9)=0;
PAout(12)=0;
PBout(0)=0;
PBout(3)=1;
PBout(9)=1;
PAout(5)=1;
PBout(10)=1;

dat.b0=PAout(3);
dat.b1=PAout(9);
dat.b2=PAout(12);
dat.b3=PBout(0);
dat.b4=PBout(3);
dat.b5=PBout(9);
dat.b6=PAout(5);
dat.b7=PBout(10); 
        //此时位域的值是0xf0;

// *((int *)&dat)=0xaa;//给位域赋值
bb=(*((int *)&dat));//读位域的值
printf("bb=%x\r\n",bb);
        while(1);
}

以上程序是可行,但是有些问题。
最前面通过给位域的每一个位赋值,在读位域前的值应该是0xf0,(调试看内存也是0xf0),
但是在读位域时“bb=(*((int *)&dat));//读位域的值”,其bb的值却是0x200000f0;
0x200000f0,前面的“2”不知道是从哪里来的。(有个勉强的方法,也就是把域的值强制转换成char ,前面的2就没有了),
当我给域赋值了,在读(也就是恢复“*((int *)&dat)=0xaa;”),这时读出来的值就是对的bb=0xaa;
不知道这是为什么,求指点,有兴趣的朋友可以自己试试,看会不会出现这总情况,在此谢过大家了。








一知半解!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 15:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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