打印

高手进!这个问题有人想到吗?

[复制链接]
2032|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vmospower|  楼主 | 2012-3-23 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如我们要让单片机输出一个数,当然这个数是二进制的,高电平看作1,低电平看作0,现在我如果要输出一个十位的二进制数(这个二进制数可以用接十个LED来模拟),这个二进制数的第一位任意指定一个I/O口,比如P0.2,第二位又任意指定一个I/0口,比如P0.6,第三位比如P2.4 ... ...等等。
这样的程序如何实现呢?

    比如我在单片机的P0口接8个LED,按常理我们会这样接:P0.0接第1位LED,P0.1接第2位LED,,,P0.7接第8个LED;可是我现在换一下,P0.0接第二位LED,P0.1接第1位LED,P0.2接第4个LED,P0.3接第3个LED... ...即相当于原来的P0口的01,23,45,67,输出线对调。使之在LED上输出0到200的数字,怎么编程实现?


      说得更简单一些就是我想输出二进制数据,引线任意连接,比如输出一个32位数,我任意排列32个I/0口的位权,怎么实现?

相关帖子

沙发
lyjian| | 2012-3-23 19:31 | 只看该作者
这也叫问题?

使用特权

评论回复
板凳
原野之狼| | 2012-3-23 20:07 | 只看该作者
这还不简单  重新组织一下数据位就可以了

使用特权

评论回复
地板
vmospower|  楼主 | 2012-3-23 21:00 | 只看该作者
有具体CODE么?

使用特权

评论回复
5
lyjian| | 2012-3-24 08:30 | 只看该作者
你不知道单片机有位操作吗?

使用特权

评论回复
6
ayb_ice| | 2012-3-24 08:32 | 只看该作者
这都搞不定,建议改行了

使用特权

评论回复
7
yewuyi| | 2012-3-24 08:33 | 只看该作者
这种问题也要别人给你CODE的话,就是给了你具体的CODE,你也不会看得懂。

使用特权

评论回复
8
lyjian| | 2012-3-24 08:42 | 只看该作者
假设是51
在可位寻址区定义一个32位数据:B31...B0,Bx表示这32位中的任意一位。输出为Px为任意一个输出IO。
汇编实现:
mov C,Bx
mov Px,C
C51实现:
Px=Bx;

使用特权

评论回复
9
mcu5i51| | 2012-3-24 09:52 | 只看该作者
通用的做法是数组或位移结合逻辑运算

使用特权

评论回复
10
lhkjg| | 2012-3-24 09:59 | 只看该作者
先定义位操作。然后把所有的位定义在一个字节里面

使用特权

评论回复
11
刘前辈| | 2012-3-24 12:19 | 只看该作者
本帖最后由 刘前辈 于 2012-3-24 12:20 编辑

这年头还有没人想到的问题?只有别人早想到并且早做过的、我们不知道的问题:

LZ很简单的问题:举个类似的例子:
P0口组成 4X4矩阵键盘,按下任意键,显示希望的LED数字;写出通用程序。——这个通用程序对每个程序员希望显示的数字都可能是不一样的。——做一个哈希表,输入是键盘数值,输出是表值。对不同的要求,修改表值即可。

把这个程序稍改一下,就能解决LZ的问题。

程序在何宗彬写的《嵌入式系统……》教材上。


、、

使用特权

评论回复
12
yangyangyangS| | 2012-3-31 14:10 | 只看该作者
进来学习下……

使用特权

评论回复
13
zd420325| | 2012-3-31 14:54 | 只看该作者
做为一个新手,我不骂你!自己看吧.dummy是一个变量,set1是汇编的正置1,这里汇编是C是可以任意插入的.

void        SegmentDataSet (void)
{
                       
                        if(dummy.0)
                          set1                        PB.0
                        else
                          set0                        PB.0
                            
                        if(dummy.1)
                          set1                        PB.1
                        else
                          set0                        PB.1
                          
                        if(dummy.2)
                          set1                        PB.2
                        else
                          set0                        PB.2
                          
                        if(dummy.3)
                          set1                        PB.3
                        else
                          set0                        PB.3
                          
                        if(dummy.4)
                          set1                        PB.4
                        else
                          set0                        PB.4
                          
}

使用特权

评论回复
14
huhandong| | 2012-3-31 17:49 | 只看该作者
自已稍多动手编点程,你就能成为你题中的"高手"

使用特权

评论回复
15
joyme| | 2012-4-1 09:16 | 只看该作者
申明这也不算高难度的东西,仔细想想,自己找个最好的算法,下面的代码可以给你参考
unsigned char shunxu[8] = {1,0,3,2,5,4,7,6}; //定义打乱后的顺序
void displaynum(unsigned char data)
{
       unsigned char i,tmp=0;
       for(i=0;i<8;i++)
       {
            if(data & (1<<i))
               tmp |= (1<<shunxu[i]);
       }
       PORTA = tmp;   //具体用的哪个口看硬件定义
}

使用特权

评论回复
16
joyme| | 2012-4-1 09:26 | 只看该作者
顺便给楼主出个题,按上面的方式,做出32位数顺序调整的代码贴上来,从低到高位分别用PORTA,B,C,D口,并假设每个口的顺序一样(简化命题),也算是督促楼主学习吧,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

粉丝