zoukankan      html  css  js  c++  java
  • 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,打开总中断
    }

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

  • 相关阅读:
    uniapp、小程序之swiperitem内容过多显示不全的解决方案
    PingFang(苹方)字体的引用
    Vue项目中使用websocket
    uniapp页面跳转传递参数过长
    uniapp开发的h5,使用微信授权登录(前置条件+具体代码)
    Maven工具安装使用
    Lombok代码生成插件使用
    对不起,我的文章暂时无法公开!
    [iOS]学习笔记7(CATransform3DFlip效果)
    [iOS]学习笔记8 (iOS之阻塞)
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/12269064.html
Copyright © 2011-2022 走看看