📄 led.c
字号:
//乡村小路交通灯
//小路有传感器 P1.0,有车时,两路按照时间交换红绿灯,
//无车时,大路一直绿灯,
// 小路绿灯时,若无车立即向小路红灯,大路绿灯转换
#include <msp430x44x.h>
void Key(void);
void delay(int v); //延时子程序
unsigned data1;//全局变量,用于传递时间信值
unsigned data2; //全局变量,用于传递计满数就停止计数的时间值
unsigned kk,z1;
void main (void)
{
unsigned state;
unsigned x1,y1;
unsigned char seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗
TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器,
// TASSEL0=0x0100,选择辅助时钟ACLK,
// TACLR=0x0004,清除定时器A计数器
CCTL0 = CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断
CCR0 =16384; //设置捕获/比较寄存器,初始值为16384,对于32768Hz的频率,相当于0.5s
TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数
_EINT(); //使能中断,这是一个C编译器支持的内部过程。
//p3,p4,p5初始化
P3DIR =0XFF; //P3为输出
P4DIR=0XFF;//P4为输出
P5DIR=0XFF;//P5为输出
P2DIR=0XFF;//P2连接 二极管
P2OUT=0XDE;
state=0;
while(1) //无限次while循环
{
x1=data1/10; //个位
z1=data1%10;//十位
y1=state;
P4OUT=seg[x1]; //显示个位
P3OUT=seg[z1];//显示十位
P5OUT=seg[y1];
Key();
if( state==0 && data1==4 )
{P2OUT=0XDE; //主路红,小路黄
state=1;
data1=0;
}
if(state==1 && data1>=7 && kk==1) //KK=1表示小路有车
{P2OUT=0XEE; //主路绿,小路红?
state=2;
data1=0;}
if( state==2 && data1==4 )
{P2OUT=0XF3; //主路黄,小路红
state=3;
data1=0;}
if(state==3 && (data1==9 || kk==0))
{P2OUT=0XF5;
state=0;
data1=0;} //0状态,主路红,小路绿 KK=0表示小路无车
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
//interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的CC0中断处理程序
//TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC
{
//P3OUT ^= BIT7; //将P3.7引脚取反,就是使发光二极管闪烁
data1++;
if (data1>=91)
data1=0;
}
void delay(int v) //键盘判断延时子程序
{
while(v!=0)
v--;
}
void Key(void) //接P1.0的按键函数
{
if(P1IN==0xFE)//如果按键按下
{
delay(2666);
if(P1IN ==0xFE) //如果按键按下
kk=0;
}
else
kk=1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -