原创 51单片机复习札记之二——流水灯

2010-7-18 10:43 3729 13 13 分类: MCU/ 嵌入式

51单片机最经典的也是入门的实验就是流水灯。我的开发板的LED接在P1口。8个LED从上到下轮流点亮,也即从P1.0到P1.7依次输出低电平。实现的方法很多,下面是其中一种方法,用的C语言的位运算符号的左移“<<”。


方法一(只写上主程序):


void main(void)


{


       unsigned  
char a = 0xFE;


       while(1) 


       {


              P1
= a;


              a
= (a << 1) | 0x01;


              if(a
== 0xFF)a = 0xFE;


              Delay(500);    //延时约500ms


       }



另一常用方法就是用INTRINS.H头文件中的循环移位函数。


方法二(只写上主程序):


void main(void)


{


       unsigned
char a = 0xFE;


 


       while(1) 


       {


              P1
= a;


              a
= _crol_(a,1);


              Delay(500);    //延时约500ms


       }


}


 


让LED亮起来不难,在此主要是通过这个实验了解和熟悉INTRINS.H头文件。下面是该头文件的内容和用法。


/*--------------------------------------------------------------------------


INTRINS.H


 


Intrinsic functions for C51.


Copyright (c) 1988-2004 Keil Elektronik
GmbH and Keil Software, Inc.


All rights reserved.


--------------------------------------------------------------------------*/


 


#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


 


INTRINS.H头文件:




内部函数             描述

_crol_           字符循环左移

_cror_           字符循环右移

_irol_            整数循环左移

_iror_            整数循环右移

_lrol_            长整数循环左移

_lror_            长整数循环右移

_nop_            空操作8051 NOP 指令

_testbit_               测试并清零位 8051 JBC 指令




函数名: _crol_,_irol_,_lrol_

原 型: unsigned char _crol_(unsigned char val,unsigned char n);

unsigned int _irol_(unsigned int val,unsigned char n);

unsigned int _lrol_(unsigned int val,unsigned char n);




举例:




_crol_,_cror_: 将char型变量循环向左(右)移动指定位数n位后返回


_testbit_:
相当于JBC bitvar测试该位变量并跳转同时清除。


_chkfloat_:
测试并返回源点数状态。




就是汇编中的子函数。

_crol_,_cror_:如果二进制数为01010101
那么_crol_(1) 左移1位后将高位补低位。

结果10101010。


功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。

例:

#include <intrins.h>

main()

{

unsigned int y;

y=0x00ff;

y=_irol_(y,4);

}




函数名: _cror_,_iror_,_lror_

原 型: unsigned char _cror_(unsigned char val,unsigned char n);

unsigned int _iror_(unsigned int val,unsigned char n);

unsigned int _lror_(unsigned int val,unsigned char n);

功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。

例:

#include <intrins.h>

main()

{

unsigned int y;

y=0x0ff00;

y=_iror_(y,4);

}




函数名: _nop_

原 型: void _nop_(void);

功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。

例:

P()=1;

_nop_();

P()=0;




函数名: _testbit_

原 型:bit _testbit_(bit x);

功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的


 


参考文献:


【1】 http://blog.ednchina.com/erictang/431115/Message.aspx
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
13
关闭 站长推荐上一条 /3 下一条