在MCS-51单片机片内数据存储器中,有两部分按位寻址的存储空间:一部分是片内RAM的20H~2FH共16个字节单元128位,其位地址为00H~7FH;另一部分是特殊功能寄存器区,其字节地址能被8整除的专用寄存器也具有位地址,其位地址为80H~F7H,中间有极少数位未被定义,不能按位寻址。
在汇编语言中,位地址的表达方式有下述几种。
(1)直接用位地址表示。例如D4H、2FH。
(2)用点操作符号表示。点操作符(即.)的前面部分是字节地址或是可位寻址的专用寄存器;其后面部分的数字表示它们的位。例如ACC.4、PSW.7。
(3)寄存器的位定义名称。例如TR0、OV。
(4)用户定义的位符号地址。例如,RED BIT P1.4,即将P1.4定义为位符号地址RED。定义后,可在指令中用RED代替P1.4。
下面对位操作指令分类予以介绍。
MOVC,bit ;C←(bit)
MOVbit,C ;bit←C
说明:第一条指令的功能是将位地址中的1位二进制数送入位累加器C中,第二条指令的功能则是将位累加器C的内容送到指定的位地址。位数据传送指令必须通过位累加器C来实现,其中一个操作数必须是位累加器C,另一个操作数可以是任何直接寻址的位。
例如,已知片内数据存储器中(20H)=80H,P1口输出的数据为42H,执行下列程序后操作结果为:C=1,P1.7=1,P1口输出数据为C2H。
MOV C,07H ;C←(20H).7
MOV P1.7,C ;P1.7←C
又如:将位单元00H的内容传送到位单元20H中。
MOV C,00H ;C←(00H)
MOV 20H,C ;00H的内容送20H单元
【例3-12】试编程把56H位中的内容和78H位中的内容相交换。
解:为了实现56H和78H位地址单元中内容变换,可以采用00H位作为暂存位,相应程序如下。
MOV C,56H ;C←(56H)
MOV 00H,C ;暂存于00H
MOV C,78H ;C←(78H)
MOV 56H,C ;存入56H位
MOV C,00H ;56H位的原内容送C
MOV 78H,C ;存入78H位
在程序中,00H、56H和78H均为位地址。其中,00H是指20H单元的最低位,56H是指2AH单元的次高位,78H是2FH单元的最低位。
CLR C ;C←0,对C清零
CLR bit ;(bit) ←0,对直接位地址中的内容清零
CPL C ;C←C,对C取反
CPL bit ;(bit) ←( ),对直接位地址中的内容取反
SETB C ;C←1,对C置位
SETB bit ;(bit) ←1,对直接位地址中的内容置1
上述6条指令的功能是对位累加器C或直接寻址的位分别进行清零、取反、置1,操作不影响其他标志位。
ANL C,bit ;C←C(bit)
ANL C,/bit ;C←C()
ORL C,bit ;C←C(bit)
ORL C,/bit ;C←C()
上述4条指令的功能把位累加器C的内容及直接指定的位地址的内容分别进行逻辑与、逻辑或,结果存于C中。指令中的“/”表示对该位地址内容取反后(不改变位地址内的原内容)再参与运算。
例如,设位地址(20H)=1,ACC.7=1,执行下列指令后操作结果为:C=1。
MOV C,20H
ANL C,ACC.7
JC rel ;若C=1,则转移(PC←PC+2+rel);否则程序顺序执行
JNC rel ;若C=0,则转移(PC←PC+2+rel);否则程序顺序执行
JB bit,rel ;若(bit)=l,则转移(PC←PC+3+rel);否则程序顺序执行
JNB bit,rel;若(bit)=0,则转移(PC←PC+3+rel);否则程序顺序执行
JBC bit,rel;若(bit)=l,则转移(PC←PC+3+rel);若(bit)=0;则程序顺序执行
上述5条指令均为相对转移指令,前两条指令为双字节指令,后3条为三字节指令。它们的功能是:分别检测指定位是1还是0,若条件符合,则CPU转向指定的目标地址去执行程序;否则,顺序执行下条指令。前4条指令不影响位地址内容,第5条指令不论条件是否满足,将使指定位地址内容清0。
【例3-13】用单片机来实现图3-12所示的电路的逻辑功能。
图3-12 用位处理实现的逻辑电路
解:为了使逻辑问题适合用单片机来处理,先选择一些端口位作为输入逻辑变量和输出逻辑变量。
设P1.0=A,P1.1=B,P1.2=C,P1.3=D,P1.4=Z,程序如下。
MOV C,P1.0 ;读入变量A
ANL C,P1.1 ;和B相与
CPL C ;将A与B取反
MOV 00H,C ;保存中间运算结果到00H
MOV C,P1.2 ;读入变量C
ANL C,P1.3 ;和D相与
ANL C,/P1.3 ;再和D的非相与
ORL C,00H ;再和将A与B取反的值相或
CPL C ;结果取反
MOV P1.4,C ;输出运算结果