MSP430G2553数码管计时(并行数据传输)
一、设计要求
基于MSP430G2553单片机系统,利用并行数据传输,实现数码管的计时显示。(笔者也是小白一枚,若有错误请原谅并指出)
设计软件:CCS、Proteus
二、一位数码管显示
1、电路设计
在Proteus中搭建MSP430G2553的最小系统,选用驱动芯片74HC245和共阴极数码管7SEG-COM-CAT-GRN,限流电阻选取合适的值,不能太大,否则无法驱动数码管导致不显示。
2、代码设计
CCS的工程创建在此不必赘述,此代码较为简单,只需要使用while循环和一个自定义的延时函数即可。首先利用for循环定义了一个单位为ms的延时函数,由于是利用for循环的语句执行时间来计算的,可能会不太准确。根据电路的连接方式,确定BIT0-BIT6对应的数码管的显示位置,得到下图,根据图位置组合出数字1-9的代码显示。
如下,便是对应电路连接方式的数码管数字显示对应关系
P2OUT=BIT0+BIT1+BIT4+BIT5+BIT6;//9
P2OUT=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//8
P2OUT=BIT4+BIT5+BIT6;//7
P2OUT=BIT0+BIT1+BIT2+BIT3+BIT4+BIT6;//6
P2OUT=BIT0+BIT1+BIT3+BIT4+BIT6;//5
P2OUT=BIT0+BIT1+BIT4+BIT5;//4
P2OUT=BIT0+BIT3+BIT4+BIT5+BIT6;//3
P2OUT=BIT0+BIT2+BIT3+BIT5+BIT6;//2
P2OUT=BIT1+BIT2;//1
工程代码如下:
#include <msp430.h>
/**
* main.c
*/
void delay_ms(int ms)//延时函数
{
for(;ms>0;ms--) __delay_cycles(1000);
}
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer关闭看门狗
P2DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//将P2设置为输出,P2DIR使P2口的方向寄存器
while(1)
{
P2OUT=BIT0+BIT1+BIT4+BIT5+BIT6;//9
delay_ms(50);
P2OUT=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//8
delay_ms(50);
P2OUT=BIT4+BIT5+BIT6;//7
delay_ms(50);
P2OUT=BIT0+BIT1+BIT2+BIT3+BIT4+BIT6;//6
delay_ms(50);
P2OUT=BIT0+BIT1+BIT3+BIT4+BIT6;//5
delay_ms(50);
P2OUT=BIT0+BIT1+BIT4+BIT5;//4
delay_ms(50);
P2OUT=BIT0+BIT3+BIT4+BIT5+BIT6;//3
delay_ms(50);
P2OUT=BIT0+BIT2+BIT3+BIT5+BIT6;//2
delay_ms(50);
P2OUT=BIT1+BIT2;///1
delay_ms(50);
}
return 0;
}
三、两位数码管显示
1、电路设计
基于一位数码管电路,再添加一组驱动芯片和数码管即可,用单片机的P1口进行控制。
2、代码设计
具体代码分析已在注释详细给出
#include <msp430.h>
/**
* main.c
*/
unsigned char code_seg7[10]={
BIT1+BIT2+BIT3+BIT4+BIT5+BIT6,//0
BIT1+BIT2,//1
BIT0+BIT2+BIT3+BIT5+BIT6,//2
BIT0+BIT3+BIT4+BIT5+BIT6,//3
BIT0+BIT1+BIT4+BIT5,//4
BIT0+BIT1+BIT3+BIT4+BIT6,//5
BIT0+BIT1+BIT2+BIT3+BIT4+BIT6,//6
BIT4+BIT5+BIT6,//7
BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6,//8
BIT0+BIT1+BIT4+BIT5+BIT6//9
};
void delay_ms(int ms)//延时函数
{
for(;ms>0;ms--) __delay_cycles(1000);
}
int main(void)
{
unsigned char data_seg7,ten_data,one_data;//定义显示数据,十位数码管数据,个位数码管数据
WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//将P1设置为输出,P2DIR使P2口的方向寄存器
P2DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//将P2设置为输出,P2DIR使P2口的方向寄存器
while(1)
{
for(data_seg7=1;data_seg7<32;data_seg7++)
{
ten_data = data_seg7/10; //对10整除取得十位数据
one_data = data_seg7%10; //对10取余取得个位数据
P1OUT=code_seg7[ten_data]; //P1口输出十位数据
P2OUT=code_seg7[one_data]; //P2口输出个位数据
delay_ms(50);
}
}
return 0;
}