[STM32F1] STM32 想把一个u8变量的某一位赋值给一个GPIO怎么办

[复制链接]
 楼主| Robert_zheng 发表于 2014-10-23 14:30 | 显示全部楼层 |阅读模式
stm32用并行信号驱动一个液晶屏,一个u8变量赋给几个GPIO口,一个GPIO对应其中的一位
清风致影 发表于 2014-10-23 14:34 | 显示全部楼层
GPIOE->ODR = 0xffff;这是把GPIOE全部设置为1,  你的问题可以解决了么?
 楼主| Robert_zheng 发表于 2014-10-23 14:43 | 显示全部楼层
清风致影 发表于 2014-10-23 14:34
GPIOE->ODR = 0xffff;这是把GPIOE全部设置为1,  你的问题可以解决了么?

NO,我现在有一个u8的数据,用八个GPIO并行的表示出来,传出去
清风致影 发表于 2014-10-23 14:46 | 显示全部楼层
Robert_zheng 发表于 2014-10-23 14:43
NO,我现在有一个u8的数据,用八个GPIO并行的表示出来,传出去

。。。。。晕   可以置位16个GPIO  就不能想办法置位8个GPIO么。。。。
 楼主| Robert_zheng 发表于 2014-10-23 14:50 | 显示全部楼层
清风致影 发表于 2014-10-23 14:46
。。。。。晕   可以置位16个GPIO  就不能想办法置位8个GPIO么。。。。

u8 有0有1啊,而且,八个GPIO不全是一起的,有的在A,有的在B,E。有个GPIO_WriteBit(),就是不知道怎么把u8 的某一位提取出来一个BIT数据。
Rain_King 发表于 2014-10-23 14:51 | 显示全部楼层
很简单.....用一个16位的变量读出来....把需要的8位置零,然后或上去.....就OK了嘛
Rain_King 发表于 2014-10-23 14:55 | 显示全部楼层
写成C语言就是:
int a;
char b;
a = GPIOE->ODR;//假如是后8位
a = a &0XFF00;
b = 0;//需要的赋的值
a = a | b;
GPIOE->ODR = a;
Rain_King 发表于 2014-10-23 14:56 | 显示全部楼层
本帖最后由 Rain_King 于 2014-10-23 14:57 编辑

之所以要a来过度,大家都懂得...............如果是其他位,就需要移位.....如果是不连续的.....呃,还是一位一位的来吧..............
 楼主| Robert_zheng 发表于 2014-10-23 15:04 | 显示全部楼层
Rain_King 发表于 2014-10-23 14:56
之所以要a来过度,大家都懂得...............如果是其他位,就需要移位.....如果是不连续的.....呃,还是一 ...

你的意思我大概明白了,但是我想库函数既然有现成的GPIO_WriteBit(),把u8分成8个bit数据,写个八次,这样会不会简单一点,后面的人看起来也会比较容易明白。
 楼主| Robert_zheng 发表于 2014-10-23 15:07 | 显示全部楼层
Robert_zheng 发表于 2014-10-23 15:04
你的意思我大概明白了,但是我想库函数既然有现成的GPIO_WriteBit(),把u8分成8个bit数据,写个八次,这样 ...

定义一个联合体,由8个bit变量组成,在赋一下u8变量的地址,行不行。
Rain_King 发表于 2014-10-23 15:38 | 显示全部楼层
Robert_zheng 发表于 2014-10-23 15:07
定义一个联合体,由8个bit变量组成,在赋一下u8变量的地址,行不行。

我还以为,你是想如何快速搞定....不讲效率啊....那就随便啦,可以使用位域,或者直接调用库.........都可以
amanda_s 发表于 2014-10-23 16:41 | 显示全部楼层
可以使用位带操作。
分别为u8变量的每一位,以及你用到的GPIO口(用ODR寄存器)定义一个别名。
赋值的时候,直接把u8某一位的别名赋值给对应的GPIO口的别名就可以了。
速度也比用库函数快。
SLHSu37 发表于 2014-10-23 16:48 | 显示全部楼层
移位赋值吧·
huatong 发表于 2014-10-23 17:32 | 显示全部楼层
Rain_King 发表于 2014-10-23 14:55
写成C语言就是:
int a;
char b;

GPIOE->BSRR = 0x00FF0000 | b;      //这样GPIOE的低8位就是你要的结果,高8位不变
huatong 发表于 2014-10-23 17:34 | 显示全部楼层
可以使用端口的BSRR寄存器啊
mmuuss586 发表于 2014-10-23 19:05 | 显示全部楼层
Robert_zheng 发表于 2014-10-23 14:50
u8 有0有1啊,而且,八个GPIO不全是一起的,有的在A,有的在B,E。有个GPIO_WriteBit(),就是不知道怎 ...

不同的端口,只能位指令了;
mohanwei 发表于 2014-10-23 20:27 | 显示全部楼层
Flash这么大,主频这么高,最笨的方法可能就是最靠谱的方法:
//bit0:
if(dat & (1<<0))
   GPIO_SetBits(Port_LCD_SCL, Pin_LCD_SCL);
else
   GPIO_ResetBits(Port_LCD_SCL, Pin_LCD_SCL);

//bit1:
if(dat & (1<<1))
   GPIO_SetBits(Port_LCD_SDA, Pin_LCD_SDA);
else
   GPIO_ResetBits(Port_LCD_SDA, Pin_LCD_SDA);

//bit2:
……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部