lkc8210 发表于 2023-7-3 10:00 测试可以用,非常感谢 ![]() |
lxm41577 发表于 2023-6-12 11:41 原理图呢? 按你的代码推断 单片机每次只输出8位数据 以你的描述来看 你用了并联的接线方法 应改用串联的接线方法并在代码中输出16位数据
|
lkc8210 发表于 2023-6-10 15:28 大虾帮帮忙看看,指导指导一下 |
lkc8210 发表于 2023-6-10 15:28 我这个程序在运行时,2片的灯同时运行一样的结果,2片同时在流水,不会是第1片运行完,第1片不运行,第2片运行 SDATA_595 EQU P1.0 ;串行数据输入 SCLK_595 EQU P1.2 ;移位时钟脉冲 RCK_595 EQU P1.1 ;输出锁存器控制脉冲 ;================================================ ORG 0000H LJMP MAIN ORG 0030H ;================================================ MAIN:MOV SP,#60H MOV R0,#0FEH MAIN1: CALL OUT_595 CALL DELAY MOV A,R0 RL A MOV R0,A JMP MAIN1 ;--------------------------------------------------------------- ;输出锁存器输出数据子程序 ;--------------------------------------------------------------- OUT_595: MOV R4,#08H MOV A,R0 WR_LOOP: RLC A MOV SDATA_595,C SETB SCLK_595 ;上升沿发生移位 NOP NOP CLR SCLK_595 DJNZ R4,WR_LOOP CLR RCK_595 NOP NOP SETB RCK_595 ;上升沿将数据送到输出锁存器 NOP NOP NOP CLR RCK_595 RET ;-------------------------------------------------------------- ;延时子程序 ;-------------------------------------------------------------- DELAY:MOV R5,#03H DEL0:MOV R6,#0FFH DEL1:MOV R7,#0FFH DJNZ R7,$ DJNZ R6,DEL1 DJNZ R5,DEL0 RET ;--------------------------------------------------------------- END |
lxm41577 发表于 2023-6-8 16:45 先把你懂的写出来 |
| 各位前辈大虾,能不能给个 2块74HC595实现16只LED流水灯 程序是汇编的,本人只会汇编,C有些看不了,麻烦一下 |
|
能达到目的就用延时好了,干嘛非得给自己找难题用定时器,就这么简单的程序等定时器定时的时候 单片机不也是在空转白费力气吗,不要为了问题给自己找麻烦。编程是个循序渐进的修炼过程, 等真正需要定时器时候再说 |
| 这个问题太简单,其实只是控制16个LED1一片595就可以了,更简单一点直接用8个IO口控制也行(4*4=16) |
shuisherr 发表于 2023-2-10 20:25 不知道玩什么需要那么多输出,而且还要占空比,2片串联595就有时差,2片并联可以消除时差; 要595弄占空比频率允许的话可以实现,就是发送的时间时空比,是要荔枝? |
xianfajushi 发表于 2023-2-10 09:09 感谢老师的回复,我用数组和switch写出来了,现在碰到新的问题了,就是595怎么输出pwm信号,595是串输入并输出,那么应该一次输出一个波形,如果占空比50%就应该前16个灯亮,后16个灯灭。这个怎么用代码输出的?找遍了全网没找到。。。 |
| 我用两只595驱动过8位数码管,就是动态扫描。 |
shuisherr 发表于 2022-6-20 09:26 用环移指令啊: _crol_ int LED_data=0x0003; while(1) { hc595_sent_data(LED_data&0xff); hc595_sent_data(LED_data>>8); hc595_LE_on(); LED_data= _irol_(LED_data,1); } |
|
shuisherr 发表于 2023-2-9 23:51 我写的一组荔枝扩展就是3组4组都可以的如法炮制. |
shuisherr 发表于 2023-2-9 23:51 就写一个运行验证过的荔枝
|
shuisherr 发表于 2023-2-9 23:51 修改一下sl=3;P3=sl;if((sl*=2)>128)sl=3;这个计算公式就实现循环点亮相邻2个灯了. |
shuisherr 发表于 2023-2-9 23:51 很简单,IO组送值3则引脚1和2高电平类推送6则引脚2和3高电平... |
xianfajushi 发表于 2022-6-20 20:49 你这个逻辑没看懂,初学者 ![]() |
shuisherr 发表于 2022-6-20 09:26 简单得很,如果能通常IO实现,595也一样道理,不过就是把数据发送而已。简述:sl=3;P3=sl;if((sl*=2)==128)sl=3; |
| 如果一次亮两个灯,一直往前亮应该怎么写,比如32个灯,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。一直往前亮怎么写比较合理 |
|
假定,你是真的想知道更好的写法, 如果,仅仅只是流水灯的话,HC595 应该这样用: void InterruptTimer0() interrupt 1 { static uint cnt = 0; static uchar j = 0; uchar i; TH0 = T0RH; TL0 = T0RL; if(++cnt>=500) { cnt = 0; for(i=0;i<16;i++) { if(i == j) HC595_DS = 1; else HC595_DS = 0; HC595_SH_CP = 1; HC595_SH_CP = 0; } HC595_ST_CP = 1; HC595_ST_CP = 0; j++; j &= 0x0f; } } |