51单片机汇编控制8个流水灯 5
总共有8个灯。效果是从第一个灯亮,灭。第二个灯亮,灭……亮到第8个灯的时候,第8个灯常亮,第2次循环到第7个位置常亮,以此类推,知道所有的灯都亮着。...
总共有8个灯。效果是从第一个灯亮,灭。第二个灯亮,灭……亮到第8个灯的时候,第8个灯常亮,第2次循环到第7个位置常亮,以此类推,知道所有的灯都亮着。
展开
3个回答
展开全部
思路:
循环控制常亮状态的值,将其从最高位循环到最低位。这个用于最后状态的常亮
在常亮循环中,控制不是常亮的其它所有位进行再次循环,逐渐从最低位亮灭循环到最高位
代码如下:
#include <reg51.h>
unsigned char PData; //整体结果
unsigned char CurrData;//变化的最高位
//延时,本函数是非精确延时,若需要精确延迟则需要根据本函数的汇编语句进行精确计算后调整循环体次数
void delay(unsigned int ms){
unsigned char i;
while(ms--){
for(i=0;i<120;t++){
;
}
}
}
void main(){
unsigned char i=0,j=0;
PData=0x00;//全灭状态
for (i=8;i>0;i--){//控制常亮的位置,先从最高位开始,依次循环到最低位
for (j=0;j<i-1;j++){//从最低位循环到不是常亮的最高位
P1=~(PData+(1<<j));//第i位亮
delay(500);
P1=~PData;//第i位灭
delay(500);
}
PData=PData+(1<<(i-1));//置最高位为常亮状态
P1=~PData;
delay(500);
}
//停机
while(1){
;
}
}
宿兴电子
2024-11-28 广告
2024-11-28 广告
联系我们一、有无震荡源 无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。 二、价格不同 有源蜂鸣器往比无源蜂鸣器贵,就是因为里面多个震荡...
点击进入详情页
本回答由宿兴电子提供
展开全部
这是C程序。。。汇编忘记不太会了。P1口接8个LED灯
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar j,temp;
int i = 8;
void delay(unsigned int ms) //延时
{
uchar t;
while(ms--)
for(t=0;t<123;t++); //500*122
}
void display(int wei) //显示
{
P1=0xff; //P1口拉高。低电平LED灯亮。
temp = 0x7F; //0111 1111 通过位右移达到流水灯目的
delay(500); //500ms?
for(j=1;j<=wei;j++) //wei为选择右移的位数
{
P1=temp;
delay(500);
if(j != wei) //当右移位数到后,那一位常亮不闪。
{
P1&=~temp;
delay(500);//延时闪烁
temp=_cror_(temp,1);//循环右移当位数到后,停止右移
}
}
}
void main() //主函数
{
while(1)//主函数循环
{
switch(i)
{
case 1:
display(1);
break;
case 2:
display(3);
break;
case 3:
display(3);
break;
case 4:
display(4);
break;
case 5:
display(5);
break;
case 6:
display(6);
break;
case 7:
display(7);
break;
case 8:
display(8);
break;
default:break;
}
i--;
if(i==0)
{
P1=0x00;//常亮
//i=8;//或者返回重新开始
while(1);//程序停在这里?
}
}
}
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar j,temp;
int i = 8;
void delay(unsigned int ms) //延时
{
uchar t;
while(ms--)
for(t=0;t<123;t++); //500*122
}
void display(int wei) //显示
{
P1=0xff; //P1口拉高。低电平LED灯亮。
temp = 0x7F; //0111 1111 通过位右移达到流水灯目的
delay(500); //500ms?
for(j=1;j<=wei;j++) //wei为选择右移的位数
{
P1=temp;
delay(500);
if(j != wei) //当右移位数到后,那一位常亮不闪。
{
P1&=~temp;
delay(500);//延时闪烁
temp=_cror_(temp,1);//循环右移当位数到后,停止右移
}
}
}
void main() //主函数
{
while(1)//主函数循环
{
switch(i)
{
case 1:
display(1);
break;
case 2:
display(3);
break;
case 3:
display(3);
break;
case 4:
display(4);
break;
case 5:
display(5);
break;
case 6:
display(6);
break;
case 7:
display(7);
break;
case 8:
display(8);
break;
default:break;
}
i--;
if(i==0)
{
P1=0x00;//常亮
//i=8;//或者返回重新开始
while(1);//程序停在这里?
}
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个简单,亮还是灭和你io共阳或共阴有关系,汇编从来不用.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询