【51单片机系列】点灯大师三之流水灯
本文实现了LED D1 ~ D8 ~ D1逐个点亮,表现流水灯的效果。
LED流水灯的实现
硬件实现
使用proteus设计如下LED模块。
软件实现
轮流点亮过程中用到了头文件intrins.h
中的函数_cror_()
和crol_()
。附录提供了intrins.h
头文件中的内容及说明。
函数_cror_(val, n)
将unsigned char类型的数据val循环右移n位,若n=1,即首先将数据右移一位,然后将原来bit0的数据放到bit7的位置;比如对于数据11011001
调用_cror_
后得到11101100
;
函数_crol_(val, n)
将unsigned char类型的数据val循环左移n位,若n=1,即首先将数据左移一位,然后将原来bit7的数据放到bit0的位置;比如对于数据11011001
调用_crol_
后得到10110011
。
实现代码如下:
仿真结果
附录
intrins.h头文件内容如下:
/*--------------------------------------------------------------------------
INTRINS.H
Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__
#pragma SAVE
#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif
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);
#if defined (__CX2__)
extern int abs (int);
extern void _illop_ (void);
#endif
#if !defined (__CX2__)
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif
#pragma RESTORE
#endif
比较常用的是上面8个函数,作用分别如下:
空操作指令函数_nop_
_nop_()
函数产生一个NOP指令,该函数可以用作C程序的时间比较,C51在_nop_
函数工作期间不产生函数调用。
测试并清零指令_testbit_
_testbit_(val)
函数产生一个JBC指令,该函数测试一个位,当置位时返回1,否则返回0,该函数只能用于可直接寻址的位,在表达式中不允许使用。
循环移位函数_cror_
、_crol_
、_iror_
、_irol_
、_lror_
、_lrol_
_cror_(val, n)
将unsigned char类型数据val循环右移n位;_crol_(val, n)
将unsigned char类型数据val循环左移n位;_iror_(val, n)
将unsigned int类型数据val循环右移n位;_irol_(val, n)
将unsigned int类型数据val循环左移n位;_lror_(val, n)
将unsigned long类型数据val循环右移n位;_lrol_(val, n)
将unsigned long类型数据val循环左移n位;