74HC595 的实际应用与编程(汇编 C语言) |
74HC595具有一个8位串行输入并行输出的移位寄存器和一个8位输出锁存器。
应用电路图:
应用演示程序:
;===================================================== ;74HC595 走马灯演示程序
;创作日期:2006/01/02 ;创作者: gguoqing ;=====================================================
SDATA_595 EQU P1.0 ;串行数据输入 SCLK_595 EQU P1.1 ;移位时钟脉冲 RCK_595 EQU P1.2 ;输出锁存器控制脉冲 ;=====================================================
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: LCALL WR_595 CLR RCK_595 NOP NOP SETB RCK_595 ;上升沿将数据送到输出锁存器 NOP NOP NOP CLR RCK_595 RET
;--------------------------------------------------------------------- ;移位寄存器接收数据子程序 ;--------------------------------------------------------------------- WR_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 RET
;-------------------------------------------------------------------- ;延时子程序 ;-------------------------------------------------------------------- DELAY: MOV R5,#03H DEL0: MOV R6,#0FFH DEL1: MOV R7,#0FFH DJNZ R7,$ DJNZ R6,DEL1 DJNZ R5,DEL0 RET ;===================================================== END |
电路图见楼上
/******************************************************************
/* *
/* 74HC595 走马灯演示程序 *
/* 作者: gguoqing *
/* 时间: 2006/02/26 *
/* *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
/* *
/******************************************************************/
#include < ;reg51.h> //51芯片管脚定义头文件
#include < ;intrins.h> //内部包含延时函数 _nop_() ;
#define uchar unsigned char
#define uint unsigned int
uchar code DAT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;
sbit SDATA_595=P1^0 ; //串行数据输入
sbit SCLK_595 =P1^1 ; //移位时钟脉冲
sbit RCK_595 =P1^2 ; //输出锁存器控制脉冲
uchar temp ;
/********************************************************/
/* */
/* 延时子程序 */
/* */
/********************************************************/
void delay(int ms)
{
int k ;
while(ms--)
{
for(k=0 ; k< ;250 ; k++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/********************************************************/
/* */
/*将显示数据送入74HC595内部移位寄存器 */
/* */
/********************************************************/
void WR_595(void)
{
uchar j ;
for (j=0 ;j< ;8 ;j++)
{
temp=temp< ;< ;1 ;
SDATA_595=CY ;
SCLK_595=1 ; //上升沿发生移位
_nop_() ;
_nop_() ;
SCLK_595=0 ;
}
}
/********************************************************/
/* */
/*将移位寄存器内的数据锁存到输出寄存器并显示 */
/* */
/********************************************************/
void OUT_595(void)
{
RCK_595=0 ;
_nop_() ;
_nop_() ;
RCK_595=1 ; //上升沿将数据送到输出锁存器
_nop_() ;
_nop_() ;
_nop_() ;
RCK_595=0 ;
}
/********************************************************
* *
* 主程序 *
* *
*********************************************************/
main()
{
SCLK_595=0 ;
RCK_595=1 ;
while(1)
{
uchar i ;
for (i=0 ; i< ;8 ; i++)
{
temp=DAT[ i ] ; //取显示数据
WR_595() ;
OUT_595() ;
delay(100) ;
}
}
}