C51系列单片机中_crol_指令是循环左移函数,_cror_是循环右移函数,这是51中特有的指令,别的类型单片机就不能使用了。易于程序的移植和通用性考虑个人比较推荐用<< 左移, 右移>>这两个C中的移位符号。
C语言
#include<reg51h>
void delay(unsigned int a)
{
unsigned i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
main()
{
unsigned LED,i;
LED = 0xfe;
EA = 0;
while(1)
{
for(i=0;i<7;i++){delay(100);LED = (LED<<1)|0x01;P3 = LED;}
for(i=0;i<7;i++){delay(100);LED = (LED>>1)|0x80;P3 = LED;}
}
}
汇编语言
LED EQU 30H
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
CLR EA
MOV SP,#5FH
MOV LED,#0FEH
MOV R0,#7
LOOP:
MOV R7,#50
LCALL DELAY
MOV A,LED
RL A
MOV LED,A
MOV P3,A
DJNZ R0,LOOP
MOV R0,#7
LOOP1:
MOV R7,#50
LCALL DELAY
MOV A,LED
RR A
MOV LED,A
MOV P3,A
DJNZ R0,LOOP1
MOV R0,#7
SJMP LOOP
;----------------------------
DELAY:
MOV R2,#8
DLY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY1
DJNZ R7,DELAY
RET
;-----------------------------
END
data
=
nBitmapDot[i]
>>
1;
//
nBitmap[i]右移一个二进制位,与
data
=
nBitmapDot[i]
/
2;
同效。
data
=
nBitmapDot[i]
<<
1;
//
nBitmap[i]左移一个二进制位,与
data
=
nBitmapDot[i]
2;
同效。
要说明的是移位 *** 作(<<
或
>>)效率更高。
说一下思路吧。主程序做一个标志位A(初始赋值0),一个判断语句(if之类的)判断此标志位A,A为0时,流水灯右移,否则,流水灯左移。中断程序里,让A自加1,然后判断,等于2时,将A赋值为0,其他情况不变。
希望能帮到你。
以上就是关于单片机 移位 *** 作 右移 C语言全部的内容,包括:单片机 移位 *** 作 右移 C语言、c语言和汇编的程序八个LED依次左移逐个点亮,点亮后在依次右移逐个点亮不断循环、单片机程序中数组中的值怎么实现位左(右)移(C语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)