C51编程中的自定义“位”及其保存方案
addr=0x7F6;//给一个原来的存储地址
REEPROM();//调用读取E2PROM的子程序
current_dat=Rdat;//将读出的数据还给通用的辅助字节变量
if(current_dat==0xA5) {//判断读出的数据是否等于“0xA5”
switch_sign=1;//将翻转标志位“switch_sign”置“1”
}
else {
switch_sign=0;//将翻转标志位“switch_sign”置“0”
}
31个字节保存8个自定义“位”
用保存一个自定义的字节变量来复原一个自定义标志位的过程上文已叙述了,接下来阐述1个字节变量保存8个自定义“位”的方案。1个字节变量保存8个自定义“位”的方案很多,例5是其中比较理想的一种:
#defineuint unsigned int
#defineuchar unsigned char
uintaddr;
ucharWdat,Rdat;
uchar bdatacurrent_dat;//在可位寻址区定义unsigned char类型的字节变量current_dat
sbitsign_bit1= current_dat^0;//用关键字sbit 定义位变量来独立访问可寻址位对象中的1位
sbitsign_bit2= current_dat^1;//自定义标志位2
sbitsign_bit3= current_dat^2;//自定义标志位3
……
sbitsign_bit8= current_dat^7;//自定义标志位8
……
void Bit_save() {//自定义标志位保存子程序
addr=0x7F6;//给予存储地址
Wdat= current_dat;//将current_dat赋值给写E2PROM的缓冲单元Wdat
save_data();//调用保存子程序存储current_dat数据
}
void Bit_comeback() {//自定义标志位复原子程序
addr=0x7F6;//给一个原来的存储地址
REEPROM();//调用读取E2PROM的子程序
current_dat=Rdat;
//将读出的数据还给通用的辅助字节变量
}
以上这段程序所阐述的,也许是有关自定义位操作及其保存的一种最简捷的方案了。首先是在可位寻址区定义ucsigned char类型的通用字节变量current_dat,再用关键字“sbit”定义位变量来独立访问可寻址位对象的其中一位。这样将自定义标志位提高到类同于特殊功能寄存器(SFR)中可位访问的方式来操作了——字节变量current_dat中的8个位各自可以独立操作,且其保存或读出复原都只要直接将字节变量current_dat进行保存或读取即可,无须像其他方案那样需要进行逻辑与、逻辑或等的辅助操作。
结语
单片机的C语言编程中不一定都要有自定义的标志位,但是在某些场合运用了自定义的标志位,会使整个程序显得简洁而明快。当然,对于自定义标志位的保存也是视其具体情况而定——应该说是不得已而为之的。
评论