Msp430 编写交通灯程序

题目:我想想。。。

红灯亮,按下按键后倒计时10秒,倒计时十秒后,绿灯点亮,红灯熄灭,进入绿灯的15秒倒计时,在只剩下3秒的时候,绿灯闪烁。

代码如下,有点麻烦 当时这么写的 就不改了  

#include "msp430f149.h"
#include "config.h"
int key=11;
int temp=16;
unsigned int data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的段码
void display(int key); //函数声明
void delay(int i)
{
  while(i--)
  {
    int n=i;
    while(n--);
  }
}


#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA0_ISR()
{
  
  //进入十秒的倒计时
  if(key>0)
  {
    key--;
    display(key);
    if(key==0)
    {
      P2OUT&=~BIT7;//绿灯点亮,
    }
  }
  else if(key<=0)//接下来进入15秒的倒计时
  {
    if(temp>0)
    {
      P2OUT|=BIT0;//红灯熄灭
      temp--;
      display(temp);
      
      //接下来倒计时到3秒时,绿灯闪烁
      if(temp<=3)
      {
        P2OUT^=BIT7;//绿灯以一秒为周期闪烁
      }
    }
    
    else if(temp<0)
    {
      //当15秒的定时时间结束后,关闭定时器
      P2OUT&=~BIT0;//打开红灯
      
      P4OUT=0XFF;
      P5OUT|=BIT5;//先进行位选
      P4OUT=0XFF;//选择Y7数码管
      P5OUT&=~BIT5;//关闭位选
      
      
      _BIS_SR(LPM4_bits+GIE);//进入低功耗模式0,关闭定时器
    }
  }
}


#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR()
{
  if(P1IFG&BIT0)
  {
    //按键按下后,触发中断
    TACTL|=TASSEL_1+MC_1+TACLR;//定时器时钟源为ACLK,选择增计数模式
    while(!(P1IN&BIT0));
    delay(100);
    P1IFG&=~BIT0;//清除中断标志位
  }
  
}

void display(int key)   //显示函数 key为要显示的数值
{
  unsigned int shi,ge;
  shi=key/10;
  ge=key%10;
  
  P4OUT=0XFF;
  P5OUT|=BIT5;//先进行位选
  P4OUT=0Xbf;//选择Y6数码管 0XBF
  P5OUT&=~BIT5;//关闭位选
  P4OUT=0X00;
  P6OUT|=BIT6;//打开段选
  P4OUT=data[shi];//输出十位数值
  P6OUT&=~BIT6;//关闭段选
  delay(50);
  
  P4OUT=0XFF;
  P5OUT|=BIT5;//先进行位选
  P4OUT=0X7f;//选择Y7数码管
  P5OUT&=~BIT5;//关闭位选
  P4OUT=0X00;
  P6OUT|=BIT6;//打开段选
  P4OUT=data[ge];//输出个位数值
  P6OUT&=~BIT6;//关闭段选
  P4OUT=0XFF;
  
  int k=500;
  while(k--)
  {
    P4OUT=0XFF;
  P5OUT|=BIT5;//先进行位选
  P4OUT=0Xbf;//选择Y6数码管 0XBF
  P5OUT&=~BIT5;//关闭位选
  P4OUT=0X00;
  P6OUT|=BIT6;//打开段选
  P4OUT=data[shi];//输出十位数值
  P6OUT&=~BIT6;//关闭段选
  delay(50);
  
  P4OUT=0XFF;
  P5OUT|=BIT5;//先进行位选
  P4OUT=0X7f;//选择Y7数码管
  P5OUT&=~BIT5;//关闭位选
  P4OUT=0X00;
  P6OUT|=BIT6;//打开段选
  P4OUT=data[ge];//输出个位数值
  P6OUT&=~BIT6;//关闭段选
  P4OUT=0XFF;
  delay(50);
  }
}


void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  BoardConfig();//初始化
  Clock_Init();//系统时钟初始化
  
  //P2.0代表红灯,P2.7代表绿灯, P1.0按键
  P2DIR|=BIT0+BIT7;
  P2OUT&=~BIT0;//初始状态红灯亮
  
  P1IE|=BIT0+BIT7;//中断使能
  P1IES|=BIT0+BIT7;
  P1IFG&=~(BIT0+BIT7);//清除中断标志位
  P1OUT|=(BIT0+BIT7);//P1.0设置为上拉电阻
 
  //数码管的设置
  P5DIR|=BIT5;//P5.5 P6.6设置为输出方向
  P6DIR|=BIT6;
  P6OUT&=~BIT6;//P6.6输出低电平
  P5OUT&=~BIT5;

  //定时器A
  TACCTL0=CCIE;//CCR0允许中断
  TACCR0=32767;//定时时间间隔为1S  0.5s
  TACTL|=TASSEL_1;
  _BIS_SR(LPM0_bits+GIE);//进入低功耗模式0,打开总中断
}

 如果有帮助麻烦给我点个赞吧/笔芯

posted @ 2020-02-06 16:12  阳光中的影子  阅读(1084)  评论(0编辑  收藏  举报