1、pic单片机的汇编语言中,目前还没有直接能对位取反的指令,只有对寄存器取反的指令,比如:
COMF F,d ;
这条语句中“F”是寄存器的名称,当“d=1”时,结果存入“F”,当“d=0”时,结果存入“W”。这个“W”书面解释是工作寄存器。可理解为过渡寄存器或临时寄存器,做中转数据用。
2、在汇编语言中要实现位取反,可通过位状态检测判断来对位进行“置1”或“清零”,详见以下程序。
目的:将寄存器 PROTB,3 取反
;
BTFSS PORTB,3 ; 检测PORTB,3位,为1跳转QINGLING。
GOTO ZHIYI ; 为0跳转到ZHIYI。
QINGLING ; 清零程序段,这是网络标号,可理解为一段程序的名称。
BCF PORTB,3 ; 判断之前PORTB,3位为1,这句作用是将 PORTB,3 清零 。
GOTO WORK ; 跳转到 WORK 程序段继续运行。
ZHIYI ; 置1程序段, 这是网络标号,可理解为一段程序的名称。
BSF PORTB,3 ; 判断之前PORTB,3位为0,这句作用是将 PORTB,3 置1。
GOTO WORK ; 跳转到 WORK 程序段继续运行。
WORK
;
;注意注意,编程时,指令必须用TAB键空出一格,网络标号必须顶格
;
定义按键最好用:sbit P32=P3^2;
取反最好用: CY=!CY;
你按键没有去抖动,当你按下P32时很可能触发该语句多次,如果是偶数次的话就相当于没有取反。
如果还解决不了问题,请多贴点代码上来。
scanf("%o",&a);
//8进制读取
b=a>>4;
//右移4位,a是无符号的,左边补0,
--->
2的4次方=16,
所以
相当于
b
=
a
/
16
c=~(~0<<4);
对0先按位取反,
得
-1,再左移4位,,
低位补0,
得
-16
(1111110000),
再取反,得
(0000001111),
即
15
d=b&c;
//按位与,
因为
c=15
的二进制只有低4位是1,
也就是把b的二进制只取低4位,
其余位全置0,
相当于
d
=
b
%
16
所以,
最后的结果相当于
d
=
a
/
16
%
16
printf("%o\n%o\n",a,d);
//
以8进制输出
这个一般是对开关量或者某个字节的某些位,所做的 *** 作,比如某个开关量I00原来处于吸和状态,它是1,现在取反一下,就变成0;某个字节,里头的数据是11001100,那对它进行取反,就是00110011
以上就是关于pic单片机怎么用户汇编语言实现位取反全部的内容,包括:pic单片机怎么用户汇编语言实现位取反、C51 取反~怎么用啊,为什么不好使呢、c语言程序,按位取反问题,求帮助等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)