#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
/
名称 : Delay()
功能 : 延时,延时时间为 10ms del
输入 : del
输出 : 无
/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/
名称 : Main()
功能 : 实现灯的闪烁
输入 : 无
输出 : 无
说明 :也可以使用例1的的方法来关闭数码管
/
void Main(void)
{
uchar i;
while(1)
{
P1 = 0xfe;
for(i=0; i<7; i++)
{
P1 = _crol_(P0, 1); //用于循环左移
Delay(15);
}
}
}
这是一个51单片机的P1口小灯循环左移的例子,不懂的问我。应该能用
C语言中,“<<”为左移运算符,“>>”为右移运算符。
具体使用方法如下:
1、左移运算符(<<)
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a << 2 将a的二进制位左移2位,右补0,
左移1位后a = a 2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
2、右移运算符(>>)
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
*** 作数每右移一位,相当于该数除以2。
例如:a = a >> 2 将a的二进制位右移2位。
左补0 or 补1 得看被移数是正还是负。
ORG 0 //开始位置地址,0x00
START: MOV R2,#8 //将8写入R2寄存器
MOV A,#0FEH //将0xfe写入A
SETB C //进位标志位C(CY)置1
LOOP: MOV P1,A //将A里面的数值送到P1口
LCALL DELAY //长跳转,跳到DELAY
RLC A //A数值左移一位,最高位移进C,C移到A最低位
DJNZ R2,LOOP //R2减一,判断不等于0,跳转到loop
MOV R2,#8 //将8写入R2寄存器
LOOP1: MOV P1,A //将A里面的数值送到P1口
LCALL DELAY //长跳转,跳到DELAY
RRC A //A数值右移一位,最高低位移进C,C移到A最高位
DJNZ R2,LOOP1 //R2减一,判断不等于0,跳转到LOOP1
LJMP START //跳转到START
DELAY: MOV R5,#20 ;//DELAY 函数,延时作用
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET //返回到断点
END//结束指令
以上就是关于急求!求一个使单片机控制P1端口的8个LED灯做作左移流水灯的C语言程序(用循环结构)全部的内容,包括:急求!求一个使单片机控制P1端口的8个LED灯做作左移流水灯的C语言程序(用循环结构)、C程序中,左移“<<”、右移“>>” 的具体用法是什么、单片机程序说明解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)