74HC595 的实际应用与编程
74HC595具有一个8位串行输入并行输出的移位寄存器和一个8位输出锁存器。
应用电路图:
自制实验电路板:
使用一根40线的硬盘连接线将自制电路板与ME300的仿真接口连接即可进行实验。
C语言版源代码:
- ;================================================
- ;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) ;
- }
- }
- }