OpenEdv-开源电子网

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

将一个八位数据输出到八个独立的IO 口该怎么写最巧妙?

[复制链接]

10

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2016-1-11
在线时间
19 小时
发表于 2016-11-4 17:00:28 | 显示全部楼层 |阅读模式
10金钱
我想请教大家一下,我现在在做一个项目,输入输出比较多,现在想是现在一个效果就是,

把输出的数据按一个字节  八位八位的输出,那问题就是,怎么才可以实现一个八位数据,用一个函数输出到八个相互独立的IO口,八个IO口不是连续的,
,例如,把0x34 这个八位数据一位一位的对应输出到PA0 ,PA5 ,PC7....等八个IO口

点播一下思路也可以,谢谢了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
发表于 2016-11-4 17:04:36 | 显示全部楼层
看原子哥的例,数据组合,然后输出
就是数据左移右移再组合
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2016-11-4 17:11:33 | 显示全部楼层
本帖最后由 gotofly21 于 2016-11-4 17:12 编辑

要快 用低四位 高四位  因为四位数有16个情况 用switch 一次输出4个端口 ,要不然就写8个 if else
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-4 17:15:22 | 显示全部楼层
本帖最后由 密耳 于 2016-11-4 17:20 编辑

pa0 =  0x34&0x01;
pa5 =  (0x34>>1)&0x01;pc7 =  (0x34>>2)&0x01;
...

shop60994719.taobao.com
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2014-6-27
在线时间
978 小时
发表于 2016-11-4 17:47:13 | 显示全部楼层
x1=data;data>>=1;
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2014-6-27
在线时间
978 小时
发表于 2016-11-4 17:48:32 | 显示全部楼层
x1=data;data>>=1; x2=data;data>>=1; . . . x8=data;
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2014-6-27
在线时间
978 小时
发表于 2016-11-4 17:50:04 | 显示全部楼层
x1=data;data>>=1;
x2=data;data>>=1;
.
.
.
x8=data;
你把数据位和IO对应好就行了。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-11-4
在线时间
3 小时
发表于 2016-11-4 18:09:10 | 显示全部楼层
TinyBoy 发表于 2016-11-4 17:50
x1=data;data>>=1;
x2=data;data>>=1;
.

你不x = data & 0x1 真的可以吗?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2014-6-27
在线时间
978 小时
发表于 2016-11-4 18:22:21 | 显示全部楼层
ss1969 发表于 2016-11-4 18:09
你不x = data & 0x1 真的可以吗?

没用过,不会给你的,你试试就知道了。
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-11-4 19:18:24 来自手机 | 显示全部楼层
两边都用bitbanding吧
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-11-4 20:04:26 | 显示全部楼层
唉,还得我给你写……
终极函数!
outbit_function(u8 data_t)

PA0 = (data_t&0x01)?1:0;
PA2 = (data_t&0x02)?1:0;
PA3 = (data_t&0x04)?1:0;
PA5 = (data_t&0x08)?1:0;
PA4 = (data_t&0x10)?1:0;
PA1 = (data_t&0x20)?1:0;
PC7 = (data_t&0x40)?1:0;
PB2 = (data_t&0x80)?1:0;
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-11-4 21:44:33 | 显示全部楼层
本帖最后由 yyx112358 于 2016-11-4 22:20 编辑

想了以下,不用汇编的情况下,11楼应该算是在8个IO口的情况下最为简单粗暴,但是时间也是最短的方法了。不过,我还有一个优雅的方法,更加简洁占用空间少,主要的思路是遍历指针数组
[mw_shl_code=c,true]volatile unsigned long  *PinGroup[32]={&PAout(0),&PBout(3),&PCout(7)};//指针数组。这里填对应IO,最多32个

void        func(uint32_t        dat)//输入为32位整数,因此最多支持32个IO
{
    volatile unsigned long  **p=PinGroup;//指针p指向指针数组首地址
    u8        i=32;
        
    while(i--)
    {
        **p=dat&0x01;//对应IO赋值
        p++;
        dat>>=1;
    }
}[/mw_shl_code]


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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