打印

STCAT90C516RD+(与MCS51兼容)移位点灯问题

[复制链接]
3188|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
doliphin|  楼主 | 2011-1-22 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#define  LIGHT P0
#define  uint unsigned int
void delay(uint N);
main()
{
        LIGHT=0xfe;
  while(1)
  {
   delay(50000);
   LIGHT=LIGHT<<2;
  }
  
}

void delay(uint N)
{
  int i;
  for(i=0;i<N;i++);
}


程序这么写的,LED灌电流点亮,低电平灯亮,为什么程序跑起来挨着个得给我点亮,最后全亮了,移位到底是怎么移的。

相关帖子

沙发
ayb_ice| | 2011-1-22 14:57 | 只看该作者
还是去复习C语言吧

使用特权

评论回复
板凳
lkf123010| | 2011-1-22 15:06 | 只看该作者
移位之后会补零,你程序中LIGTH变量移位4次之后就变全零了,所以全亮了

使用特权

评论回复
地板
doliphin|  楼主 | 2011-1-23 10:52 | 只看该作者
记得汇编语言移位就是循环移位并没有补零,C语言就这样的?

使用特权

评论回复
5
sdpz| | 2011-1-24 09:14 | 只看该作者
:lol  c51函数库里就有移位的函数啊
#include <intrins.h>

这头文件的内容是:
#ifndef __INTRINS_H__
#define __INTRINS_H__

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);

#endif

其中_crol_()就是楼主想要的单字节循环左移。_cror_()是单字节循环右移。
再认真看看,双字节的,4字节的,都有,呵呵。

如果想深入了解的话,就去查它们的原型。不过一般是用宏来写的,嵌入汇编。

使用特权

评论回复
6
butlet| | 2011-1-24 10:33 | 只看该作者
左环移和左移是不一样的,参见intrins

使用特权

评论回复
7
小武153535| | 2011-7-24 17:57 | 只看该作者
用循环左移,LIGHT= _crol_(LIGHT,1)   ;
程序前边需加#include<intrins.h>

使用特权

评论回复
8
刘前辈| | 2011-7-25 08:17 | 只看该作者
本帖最后由 刘前辈 于 2011-7-25 08:18 编辑

“与别人一样,是不是很闷?”

玩一个与别人不一样的。  
uchar  aaa;
aaa=LIGHT<<2;

LIGHT=(LIGHT<<2) | aaa;

再玩一个HOT大叔写的“红杏出墙——伪本征函数扩展”,看看HOTpower如何用C宏实现汇编RRL语句。



、、

使用特权

评论回复
9
lixiaoxu2meng| | 2011-7-25 10:12 | 只看该作者
5楼正解

使用特权

评论回复
10
lixiaoxu2meng| | 2011-7-25 10:41 | 只看该作者
#include <reg51.h>
#define  LIGHT P0
#define  uint unsigned int
void delay(uint N);
main()
{
    uint  Data;
     Data  =0xfe;
     LIGHT = Data  ;
  while(1)
  {
   delay(50000);
   //LIGHT=LIGHT<<2;
  LIGHT = rrl(Data  );
  }
  
}

void delay(uint N)
{
  int i;
  for(i=0;i<N;i++);
}

unsigned char rrl(unsigned char data)//循环左移
{
  if(data&0x80)
    {
     data <<= 1;
     data |=0x01;
      }
  else
     {
      data<<=1;
      }
  return data;
  }
程序 这么该也可以实现 循环左移
而不用循环左移函数

使用特权

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

本版积分规则

0

主题

195

帖子

2

粉丝