打印

我又来请教高手了,哈哈

[复制链接]
1072|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
辉扬的心|  楼主 | 2009-5-5 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机P0口高4位接上拉电阻接4个LED灯,低4位开关接GND。P00合上,P04的LED亮,P01合上,P05的LED亮,依次,P03合上,P07的LED亮。开关合上就接地了,高4位输出0,灯就亮了。
我的程序编好了,效果也出来了,如下:
思路1
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void main()    
{
 uchar a,b,c,m,n,i;
 
 b=0xff; 
 P0=0xff;
 while(1)
    {  a=0x01; 
    for(c=0;c<5;c++)

{  m=P0|(~a);
    if(m==(~a))    //检测P1_0按键是否按下
       {
         i=a;
        b=(b&(~i))&(~(i<<4));
        P0=b;
       }
       else
       {
       b=((b|i)|(i<<4));
       P0=b;
       }
       a=a<<1;
       
//       for(m=0;m<255;m++)
       for(n=0;n<200;n++);
      
             
          }}
   }
用的是循环,教材上是用的低4位逐一判断,然后输出,很易懂。

我又尝试这样的思路:首先将P0口的状态读入赋给a,然后a=((a<<4)|(a&0x0f)),再把a赋给P0口,这样不是简单很多,程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void main()    
{
 uchar a,n;
 while(1)
 {
   a=P0;
   a=((a<<4)|(a&0x0f));
   P0=a;
   for(n=0;n<200;n++);
 }
}
结果肯定错了,不然我也不会上来请教了,想了半宿,硬是没有想通,哪里错了。

最后再问一个Keil51软件的问题,如图:程序仿真时,port0框内,P0栏8个状态位和下面的Pins状态位有什么关系?为什么有时上下状态一致有时不一致?为什么聂?

搬个板凳坐到等,^_^

相关帖子

沙发
辉扬的心|  楼主 | 2009-5-6 23:49 | 只看该作者

.......

木有人.

不过到单片机版块解决问题了

圈圈给的提示很重要,是根本.

引用下:
引用俺书里的一段: 

“这样就可以看到P2口的每个引脚电平了,打勾的表示高电平1,没打勾的表示低电平0。显示有两行,上面一行表示程序设置的状态,而下面一行表示管脚实际的电平状态,如图2.11.10所示。
    我们可以修改下面一行的值,来模拟外部电平输入。注意,51单片机在输出低电平时,是强驱动的,这时我们不能强行将一个高电平加在端口上。在仿真中也是如此,如果上面一行没打勾,而将下面一行打勾时,就会弹出一个出错的对话框。输出为高电平时,是弱驱动,可以直接将低电平加在端口上。因此当我们需要将IO口作为输入口使用时,应该给将对应的端口设置为1。这个特性就是所谓的准双向IO口,51单片机的特色之一。

 
 

使用特权

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

本版积分规则

24

主题

312

帖子

0

粉丝