你可以用中断优先级,让不同的灯,一起亮![]() |
这种接法IO口必须有推挽模式和高阻模式,89C52不可以,每次只点亮一个LED,一个IO推挽输出1,另一个IO输出0,其它2个IO必须为高阻。通过动态扫描方式可以实现全部LED点亮,类似数码管的点亮方式,n个IO最多可以控制n*(n-1)个LED,楼主4个IO最多控制4*3=12个LED。 |
减少口线数量,就采用双向扫描,电路要改改, |
分时扫描 |
采用双向扫描法,平时我们用的LED都是单向扫描,电流方向不会变,你如果减少口线数量,就采用双向扫描,电路要改改, |
矩阵正反扫,不亮的IO要高阻态才行 |
先LED1为1,其它LED2~4 轮流持续1毫秒为0再拉高,同样,再到LED2为1,重复前面方法,不断循环即可全亮。 |
Bikho 发表于 2023-11-7 10:43 你说的对,我看错了 |
Bikho 发表于 2023-11-7 10:45 程序上确保这3点: 1. 调用扫描LED程序的时间,间隔是稳定的,这个可以用定时器中断来做,因为扫描程序本身不会占用多少时间。比如每100uS调用它一次,不要这会100uS等下变成200uS; 2. 通常我是100uS刷一次。CPU主频更快程序进程少的话,也就是条件允许,可以刷得更快; 3. 刷某一个灯时,这个灯对应的2个管脚是输出脚,其余脚设置成高组态; 代码我不会帮你写,平台不一样。且我认为提供解决思路与办法,永远比直接给代码更加负责。根据别人的思路或自己想出来思路,然后自己用代码实现出来,自己才会得到提升。 |
板凳说的是对的,不过线路是没错的 |
哦豁~ 发表于 2023-11-7 10:37 我前两个灯以及后面六个灯用按键来控制的,第一二个灯按键长按切换,后六个按键短按实现一个灯亮到六个灯全亮,现在的现象是后面的灯有时会影响到前两个灯亮,扫描的方式怎么样才能更好的消除这二者的影响,方便写一下吗,谢谢。 |
哦豁~ 发表于 2023-11-7 10:37 如何才算是扫描过快,我现在后面六个灯用按键控制的,然后当有个亮的时候第一或第二个灯会亮,但是会暗些 |
lkc8210 发表于 2023-11-7 09:39 LD1和LD4方向不同啊,应该不会同时亮的吧 |
用扫描的方式就可以实现。一瞬间让某个灯亮起:12 -> 13 -> 21 -> 23 -> 24 -> 31 -> 32 -> 34 -> 41 -> 42 -> 43,只要扫描够快,就看起来所有灯都亮起来了。线路是正确的,楼上说法有误。 |
你这个灯怎么这样接法,io口又当正极又当负极吗?还要全部同时亮,应该是不现实,改一下布线吧 |
线路不正确,如LD1和LD4必定同时亮 LD4需掉换一下方向 可以看一下查理复用 引脚必须具备推挽和高阻能力 |
你这少了个灯吧,应该是连到LED1 LED4,看样子你是三个一组进行分类分了四组,如果想要不同组之间同时显示,我建议利用数码管的那种动态扫描方式点亮,如果你是同一组的三个同时点亮,就直接阳极引脚拉高其余引脚拉低就行了。 |
分时扫描就可以了 |