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

[复制链接]
2943|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么?
lyjian 发表于 2012-3-24 08:30 | 显示全部楼层
你不知道单片机有位操作吗?
ayb_ice 发表于 2012-3-24 08:32 | 显示全部楼层
这都搞不定,建议改行了
yewuyi 发表于 2012-3-24 08:33 | 显示全部楼层
这种问题也要别人给你CODE的话,就是给了你具体的CODE,你也不会看得懂。
lyjian 发表于 2012-3-24 08:42 | 显示全部楼层
假设是51
在可位寻址区定义一个32位数据:B31...B0,Bx表示这32位中的任意一位。输出为Px为任意一个输出IO。
汇编实现:
mov C,Bx
mov Px,C
C51实现:
Px=Bx;
mcu5i51 发表于 2012-3-24 09:52 | 显示全部楼层
通用的做法是数组或位移结合逻辑运算
lhkjg 发表于 2012-3-24 09:59 | 显示全部楼层
先定义位操作。然后把所有的位定义在一个字节里面
刘前辈 发表于 2012-3-24 12:19 | 显示全部楼层
本帖最后由 刘前辈 于 2012-3-24 12:20 编辑

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

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

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

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


、、
yangyangyangS 发表于 2012-3-31 14:10 | 显示全部楼层
进来学习下……
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
                          
}
huhandong 发表于 2012-3-31 17:49 | 显示全部楼层
自已稍多动手编点程,你就能成为你题中的"高手"
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;   //具体用的哪个口看硬件定义
}
joyme 发表于 2012-4-1 09:26 | 显示全部楼层
顺便给楼主出个题,按上面的方式,做出32位数顺序调整的代码贴上来,从低到高位分别用PORTA,B,C,D口,并假设每个口的顺序一样(简化命题),也算是督促楼主学习吧,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

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