1. 位运算
&:按位与 (与0得0、与1不变)(全1为1,有0得0)指定位置0
|:按位或 (或1得1、或0不变)(全0为0,有1得1)指定位置1
^:按位异或 (相同为0、相异为1) (异或1翻转原位, 异或0原位不变) 指定位翻转 num ^ num == 0 num ^ 0 == num
~:按位取反
>>:右移
(算数右移:有符号signed 正数左补0 负数左补1)
(逻辑右移:移动不考虑正负)
缩小:除以2^n
<<:左移
放大:乘以2^n
让一个字节第n位(从右往左第n位)置1:
P0 |= (1 << n);
让一个字节第n位(从右往左第n位)置0:
P0 &= ~(1 << n);
让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置1:
P0 |= ((1 << n) | (1 << m));
让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置0:
P0 &= ~((1 << n) | (1 << m));
让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)翻转:
P0 ^= ((1 << n) | (1 << m));
2. stc89c51、stc89c52内存
二者自身内部含有128字节空间,之后厂商外部扩展了512字节存储空间
keil环境中,一般定义变量开辟空间在128字节自身空间中,若想在外部扩展空间为定义的变量开辟空间,则格式为:xdata unsigned int n = 0;
3. LED对应寄存器本质
#define P2 (*((unsigned char *)0xA0))
P2 = 0x80;
4. 点亮流水灯代码
#include <reg51.h>
#include <string.h>
#include "led.h"
void Delay(unsigned int n)
{
while (--n)
{
}
}
int main(void)
{
unsigned char n = 1;
int i = 0;
LedAllOff();
Delay(0xffff);
while (1)
{
for (i = 0; i < 7; i++)
{
LedOn(n);
Delay(0xffff);
n <<= 1;
}
LedAllOn();
Delay(0xffff);
for (i = 0; i < 7; i++)
{
LedOn(n);
Delay(0xffff);
n >>= 1;
}
LedAllOn();
Delay(0xffff);
}
return 0;
}
#ifndef _LED_H //.h头文件只放声明不放定义
#define _LED_H
extern void LedAllOn(void);
extern void LedAllOff(void);
extern void LedOn(unsigned char n);
#endif
#include "led.h" //.c源文件只放定义不放声明
#include <reg51.h>
void LedAllOn(void)
{
P2 = 0;
}
void LedAllOff(void)
{
P2 = 0xff;
}
void LedOn(unsigned char n)
{
P2 = n ^ 0xff;
}