74HC595动态扫描程序
- 格式:doc
- 大小:29.50 KB
- 文档页数:4
74HC595芯片资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.描述595是告诉的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
参考数据CPD决定动态的能耗,PD=CPD×VCC×f1+∑(CL×VCC2×f0)F1=输入频率,CL=输出电容f0=输出频率(MHz)Vcc=电源电压功能表H=高电平状态L=低电平状态↑=上升沿↓=下降沿Z=高阻NC=无变化×=无效当MR为高电平,OE为低电平时,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口。
/***************************************************************************************/ 给个74HC595的"慢动作"void WriteSIOByte(unsigned char val){unsigned char i;ACC = val;for (i = 8; i > 0; i --) {SRCLK = 0;//拉低74HC595时钟_rrca_();//右移一位数据SER = CY;//发送74HC595一位串行数据SRCLK = 1;//拉高74HC595时钟_nop_();//延时}SER = 1;//释放数据总线//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令RCLK = 0;_nop_();//延时RCLK = 1;//打入并行数据}74ls595"速射"hotpowerfor(i = 0; i < buffsize; i ++){SBUF = siobuff[i];while(TI == 0);TI = 0;}RCLK = 0;_nop_();//延时RCLK = 1;//打入并行数据/************************************************************************/摘要:本文介绍了应用移位寄存器芯片74HC595实现LED动、静态显示的基本原理。
单片机与74LS595(8位输出锁存移位寄存器)的使用方法2009-04-12 13:5574595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:1)74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
从SER每输入一位数据,串行输595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,如下面的真值表,在正常使用时SCLR为高电平,G为低电平。
从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
利用74HC595实现多位LED显示的新方法摘要:本文介绍了应用移位寄存器芯片74HC595实现LED动、静态显示的基本原理。
提出了一种用74HC595实现多位LED显示的新方法。
同时对该系统的硬件组成和软件实现作了详细说明。
实际应用表明,此方法连线简单方便,成本低廉,可用于24位LED或更多位LED显示。
关键词:LED 74HC595 动态显示静态显示1 引言单片机应用系统中使用的显示器主要有LED和LCD两种。
近年来也有用CRT显示的。
前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。
LED(Ling Emiting Diode)是发光二极管的缩写。
实际应用非常普遍的是八段LED 显示器。
LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。
在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。
2 74HC595实现LED静、动态显示基本原理74HC595是美国国家半导体公司生产的通用移位寄存器芯片。
并行输出端具有输出锁存功能。
与单片机连接简单方便,只须三个I/O口即可。
而且通过芯片的Q7引脚和SER引脚,可以级联。
而且价格低廉,每片单价为1.5元左右.2.1 静态显示每位LED显示器段选线和74HC595的并行输出端相连,每一位可以独立显示(见图1)。
在同一时间里,每一位显示的字符可以各不相同(每一位由一个74HC595的并行输出口控制段选码)。
N位LED显示要求N个74HC595芯片及N+3条I/O口线,占用资源较多,而且成本较高。
这对于多位LED显示很不利。
2.2 动态显示在多位LED显示时,为了简化电路,降低成本,节省系统资源,将所有的N位段选码并联在一起,由一片74HC595控制(见图2)。
由于所有LED的段选码皆由一个74HC595并行输出口控制,因此,在每一瞬间,N位LED会显示相同的字符。
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能 OE时(为低电平),存储寄存器的数据输出到总线。
74HC595各个引脚的功能:Q1~7 是并行数据输出口,即储寄存器的数据输出口Q7' 串行输出口,其应该接SPI总线的MISO接口STcp 存储寄存器的时钟脉冲输入口SHcp 移位寄存器的时钟脉冲输入口OE的非输出使能端MR的非芯片复位端Ds 串行数据输入端程序说明:每当spi_shcp上升沿到来时,spi_ds引脚当前电平值在移位寄存器中左移一位,在下一个上升沿到来时移位寄存器中的所有位都会向左移一位,同时Q7'也会串行输出移位寄存器中高位的值,这样连续进行8次,就可以把数组中每一个数(8位的数)送到移位寄存器;然后当 spi_stcp上升沿到来时,移位寄存器的值将会被锁存到锁存器里,并从Q1~7引脚输出附子程序:void hc595send_data(uint8 data)//要传输的数据,建议用数组的方法来查询{ uint8 i; IO0CLR = spi_stcp; 12脚 for(i=0;i<8;i++) { IO0CLR = spi_shcp; 11脚 if((data&0x80)!=0)IO0SET = spi_ds; elseIO0CLR = spi_ds; data <<= 1; IO0SET =spi_shcp; } IO0SET = spi_stcp;}1 引言单片机应用系统中使用的显示器主要有LED和LCD两种。
近年来也有用CRT显示的。
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。
74HC595在单片机上的应用及程序74HC595具有8位串入并出的三态门电路。
高速率:最高55MHz(5V工作电压)宽的工作电压范围:2V -6V每个口的最大电流值(QA-QH):±35mA当单片机的I/O资源比较紧张时,采用595并进行级联是一个很好的选择。
管脚定义:PIN NO symbol name and function15 QA data output1 QB data output2 QC data output3 QD data output4 QE data output5 QF data output6 QG data output7 QH data output8 GND ground9 QH’ serial data outputs10 /SCLR shift register clock input11 SCK shift register clock input12 RCK storage register clock input13 /G output enable input14 SI serial data input16 Vcc positive supply voltage时序图:请参照595的数据手册程序编制:端口定义设置:sbit DATA=P1^5;sbit SHIFT=P1^6;sbit STORAGE=P1^7;1、写595Void write_595(uchar x)//功能:将无符号8位数x,写入到595的shife register{Uchar j;For(j=0;j<8;j++)//循环8次,以便shift register保存8位数据{X=x<<1;//将数据左移一位,最高位数据进入到CY中SHIFT=0;//shift端置0_nop_();_nop_();_nop_();DATA=CY;//将一位数据送入595串口数据端SHIFT=1;//shift端产生一个上升沿,数据就送入到了shift register_nop_();//延时_nop_();_nop_();SHIFT=0;//shift端产生一个下降沿,shift register内容保持不变}}3、595数据的输出/********595输出函数函数*******************/void out_595(void){STORAGE=0;_nop_();_nop_();STORAGE=1;//上升沿shift register 的内容保存到store register _nop_();_nop_();STORAGE=0;//下降沿store register 的内容保持不变}4、只要在主函数中分别调用以上两个函数即可将要显示的数值X 显示出来。
74HC595串行动态数码管显示与X5045操作示例2007-3-7 11:18:00推荐;晶振工作在11.059200M赫兹;单片机为89C51;$NOMOD51;$INCLUDE (AT89X52.H);******************************************************************* ;资源定义RCLK_595 EQU P2.1 ;上升沿时移位寄存器的数据进入数据存储寄存器SRCLK_595 EQU P2.2 ;上升沿时数据寄存器的数据移位SER_595 EQU P2.3 ;串行数据输入端X5045_CS EQU P1.0 ;用于给出X5045的CS信号X5045_SCK EQU P1.1 ;用于给出X5045的SCK信号X5045_SI EQU P1.2 ;用于给出X5045的SI信号X5045_SO EQU P1.3 ;用于给出X5045的SO信号RUN_LED EQU P1.5 ;用于控制指示灯亮灭DISP_START EQU 40H ;40-47H是显示缓冲区,存放8个有效数据DSEG AT 20H;DISP_BUFFER_START DATA 57H ;存放显示缓冲区首地址DISP_P DATA 58H ;存放显示指针,012345 67DISP_CTRL DATA 59H ;存放显示位码LED_DELAY DATA 60H ;LED闪烁的延时计数器LED_DELAY_VALUE EQU 0FFH ;LED闪烁的延时计数器值;******************************************************************* ;******************************************************************* ;中断入口CSEGORG 0000HJMP START;******************************************************************* ;主程序ORG 0033HSTART:MOV R7,#00HDJNZ R7,$ ;延时MOV SP,#65H ;堆栈初始化为60HLCALL SYS_INIT ;系统初始化MOV LED_DELAY,#LED_DELAY_VALUE ;LED闪烁计数器赋初值;MOV DISP_BUFFER_START,#DISP_START ;显示第一组数据MOV DISP_P,#0 ;显示第一个数据MOV DISP_CTRL,#01111111B ;显示最高位;MOV BUFFER_P,#BUFFER_START ;初始化接收缓冲区指针;主循环MAIN_LOOP:DJNZ LED_DELAY,MAIN_LOOP_NEXT2CPL RUN_LED ;指示灯闪烁,表示正常运行MOV LED_DELAY,#LED_DELAY_VALUEMAIN_LOOP_NEXT2:;显示1MOV R1,#8MOV R0,#DISP_STARTMOV A,#01H ;1INIT_DISP_BUFFER1:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER1SETB TR1DISP_1_1:CALL DISPJNB TF1,DISP_1_1CLR TF1DISP_1_2:CALL DISPJNB TF1,DISP_1_2CLR TF1DISP_1_3:CALL DISPJNB TF1,DISP_1_3CLR TF1DISP_1_4:CALL DISPJNB TF1,DISP_1_4CLR TF1DISP_1_5:CALL DISPJNB TF1,DISP_1_5CLR TF1DISP_1_6:CALL DISPJNB TF1,DISP_1_6CLR TF1CLR TR1;显示2MOV R1,#8MOV R0,#DISP_STARTMOV A,#02H ;1INIT_DISP_BUFFER2:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER2SETB TR1DISP_2_1:CALL DISPJNB TF1,DISP_2_1CLR TF1DISP_2_2:CALL DISPJNB TF1,DISP_2_2CLR TF1DISP_2_3:CALL DISPJNB TF1,DISP_2_3CLR TF1CLR TR1JMP MAIN_LOOP;******************************************************************* ;******************************************************************* ;系统初始化程序SYS_INIT:MOV R0,#00HSYS_INIT_LOOP:MOV R1,#00HDJNZ R1,$DJNZ R0,SYS_INIT_LOOP ;延时0.13S;内部RAM(30H-5fH)清零MOV R1,#30HMOV A,#0ZERO_LOOP: MOV @R1,AINC R1CJNE R1,#60H,ZERO_LOOP;显示缓冲区初始化MOV R1,#8MOV R0,#DISP_STARTMOV A,#01H ;1INIT_DISP_BUFFER:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER;禁止各中断MOV IE,#00HMOV IP,#00H;****************************;x5045初始化;x5045引脚输入输出初始化;????LCALL WRITE_06H ;向X5045写入WREN指令(写允许)MOV R0,#00H;1.4S复位LCALL WRITE_01H ;将R0的内容(00H)写入X5045状态寄存器LCALL WRITE_04H ;向X5045写入WRDI指令(写禁止);****************************;****************************;串行口初始化;定时器1产生波特率,方式2;MOV TMOD,#00100000BMOV TMOD,#00010000B ;方式1,16位定时器模式;串口方式3,11位,附加位作为奇偶校验位MOV SCON,#11000000B;SMOD=0ANL PCON,#01111111B;MOV TL1,#0FDH ;波特率9600;MOV TH1,#0FDH ;自动装载值MOV TL1,#LOW(65536 - 65536) ;60MSMOV TH1,#HIGH(65536 - 65536);SETB REN ;允许接收;SETB TR1 ;启动定时器1;*******************************ret;******************************************************************** ******;******************************************************************* ;******************************************************************* ;8位共阴极动态数码管显示扫描子程序DISP: MOV R5,DISP_CTRLCALL WRITE8_595 ;写入位码MOV A,#DISP_START ;显示缓冲区首地址ADD A,DISP_P ;加上缓冲区偏移MOV R0,AMOV A,@R0;转换为显示码MOV DPTR,#TABMOVC A,@A+DPTRMOV R5,ACALL WRITE8_595 ;写入段码;上升沿移位寄存器的数据进入数据存储寄存器CLR RCLK_595NOPSETB RCLK_595MOV A,DISP_CTRLCJNE A,#0FEH,FLASH_DISP;显示到最右那一位则重新循环显示MOV DISP_CTRL,#01111111BMOV DISP_P,#0JMP DISP_RETURNFLASH_DISP:;刷新位码和显示指针RR AMOV DISP_CTRL,AMOV A,DISP_PINC AMOV DISP_P,ADISP_RETURN:RET;******************************************************************* ;******************************************************************* ;向74HC595写入8位数据,低位在前;入口:R5存放8位要写入的数据;注意:但是数据并没有从移位寄存器的数据进入数据存储寄存器,调用它的程序需处理; 初始时引脚状态无影响WRITE8_595:MOV A,R5MOV R5,#8WRITE8_595_LOOP:RRC AMOV SER_595,CCLR SRCLK_595NOPSETB SRCLK_595 ;移位数据,上升沿数据移位DJNZ R5,WRITE8_595_LOOPRET;*******************************************************************TAB: DB 3FH,06H,5BH,4FH,66H ;共阴极数码管显示码 DB 6DH,7DH,07H,7FH,6FH;******************************************************************* ;******************************************************************** ******;******************************************************************** ******;功能:X5045内置看门狗复位;******************************************************************** *******WDT_RST: CLR X5045_CSNOPNOPSETB X5045_CSNOPRET;******************************************************************** ******;******************************************************************** ******;功能:向X5045的SPI接口发送8位数据;入口参数:待发送数据在A中;占用:A,R0,R1;******************************************************************** *******SPI_WRITE8: MOV R7,#08HNEXT0466: RLC AMOV X5045_SI,CNOPNOPSETB X5045_SCKNOPNOPCLR X5045_SCKDJNZ R7,NEXT0466RET;******************************************************************** ******;功能:向X5045写入WREN指令(写允许);******************************************************************** *******WRITE_06H: MOV A,#06HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** ******;功能:向X5045写入WRDI指令(写禁止);******************************************************************** *******WRITE_04H: MOV A,#04HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** ******;功能:将R0的内容写入X5045状态寄存器;******************************************************************** *******WRITE_01H: MOV A,#01HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8MOV A,R0LCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** *******END。
利用74HC595实现多位LED显示的新方法1 引言目前,双基色发光二极管(LED)显示屏的生产制造数量比较多,其技术也相对成熟。
各个企业制造的显示屏的结构、原理基本相似,有些专业生产显示多媒体卡,因此,提高显示屏的技术性能、降低成本是各个企业竞争的关键所在。
现在,市场上销售的LED显示屏的价格基本相同,但是,不同的企业生产的显示屏的质量不同,其原因是多方面的,主要有:①LED显示模块的质量、亮度、亮度均匀性、封装等技术;②数据的通讯传送方式,抗干扰能力;③显示扫描电路电流的多点调整,控制每一点的电流。
经过多点调整的显示屏不仅均匀性比较好,而且显示图像的亮度、颜色效果更好,专用显示扫描电路具有比较好的显示效果,但是价格相对较贵。
现在,市场上销售的LED显示屏是很多企业利用相同的设计技术、方法、显示模块生产的,但其性能差别比较大。
颜色配比的不同,产生图像效果差别就很大;模块的扫描频率、工作电流既影响亮度,又涉及到使用寿命等问题。
因此,正确地确定各项技术参数是制造显示屏的关键所在,也可以说是技术经验的体现。
2 显示扫描原理各个企业制造的LED显示屏的控制结构有所不同,但是,显示屏的显示扫描电路基本相同。
双基色LED显示屏的显示扫描电路如图1所示。
在图1中,IC1、IC2是数据锁存器电路74HC595,分别锁存红色、绿色数据,它们的性能是:①串行输入8位并行输出;②数据锁存、数据清除功能;③输出具有比较强的驱动能力。
电阻RPB1、RPB2是限流电阻,根据颜色和模块的亮度来选择他们的数值。
ML1是双色LED显示模块,共有8行X8列=64个LED,其中,8个引脚是红色信号输入端,8个引脚是绿色信号输入端,8个引脚是行控制输入端,共有24个引脚。
三极管Q0,Q2,…Q7是行选通、驱动作用。
IC3是3-8地址译码电路74HC138,8个选通输出端分别控制相应的行。
图中电路是显示屏的原理电路,其数据传送方式是数据传送与行信号异步进行:首先,同时传送8位红、绿颜色数据到电路IC1、IC2并将数据锁存,然后再传送锌刂菩藕诺懔烈恍校蹋牛模 酉吕粗馗瓷鲜霾僮鳎 皇切行藕乓浦料乱恍校 来蔚降诎诵形 梗 词且淮瓮暾 纳 韫 獭?br> 显示扫描电路板的设计要求具有比较低的生产成本,因此,许多企业都设计成双面电路板,这样可以节省约三分之一的电路板成本。
74hc595;文件名:74hc595.c;功能:使用74HC595制作6位静态显示电路,在数码管上分别显示123456。
;硬件:见图8-4*/#include "pic.h"typedef unsigned char uchar;typedef unsigned int uint;__CONFIG(HS&WDTDIS&LVPDIS);//配置文件,设置为HS方式振荡,禁止看门狗,低压编程关闭#define Dat RB1 //定义串行数据输入端#define Clk R B0 //定义时钟端#define RCK RB2 //定义控制端uchar DispBuf[6]={1,2,3,4,5,6};const uchar DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x8 6,0x8E,0xFF};//定义定形码表void SendData(unsigned char SendDat) //传送一个字节的数据数据{ unsigned char i;for(i=0;i<8;i++){ if((SendDat&0x80)==0)Dat=0;elseDat=1;Clk=0;Clk=1;SendDat=SendDat<<1;}}void Disp(){ uchar c;uchar i;RCK=0; //存储寄存器输入禁止for(i=0;i<6;i++){ c=DispBuf[5-i]; //取出待显示字符,先送高位SendData(DispTab[c]); //送出字形码数据}RCK=1; //存储寄存器输入允许}void main(){ TRISB=0; //设置PORTB为输出Disp();for(;;);}。
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。