|(3<<6) //0:P13 port, 1:SEG17 Function, 2:AN10 Function, 3: BUZO Function
|(3<<4) //0:P12 port, 1:SEG16 Function, 2:AN11 Function, 3:T1O/PWM1O Function
|(0<<2) //0:P11 port, 1:SEG15 Function, 2:AN12 Function, 3: T2O/PWM2O Function //T2O function setting
|(3<<0) //0:P10 port, 1:SEG14 Function, 2:AN13 Function, 3:RXD1/SCL1/MISO1 Function
第一次阅读这样的程序,感觉很有爱。每一位的含义用这种方式可以清晰告诉用户,在构建程序时这种做法非常好用,不必在翻阅datasheet做往返运动。
1、假设P1=0X12345678;需要把第二位置为1,即P1=0x1234567a,在具体赋值时,采用如下方式为常见做法。
1.重置
P1=P1 & 0xFFFFFFF0;
2.赋值
P1=P1 | 0x0000000A;
注意按位或| 与逻辑或||的区别。
2、将P1=0b01011010前4位转为1100。
1.重置
P1 = P1 & 0b00001111 = 0b00001010
2.赋值
0b00001100<<4=0b11000000
P1= P1 | 0b11000000 = 0b11001010
在嵌入式mcu中,一些小内存的在表示一些变量的时候可以预算最大范围然后分配合理的位数,达到节省内存的功效
例如在当我在车机上做IPOD的时候,一些参考量就可以这样表示
#define ipod_sndend IPOD_Flag1[0].mem.bit0/*1:MCU已经把所有字节发送给IPOD*/
#define ipod_revend IPOD_Flag1[0].mem.bit1/*1:MCU已经把所有IPOD发送过来的字节接收完毕*/
#define ipod_receiving IPOD_Flag1[0].mem.bit2/*1:sending; 0:ready for sending*/
#define ipod_change_cate IPOD_Flag1[0].mem.bit3 /*1: category need changed*/
#define ipod_new_track IPOD_Flag1[0].mem.bit4
#define ipod_select_track IPOD_Flag1[0].mem.bit5/* 1:get select track */
#define ipod_revdata IPOD_Flag1[0].mem.bit6/*1:get a 8bit data*/
#define ipod_changindex IPOD_Flag1[0].mem.bit7/* 1: need to change to record index*/
#define ipod_plus_in IPOD_Flag1[1].mem.bit0/*1: ipod enter work*/
#define ipod_lage_data IPOD_Flag1[1].mem.bit1/*1: lagest 0 unnormal yhx*/
#define ipod_lage_data2 IPOD_Flag1[1].mem.bit2/*1: big 0 normal yhx*/
#define ipod_prev_key IPOD_Flag1[1].mem.bit3/*1: big 0 normal yhx*/
#define ipod_truck_sel IPOD_Flag1[1].mem.bit4/*1: big 0 normal yhx*/
#define ipod_next_key IPOD_Flag1[1].mem.bit5/*1: big 0 normal yhx*/
从而大大节省了空间。 注意大小端问题,本人在移植时候出现困惑,总的来说大小端问题是一字节为单位的,而具体位的顺序与大小端无关系。
位的先后顺序与发送从高字节还是低字节发有着紧密关系。例如串口通信,用示波器打出来的波形位顺序是反的,因为串口发送数据是先发低位。
在嵌入式中位定义,如sbit sfr 重叠地址问题
sfr P0 = 0x80; // P0 Data Register
sbit P00 = 0x80;
sbit P01 = 0x81;
sbit P02 = 0x82;
sbit P03 = 0x83;
sbit P04 = 0x84;
sbit P05 = 0x85;
sbit P06 = 0x86;
sbit P07 = 0x87;
查询寄存器表的时候,会查到0x81指向的另一个sfr寄存器,这里要讲的就是sbit必须在可位寻址时才可以用sbit,如图中所示, (现代单片机,ABOV调试器很好用哎)