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

[复制链接]
 楼主| 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语言就这样的?
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字节的,都有,呵呵。

如果想深入了解的话,就去查它们的原型。不过一般是用宏来写的,嵌入汇编。
butlet 发表于 2011-1-24 10:33 | 显示全部楼层
左环移和左移是不一样的,参见intrins
小武153535 发表于 2011-7-24 17:57 | 显示全部楼层
用循环左移,LIGHT= _crol_(LIGHT,1)   ;
程序前边需加#include<intrins.h>
刘前辈 发表于 2011-7-25 08:17 | 显示全部楼层
本帖最后由 刘前辈 于 2011-7-25 08:18 编辑

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

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

LIGHT=(LIGHT<<2) | aaa;

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



、、
lixiaoxu2meng 发表于 2011-7-25 10:12 | 显示全部楼层
5楼正解
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

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