一、四位数码管
1.四位数码管的分类
四位数码管使一种半导体发光器件,其基本单元为发光二极管。按照发光二极管连接方式可以分为共阳极数码管和共阴极数码管。
共阳数码管使指将所有发光二极管的阳极接在一起形成公共阳极的数码管。当某一字段发光二极管的阴极为高电平时,相应字段被点亮,当某一字段的阳极为低电平时,相应字段不亮。
共阴数码管是指将所有发光二极管阴极接在一起形成公共阴极的数码管。当某一字段发光二极管的阳极为高电平时,相应字段被点亮,当某一字段的阳极为低电平时,相应字段不亮。
2.四位数码管的引脚图
引脚排列以左下角的1管脚开始,以逆时针方向依次为1~12管脚。其中A,B,C,D,E,F,G,DP为段引脚,DIG.1,DIG.2,DIG.3,DIG.4分别代表四个数码管的位。
3.四位数码管的驱动方式
-
静态驱动
静态驱动是指每个数码管每一个段码都由一个单片机的I/0口进行驱动,优点是编程简单,显示亮度高,但是缺点是占用的I/O多,驱动4个8段数码管需要32个I/O端口,容易造成硬件资源的浪费,增加了硬件电路的复杂性,减低了可靠性。
-
动态驱动
数码管动态显示是单片机应用最为广泛的一种显示方式。通过共用A,B,C,D,E,F,G,DP这8个段引脚,为每个数码管公共极增加位选通端,位选通端由各自独立的I/O端口控制。
当单片机显示某一数字时,所有数码管都接受相同的数字,但哪一位显示数字取决于单片机第对四位数码管选通段的控制,只要需要显示的数码管的选通段置为高电平(低电平),其他选通端置为低电平(高电平),这一位数码管就可以正常显示数字,其他位不会显示。给较小的延迟(1~2ms),再让其他位的数码管依次显示对应的数字,就可以实现各个数码管轮流受控显示。
由于人的视觉暂留效应和发光二极管的余辉效应,尽管实际上各位数码管并非同时显示数字,但延时时间足够短,人眼看到的就是一组稳定显示的数字,动态显示的效果和静态显示的效果是一样的。
动态驱动能够节省大量的I/O端口,而且功耗更低,因此应用更加广泛。
二、MSP430F5529单片机
-
引脚图
-
实物图
三、使用四位数管同时显示两个不同的两位数
本次代码要实现的目的是使用数码管显示不同的两位数。
MSP430F5529的I/O端口与数码管引脚对应情况为:
数码管管脚 | I/O端口 |
---|---|
1(E) | P3.2 |
2(D) | P2.7 |
3(DP) | P4.2 |
4( C ) | P4.1 |
5(G) | P4.3 |
6(DIG.4) | P6.3 |
7(B) | P4.0 |
8(DIG.3) | P6.2 |
9(DIG.2) | P6.1 |
10(F) | P3.7 |
11(A) | P8.2 |
12(DIG.1) | P6.0 |
代码如下:
#include <msp430.h>
/**
* main.c
* author:wgx
*/
#define DelayTime 8000
void display_number(int number)
{
switch(number)
{
case 1:
P4OUT |= BIT1;//显示1
P4OUT |= BIT0;
P3OUT &=~ BIT2;
P2OUT &=~ BIT7;
P4OUT &=~ BIT2;
P4OUT &=~ BIT3;
P3OUT &=~ BIT7;
P8OUT &=~ BIT2;
break;
case 2:
P8OUT |= BIT2;//显示2
P4OUT |= BIT0;
P4OUT |= BIT3;
P3OUT |= BIT2;
P2OUT |= BIT7;
P4OUT &=~ BIT2;
P4OUT &=~ BIT1;
P3OUT &=~ BIT7;
break;
case 3:
P8OUT |= BIT2;//显示3
P4OUT |= BIT0;
P4OUT |= BIT3;
P4OUT |= BIT1;
P2OUT |= BIT7;
P3OUT &=~ BIT2;
P4OUT &=~ BIT2;
P3OUT &=~ BIT7;
break;
case 4:
P3OUT |= BIT7;//显示4
P4OUT |= BIT3;
P4OUT |= BIT0;
P4OUT |= BIT1;
P3OUT &=~ BIT2;
P2OUT &=~ BIT7;
P4OUT &=~ BIT2;
P8OUT &=~ BIT2;
break;
case 5:
P8OUT |= BIT2;//显示5
P3OUT |= BIT7;
P4OUT |= BIT3;
P4OUT |= BIT1;
P2OUT |= BIT7;
P3OUT &=~ BIT2;
P4OUT &=~ BIT2;
P4OUT &=~ BIT0;
break;
case 6:
P8OUT |= BIT2;//显示6
P3OUT |= BIT7;
P4OUT |= BIT3;
P4OUT |= BIT1;
P2OUT |= BIT7;
P3OUT |= BIT2;
P4OUT &=~ BIT2;
P4OUT &=~ BIT0;
break;
case 7:
P8OUT |= BIT2;//显示7
P4OUT |= BIT0;
P4OUT |= BIT1;
P3OUT &=~ BIT2;
P2OUT &=~ BIT7;
P4OUT &=~ BIT2;
P4OUT &=~ BIT3;
P3OUT &=~ BIT7;
break;
case 8:
P8OUT |= BIT2;//显示8
P4OUT |= BIT0;
P4OUT |= BIT1;
P3OUT |= BIT2;
P2OUT |= BIT7;
P4OUT |= BIT3;
P4OUT |= BIT0;
P3OUT |= BIT7;
P8OUT |= BIT2;
break;
case 9:
P8OUT |= BIT2;//显示9
P4OUT |= BIT0;
P4OUT |= BIT1;
P2OUT |= BIT7;
P4OUT |= BIT3;
P4OUT |= BIT0;
P3OUT |= BIT7;
P8OUT |= BIT2;
P3OUT &=~ BIT2;
break;
case 0:
P8OUT |= BIT2;//显示0
P4OUT |= BIT0;
P4OUT |= BIT1;
P2OUT |= BIT7;
P3OUT |= BIT2;
P3OUT |= BIT7;
P8OUT |= BIT2;
P4OUT &=~ BIT3;
break;
}
}
void IOint()//I/O端口初始化
{
P3DIR |= BIT2;//E1
P2DIR |= BIT7;//D2
P4DIR |= BIT2;//DP3
P4DIR |= BIT1;//C4
P4DIR |= BIT3;//G5
P4DIR |= BIT0;//B7
P3DIR |= BIT7;//F10
P8DIR |= BIT2;//A11
P6DIR |= BIT0;//DIG1
P6DIR |= BIT1;//DIG2
P6DIR |= BIT2;//DIG3
P6DIR |= BIT3;//DIG46.3
P3OUT &=~ BIT2;
P2OUT &=~ BIT7;
P4OUT &=~ BIT2;
P4OUT &=~ BIT1;
P4OUT &=~ BIT3;
P4OUT &=~ BIT0;
P3OUT &=~ BIT7;
P8OUT &=~ BIT2;
P6OUT |=BIT0;
P6OUT |=BIT1;
P6OUT |=BIT2;
P6OUT |=BIT3;
}
void display_dig1(int number)//数码管第一位显示
{
P6OUT &=~ BIT0;
P6OUT |=BIT1;
P6OUT |=BIT2;
P6OUT |=BIT3;
display_number(number);
}
void display_dig2(int number)//数码管第二位显示
{
P6OUT &=~ BIT1;
P6OUT |= BIT0;
P6OUT |= BIT2;
P6OUT |= BIT3;
display_number(number);
}
void display_dig3(int number)//数码管第三位显示
{
P6OUT &=~ BIT2;
P6OUT |= BIT1;
P6OUT |= BIT0;
P6OUT |= BIT3;
display_number(number);
}
void display_dig4(int number)//数码管第四位显示
{
P6OUT &=~ BIT3;
P6OUT |= BIT1;
P6OUT |= BIT2;
P6OUT |= BIT0;
display_number(number);
}
void temperaturepwm_digital_display(int temperature,int pwm)
//将两个两位数转换为四个个位数并进行显示
{
int dig1,dig2,dig3,dig4;
dig1 = temperature/10;
dig2 = temperature - dig1*10;
dig3 = pwm/10;
dig4 = pwm - dig3*10;
while(1)
{
display_dig1(dig1);//第一位显示
__delay_cycles(DelayTime);//延迟
display_dig2(dig2);//第二位显示
__delay_cycles(DelayTime);//延迟
display_dig3(dig3);//第二位显示
__delay_cycles(DelayTime);//延迟
display_dig4(dig4);//第二位显示
__delay_cycles(DelayTime);//延迟
}
}
int main(void)
{
int temperature = 45;//定义两个要显示的两位数
int pwm = 66;
WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗
IOint();
temperaturepwm_digital_display(temperature,pwm);
return 0;
}