找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3118|回复: 15
打印 上一主题 下一主题
收起左侧

流水灯程序问题,不应该是亮一颗灭一颗吗?为啥是一颗一颗接着亮不熄灭

[复制链接]
跳转到指定楼层
楼主
ID:953771 发表于 2021-7-17 18:58 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序下载到单片机里面,不应该是亮一颗灭一颗吗?为啥是一颗一颗接着亮不熄灭。

6WH[5`WJE}P$3RSC{OW4OCU.png (44.29 KB, 下载次数: 41)

6WH[5`WJE}P$3RSC{OW4OCU.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:953771 发表于 2021-7-17 18:58 来自手机 | 只看该作者
请各位大佬指教
回复

使用道具 举报

板凳
ID:824490 发表于 2021-7-17 20:05 | 只看该作者
16灯的程序,给你一个参考:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
unsigned char i,dir;
unsigned int led16;

void delay(unsigned int t)
{
   while(t--);
}
   
void flash_mode1()
  {
    if (dir) led16=0x7fff;
    else     led16=0xfffe;
     for (i=0;i<16;i++)
     {
        P0=led16 & 0x00ff;
        P2=led16 >>8;
        delay(5000);
        if(dir) led16=_iror_(led16,1);
        else    led16=_irol_(led16,1);
     }
     dir=~dir;   
  }
   
void main(void)
{
    while (1)
   {
   flash_mode1() ;
   }
}
回复

使用道具 举报

地板
ID:824490 发表于 2021-7-17 20:07 | 只看该作者
代码有问题,你可以学着单步执行跟踪一下,问题就出来了。
回复

使用道具 举报

5#
ID:953771 发表于 2021-7-17 20:08 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-17 20:05
16灯的程序,给你一个参考:
#include
#include

好的,谢谢。
回复

使用道具 举报

6#
ID:953771 发表于 2021-7-17 20:10 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-17 20:07
代码有问题,你可以学着单步执行跟踪一下,问题就出来了。

好的,谢谢
回复

使用道具 举报

7#
ID:824490 发表于 2021-7-17 20:10 | 只看该作者
P0=(0XFE<<i)
这个代码是没有补位的。当左移一位后,最低位补进的是“0” ,所以你要作补“1”处理
回复

使用道具 举报

8#
ID:953771 发表于 2021-7-17 20:23 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-17 20:10
P0=(0XFE

是不是就像,0xFE(1111  1110)往左移变成了
1111  1100,所以才不会熄灭。
回复

使用道具 举报

9#
ID:953771 发表于 2021-7-17 20:25 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-17 20:10
P0=(0XFE

请问要补1的话应该怎么补
回复

使用道具 举报

10#
ID:824490 发表于 2021-7-17 20:31 | 只看该作者
本帖最后由 名字不是重点 于 2021-7-17 20:33 编辑

用这个:_cror_ 指令,这个是带“C”标志移位的。简单地说是就环形移位,省去补“1”的动作
回复

使用道具 举报

11#
ID:161164 发表于 2021-7-17 22:16 | 只看该作者
地狱火 发表于 2021-7-17 20:25
请问要补1的话应该怎么补

P0=(P0<<1)&0x01;

P0=~(0x01<<i);
回复

使用道具 举报

12#
ID:953771 发表于 2021-7-17 23:10 来自手机 | 只看该作者
lkc8210 发表于 2021-7-17 22:16
P0=(P0

好的,谢谢。
回复

使用道具 举报

13#
ID:953771 发表于 2021-7-17 23:11 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-17 20:31
用这个:_cror_ 指令,这个是带“C”标志移位的。简单地说是就环形移位,省去补“1”的动作

好的,谢谢大哥
回复

使用道具 举报

14#
ID:954312 发表于 2021-7-18 13:38 | 只看该作者
这个左移是后面自动补0,你可以定义一个变量移位然后对它取反,或者直接用—crol—(i,1)进行向左移位
回复

使用道具 举报

15#
ID:954170 发表于 2021-7-19 18:57 | 只看该作者
流水灯程序,供参考

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar a,b,c,d,e,f,g;
void delay(uchar Nms){
uchar i;
while(Nms--){
for(i=0;i<120;i++){;}
}
}
void main()
{
a=0xff;
b=0x55;
c=0xfe;
d=0x7f;

for(e=0;e<5;e++){b=~b;delay(250);P0=b;}
P0=a;delay(250);
for(f=0;f<8;f++){P0=c;c=_crol_(c,1);delay(250);}
P0=a;delay(250);
for(g=0;g<8;g++){P0=d;d=_cror_(d,1);

delay(250);
}




}
回复

使用道具 举报

16#
ID:952671 发表于 2021-7-19 21:38 | 只看该作者
#include <reg52.h>//特殊功能的寄存器的头文件
sbit LED0 =P0^0;//LED灯的点亮
sbit LED1 =P0^1;
sbit LED2 =P0^2;
sbit LED3 =P0^3;
sbit LED4 =P0^4;
sbit LED5 =P0^5;
sbit LED6 =P0^6;
sbit LED7 =P0^7;
sbit ADDR0 =P1^0;//138的A0口
sbit ADDR1 =P1^1;//138的A1口
sbit ADDR2 =P1^2;//138的A2口
sbit ADDR3 =P1^3;//
sbit ENLEAD =P1^4;//
void Delay(int i)
{
                while(i--);
}
int main ()
{               
                ADDR3 = 1;
                ENLEAD = 0;
/*位定义*/
//while(1)
//                                {
//                                        LED0=0;
//                                        Delay(50000);
//                                        LED0=1;
//                                        LED1=0;
//                                        Delay(50000);
//                                        LED1=1;
//                                        LED2=0;
//                                        Delay(50000);
//                                        LED2=1;
//                                        LED3=0;
//                                        Delay(50000);
//                                        LED3=1;
//                                        LED4=0;
//                                        Delay(50000);
//                                        LED4=1;
//                                        LED5=0;
//                                        Delay(50000);
//                                        LED5=1;
//                                        LED6=0;
//                                        Delay(50000);
//                                        LED6=1;
//                                        LED7=0;
//                                        Delay(50000);
//                                        LED7=1;
//                                        Delay(50000);
//                                }
/*左移右移*/
while(1)
                                {                int j;
                                          int g;
                                                P0=0Xfe;
                                                for(j=0;j<7;j++)
                                                {
                                                        P0=P0<<1;
                                                        Delay(50000);
                                                }
                                                for(g=0;g<7;g++)
                                                {
                                                        P0=P0>>1;
                                                        Delay(50000);
                                                }
                                }
}


仅供参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表