<div id="article_content" class="article_content clearfix">
<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-6e43165c0a.css">
<div id="content_views" class="htmledit_views">
<p>1.硬件电路:</p>
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
原文链接:https://blog.csdn.net/u013830926/article/details/109483858