找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2276|回复: 11
收起左侧

关于单片机LED灯控制的问题,如何移动到下一位后,上一位能保持常亮

[复制链接]
ID:733697 发表于 2020-11-1 21:38 来自手机 | 显示全部楼层 |阅读模式
怎么才能让单片机LED灯在移动到下一位后,上一位能保持常亮。编程思路或者想法可以说一下,很急!拜托了
1604237713006.jpg
1604237758112.jpg
回复

使用道具 举报

ID:213173 发表于 2020-11-1 23:00 | 显示全部楼层
给你一个C
#include <reg51.h>
#define LED P1

void delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}        
void main()
{
        unsigned char i;
        LED=0xfe;
        delay(500);
        for(i=0;i<7;i++)
        {
                LED<<=1;
                delay(500);
        }
        while(1);
}
回复

使用道具 举报

ID:837540 发表于 2020-11-1 23:04 | 显示全部楼层
使用异或
回复

使用道具 举报

ID:88256 发表于 2020-11-2 00:51 | 显示全部楼层
截图看得很累也不清楚实际接法,看图并不是常见的一个I/O口对应一个LED,你的要求是第一次亮一个灯,第二次两个灯,到最后8个灯都亮,然后全部熄灭吗?但看你的程序并不太像是这样做的,你拿R1做循环次数控制,这个次数不是8次,第12行没见到有用的地方,第13行也没用,而且如果第20行用的也是R3的话,那么第7行的赋值也没用,因为执行延时程序后R3值已经被改了;第16、17行多此一举。
另外,你这个LED的亮灭不是程序循环控制点亮的,而是读取由第4行指定的TABLE为首地址的数据作为LED亮灭控制的,所以你可以在TABLE指定的地址起始处依次改为00H、01H、03H、07H、0FH……,就可以达到要求。
回复

使用道具 举报

ID:733697 发表于 2020-11-2 09:05 来自手机 | 显示全部楼层
wulin 发表于 2020-11-1 23:00
给你一个C
#include
#define LED P1

谢谢大哥,但是我们主要还是学的是汇编语言,可能c语言我们用不上
回复

使用道具 举报

ID:733697 发表于 2020-11-2 09:13 来自手机 | 显示全部楼层
hhdsdy 发表于 2020-11-2 00:51
截图看得很累也不清楚实际接法,看图并不是常见的一个I/O口对应一个LED,你的要求是第一次亮一个灯,第二次 ...

首先谢谢大哥了,我的要求是第一次亮一个灯,第二次亮第二个灯,然后就是执行完后的灯要保持常亮,简单来说就是p1.0接口亮后,不能让p1.0接口灭,然后第二接口亮,也不能让接口灭,依次类推。之所以有个r3接口,是因为我还接了p2.7接口,因为p1不够用,我想要的说就是等p1接口全部亮一次后,p2,7接口能立马跟上亮起,最后的时候一起保持常亮
回复

使用道具 举报

ID:733697 发表于 2020-11-2 09:14 来自手机 | 显示全部楼层
hhdsdy 发表于 2020-11-2 00:51
截图看得很累也不清楚实际接法,看图并不是常见的一个I/O口对应一个LED,你的要求是第一次亮一个灯,第二次 ...

首先谢谢大哥了,我的要求是第一次亮一个灯,第二次亮第二个灯,然后就是执行完后的灯要保持常亮,简单来说就是p1.0接口亮后,不能让p1.0接口灭,然后第二接口亮,也不能让接口灭,依次类推。之所以有个r3接口,是因为我还接了p2.7接口,因为p1不够用,我想要的说就是等p1接口全部亮一次后,p2,7接口能立马跟上亮起,最后的时候一起保持常亮
回复

使用道具 举报

ID:311846 发表于 2020-11-2 09:44 | 显示全部楼层
真萌新 发表于 2020-11-2 09:05
谢谢大哥,但是我们主要还是学的是汇编语言,可能c语言我们用不上

单用汇编,不学C 我怕你吃不消
回复

使用道具 举报

ID:282850 发表于 2020-11-2 10:33 | 显示全部楼层
不懂汇编,但思路是一样的。用移位与加法应该能行:
假设是高电平亮LED
P1=P1<<1+1;
如果是低电平亮LED
把上边的P1取反。
回复

使用道具 举报

ID:88256 发表于 2020-11-2 14:13 | 显示全部楼层
真萌新 发表于 2020-11-2 09:14
首先谢谢大哥了,我的要求是第一次亮一个灯,第二次亮第二个灯,然后就是执行完后的灯要保持常亮,简单来 ...

想要更好的得到帮助,就要贴出完整的电路图和程序。你的要求是像水杯装水那样从少到多吧?就是我前面说的?
我觉得你没有认真看我的回帖,R3在执行第11行后数值已变,虽然也是为0,但显然你没考虑到这一点,所以第7行根本没用。
依你的说法就是总计有9个灯了?第13行完全没用到,因为你没有从B取数或者参与运算,而且R3的数值恒为0,没有任何意义。
查表法就得加一处理,你没有做这方面的任何处理,可以将第12行改成 INC DPTR ,这样才能取到后续的数据。
看你第15行的意思就是LED是低电平点亮的,从题意上看也是需要延时的(你那延时量我没去计算,不知道是否符合要求),但因为最后是全部的灯一起亮不需要熄灭,所以延时可以不考虑,但第16、17、18行是没用的。
本来想告诉你需要在TABLE指定的地址起始处依次存放亮灯数据,但刚才细看截图好像最后面有,由于太模糊需要你自己确认数据是否正确,你只要把最关键的 INC DPTR 添加上去就可以试试了
回复

使用道具 举报

ID:837951 发表于 2020-11-2 20:25 | 显示全部楼层
用移位来操作
回复

使用道具 举报

ID:424598 发表于 2020-11-3 00:08 来自手机 | 显示全部楼层
不懂位移的话,可以用二进制代替,比如位移8位的,第一次是01111111,第二次是00111111可设一个8位数组,分别在存储,然后把整个数组提交给单片机,跟位移原理一样
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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