51单片机学习
2022/10/3 wreath
led流水灯
补充的c语言知识
- 位运算符
运算符 | 含义 | 描述 |
---|---|---|
& | 按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |
I | 按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
^ | 按位异或 | 若参加运算的两个二进制位值相同则为0,否则为1 |
~ | 取反 | ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 |
<< | 左移 | 用来将一个数的各二进制位全部左移N位,右补0 |
>> | 右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0 |
- sbit
定义特殊功能寄存器的位变量。sbit P0_0=P0^0; //即定义P0_0为P0口的第1位,以便进行位操作。
1.笨办法
2.位移
#include<REGX52.H>
#define LED_PORT P2 //宏定义P2端口
//延迟时间函数
void delay_10us( int ten_us)
{
while(ten_us--);
{
}
}
void main()
{
int i;
while(1)
{
for(i=0;i<8;i++)
{
LED_PORT=~(0X01<<i);
delay_10us(50000);
}
}
3.使用库函数位移
#include<REGX52.H>
#include<intrins.h>
#define LED_PORT P2//宏定义P2端口
//延迟时间函数
void delay_10us( int ten_us)
{
while(ten_us--);
{
}
}
void main()
{
int i;
LED_PORT=~(0x80);
while(1)
{
for(i=0;i<7;i++)
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
}
}
使用库函数#include<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);
//右移right
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
//左移left
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
*crol
向左循环移位时,从左边出去会从右边边重新补入
*cror
向右循环移位时,从右边出去会从左边重新补入