嵌入式经常用到的移位,赋值,表示问题

P1FSRL =0 //Port 10~13 Function Selection Low Register
|(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调试器很好用哎)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值