专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

MSP430单片机实践篇-数码管显示-74HC595动态扫描

作者:未知   来源:不详   点击数:  更新时间:2013年12月27日   【字体:

一、学习要点:
       利用74HC595进行数码管显示,可以只占用3个单片机的I/O口就能完成数码管显示的功能。动态扫描方式则进一步节省了硬件资源,只使用2个74HC595就能显示多达8位数码管。
二、程序执行效果:
       本实验所需使用的硬件电路为2个试验板:MSP430F135核心实验板+8位数码管动态扫描显示模块
将MSP430F135核心实验板上的P5.4、P5.2、P5.0分别与8位数码管动态扫描显示模块上的 LATCH、CLK、 DOUT连接,并将8位数码管动态扫描显示模块上的GND、VCC连接好。如下图
P5.0—— DOUTP5.2——CLKP5.4—— LATCH
 
如下图所示:在8位数码管动态扫描显示模块上的8个数码管上显示数字 4 3 2 1。本例中只使用了其中的4位数码管,读者可进行简单的更改使其显示达到8位。
 
三、原理讲解:
       查看8位数码管动态扫描显示模块的原理。如图所示,2片74HC595分别用于段码与位码的输出。实验板上数码管为共阳,因此当位码为1、段码为0时点亮。
动态扫描的原理:输出第1位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第1位将显示,其它位全部都不显示。 延时一段时间。输出第2位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第2位将显示,其它位全部都不显示。 延时一段时间。输出第3位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第3位将显示,其它位全部都不显示。 延时一段时间。。。。输出第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 watchdog
P5DIR =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;for(i=8;i>0;i--)
{if (X&0x80) P5OUT |=BIT0;
else P5OUT &=~(BIT0);X<<=1;
P5OUT &= ~(BIT2); //P5.2管脚输出低电平
P5OUT |= BIT2; //P5.2管脚输出高电平
}
}
//------------------------------------------------------
// LED段码转换表0——F
//------------------------------------------------------
const unsigned char LED_0_F[] =
{// 0  1    2    3    4    5    6    7    8    9    A    b    c    d    E    F    不显示 -  o(18)H(19)h(20)C(21)0(22)n(23)
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab
};
(3)按照IAR MSP430 项目编译与JTAG仿真调试所讲述方法进行项目编译与JTAG调试运行,即可看到程序运行效果。

关闭窗口

相关文章