|
本帖最后由 SDC158477392 于 2014-8-8 11:57 编辑
欢迎大家提出宝贵意见,谢谢
/*******************************************************
* 程序功能:用3个IO口实现数码管动态显示76543210
* 硬件说明:使用MSP430F149,两个595串连,SRCLK接P40,SER接P41,RCLK接P42
* 实验现象:数码管显示76543210
* 日 期 : 2014/8/8
* 作 者 : 舒代超
*******************************************************/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
uchar table_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管0~9显示数字
uchar table_wei[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位码
static uchar j=0; //显示变量
/*******************************************
函数名称:Send_Data(uchar data1)
功 能:数据传送函数
入口参 数:data1
返回值 :无
********************************************/
void Send_Data(uchar data1) //送段选
{
uchar i=0;
for(i=0;i<8;i++)
{
P4OUT=P4OUT&0XFE; //SRCLK初始化
if(data1&0x01)
P4OUT=P4OUT|0x02; //SER赋值
else
P4OUT=P4OUT&0xfd; //SER赋值
P4OUT=P4OUT|0X01;; //SRCLK上升沿
data1=data1>>1;
}
}
/*******************************************
函数名称:display(uchar x)
功 能:数码管显示函数
入口参 数:x
返回值 :无
********************************************/
void display(uchar x)
{
P4OUT=P4OUT&0Xfb; //RCLK 初始化
Send_Data(table_wei[x]); //显示位码
Send_Data(table_duan[x]); //显示段码
P4OUT=P4OUT|0X04; //RCLK 上升沿
}
/********************主函数********************/
void main( void )
{
P4DIR=0XFF; //设置P1口IO方向为输出
P5DIR=0XFF;
P5OUT=0;
WDTCTL=WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次
IE1|=WDTIE; // 使能看门狗中断
_BIS_SR(LPM0_bits+GIE); //CPU进入LPM3低功耗模式,同时打开全局中断
}
/*******************************************
函数名称:watchdog_timer
功 能:看门狗中断服务函数,在这里输出数码管的
段选和位选信号
参 数:无
返回值 :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
display(j);//调用显示函数
j++;//显示加1
if(j>7)j=0;
}
|
|