打印
[51单片机]

怎么只用P2中的3个管脚?和剩余的5个互不影响

[复制链接]
885|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbc0602|  楼主 | 2014-3-15 23:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的板子用P2.2\P2.3\P2.4接了74LS138来控制数码管的位选,同时P2.5\P2.6\P2.7又接了按键。
想通过控制P2口整体来扫描数码管,同时又不影响到按键的扫描:
程序:
================================================
sbit KEY_1=P2^7;//独立按键K1
sbit KEY_2=P2^6;//独立按键K2
sbit KEY_3=P2^5;//独立按键K3,用于LED检测

uchar code LED_WEI[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1C};//74LS138的3个输入端接在了P2.2-P2.4,此处用作8个数码管的位选
                P2=LED_WEI[5];//百位
                P3=LED_CODE[LED_num/100];
                P2=LED_WEI[6];//十位
                P3=LED_CODE[LED_num%100/10];
                P2=LED_WEI[7];//个位
                P3=LED_CODE[LED_num%100%10];
================================================
以上是错误的写法,这样会影响到按键的扫描,应该怎么写呢?
我想要类似这种写法:P2=LED_WEI[5]|0xe3;//百位(这样显然也是不对的)
还是应该先读取P2口当前的状态,再和LED_WEI[i]相或?
例如:
      uchar P2_status;
      P2_status=P2;
      P2=P2_status|LED_WEI[5]
      。。。


相关帖子

沙发
pdcboy| | 2014-3-16 10:42 | 只看该作者
采用位控制,看看我下面的程序合不合适:

sbit A0=P2^2;       //74LS138地址端口A1 A2 A3
sbit A1=P2^3;
sbit A3=P2^4;

unsigned char ucLedseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共阴极数码管段码
void Delay10ms()     //软件延时子函数
{
        unsigned int i,j,k;
  for(i=0;i<3;i++)
    for(j=0;j<40;j++)
      for(k=0;k<9;k++);
}

//扫描采用一个循环语句,列如
while(1)
{
A2=0;
A1=1;
A0=0;
P3=ucLedseg[num/100];        //假设num为要显示的数值,P3口位数码管位码,此处显示百位值
Delay10ms();   //延时子函数
A2=0;
A1=0;
A0=1;
P3=ucLedseg[num/10%10];  //显示十位数值
Delay10ms();
A2=0;
A1=0;
A0=0;
P3=ucLedseg[num%10]; //显示个位数值
Delay10ms();
}

不知这个想法可以不,主要是采用位控制,而不是写整个IO口的值。

使用特权

评论回复
板凳
hbc0602|  楼主 | 2014-3-16 13:14 | 只看该作者
pdcboy 发表于 2014-3-16 10:42
采用位控制,看看我下面的程序合不合适:

sbit A0=P2^2;       //74LS138地址端口A1 A2 A3

这样写我肯定知道啊,只是觉得繁琐了,想用简洁点的写法来实现。
感谢你的回复。延时我是用定时器来延时的,不单独写一个延时函数。那样太浪费CPU资源了

使用特权

评论回复
地板
ZG11211| | 2014-3-16 16:26 | 只看该作者
想节约资源,用定时器吧,延时程序丢弃。

使用特权

评论回复
5
xyz549040622| | 2014-3-16 16:40 | 只看该作者
如果支持位操作,用位操作多快呀,整体操作很繁琐

使用特权

评论回复
6
hbc0602|  楼主 | 2014-3-17 00:32 | 只看该作者
ZG11211 发表于 2014-3-16 16:26
想节约资源,用定时器吧,延时程序丢弃。

我是设了一个2MS的定时器,然后需要多长延时再另外设一些累计定时中断次数的变量来达到延时效果。这样很多功能都可以独立运行互不影响。不过这个帖子问的不是延时的问题...

使用特权

评论回复
7
hbc0602|  楼主 | 2014-3-17 00:32 | 只看该作者
xyz549040622 发表于 2014-3-16 16:40
如果支持位操作,用位操作多快呀,整体操作很繁琐

支持位操作的,只是想知道高手有没有简洁的写法而已

使用特权

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

本版积分规则

5

主题

27

帖子

0

粉丝