查看: 2778|回复: 3
打印 上一主题 下一主题

用3个IO口实现数码管动态显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-8 11:23:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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;
    }

回复

使用道具 举报

4#
发表于 2014-8-8 13:42:40 | 只看该作者
好小伙,真棒!
回复 支持 反对

使用道具 举报

地板
发表于 2014-8-8 12:27:10 | 只看该作者
{:soso_e179:}{:soso_e179:}
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2014-8-8 11:59:07 | 只看该作者
红色部分就是与上篇帖子不同的部分http://bbs.enlern.com/thread-6842-1-1.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表