1.硬件电路:
2.软件实现:下面的图是来自台湾一位老师佑來認真教的Arduino教學讲解
注意:高位先进入。
解释:每次先把大平台放下(ST输出低电平),把活塞拉回,等待数据放上(SH输出低电平)
数据1或者0通过DS输出。放数据后,再把活塞推出去(SH输出高电平)。连续8次就可以把数据完整的放
到大平台(ST)上。最后把大平台上抬,8位数据就同时输出去了。(ST输出高电平)。
级联时数据有些不一样,需要注意先入的数据在后一级。需要循环16次,最后ST大平台输出。
3.驱动代码
#DEFINE P_SCK 06H,5
#DEFINE P_RCK 06H,4
#DEFINE P_SI 06H,1
R_ACC1 EQU 0X15
R_ACC2 EQU 0X16
R_ACC3 EQU 0X17
R_ACC_1 EQU 0X18
R_595_DATA1 EQU 0X19 ;数据1
R_595_DATA2 EQU 0X1A ;数据2
;***************************************************************************
;74HC595输出SEG--级联
;通过ACC传递数据
;***************************************************************************
SEND_595:
;
MOVIA 2
MOVAR R_ACC3 ;2个字节
;
MOVIA R_595_DATA1 ;BUF1的缓存器地址
MOVAR FSR ;R4
SEND_595_S:
MOVR INDF,0
MOVAR R_ACC1 ;将要发送的一个字节数据
;
MOVIA D'8'
MOVAR R_ACC2 ;将要发送的一个字节的位计数器
;
BCR P_SCK ;拉低
;
LCALL DELAY_US ;延迟一下
;
SEND_595_LOOP:
BTRSS R_ACC1,7 ;//先传输高位,通过与运算判断第八是否为1
BCR P_SI
BTRSC R_ACC1,7
BSR P_SI
;
BCR P_SCK ;/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
;
LGOTO $+1
LGOTO $+1
LGOTO $+1
LGOTO $+1
BSR P_SCK
;
RLR R_ACC1,1 ;左移一位
;
DECRSZ R_ACC2,1 ;
LGOTO SEND_595_LOOP ;一个字节未完,继续发送
;
LCALL DELAY_US
;
INCR FSR,1
DECRSZ R_ACC3,1 ;下一个数据
LGOTO SEND_595_S ;一帧数据未完,继续发送
;
BCR P_RCK ;74HC595输出锁存 使能
LCALL DELAY_US ;步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器
BSR P_RCK ;再将STCP拉高,STCP即可产生一个上升沿
LCALL DELAY_US
SEND_595_RET:
RET
;=========================================================================
DELAY_US:
MOVIA 100
MOVAR R_ACC_1
DELAY_US_1:
DECRSZ R_ACC_1,1
LGOTO DELAY_US_1
RET