C51的程序经都会遇到这样的代码,Px口第n位的引脚定义写作 Px^n
然后 ,对引脚的读写操作,是跟变量一样的。
sbit LED1 =P3^4;
sbit LED2 =P3^5;
sbit KEY1 =P3^0;
sbit KEY2 =P3^1;
//。。。。。。
if(KEY1 ==0 ) { LED1 = 0; }
if(KEY2 ==0 ) { LED2 = 0; }
//。。。。。。
arduino用的顺手,移植但是arduino 编程并没有 sbit这个鬼,引脚多修改会有些繁琐,为了快速我门写个类模拟一下 sbit,当然除了执行效率,在代码上的确可以节省很多替换的工作量的。
直接源码
//定义一个类
class sbit{
int x;
public:sbit(int i=0){x=i;}
void I(bool pullup=false){pullup?pinMode(x,INPUT_PULLUP):pinMode(x,INPUT);}
void O(){pinMode(x,OUTPUT);}
void operator=(int v) {digitalWrite(x,v);}
bool operator==(int v) {return v==digitalRead(x);}
};
//定义针脚
sbit led(13);
//
void setup() {
Serial.begin(9600);
}
int n=0;
void loop() {
//设置为输出
led.O();
//引脚赋值
led=n%2;
delay(1000);
//设置为输入
led.I();
//读取比较
Serial.println(led==1);
n++;
}
主要原理就是用运算符重载的方法模拟sbit 的 =赋值和==比较。
参考
C 程序设计(谭浩强完整版)运算符重载
https://wenku.baidu.com/view/b4a40bb35ff7ba0d4a7302768e9951e79b8969c5.html
c 运算符重载总结
https://wenku.baidu.com/view/be73037b42323968011ca300a6c30c225901f081.html