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,打开总中断 }
如果有帮助麻烦给我点个赞吧/笔芯