📄 main_c.c
字号:
//<#####################光感应急灯2007-10-7修改#############################1
//当无光照时候,程序从休眠状态激活,
//led亮起,led显示器从99秒开始显示剩余秒数,当剩余10秒时
//led变暗,并每秒闪烁一次,且伴有警告音,到0秒时,关闭LED进入休眠状态,
//在倒计时过程中,如恢复光照,则关闭led和led显示器,进入休眠 如无光照,程序休眠激活,又点亮LED,100秒后休眠,以此循环。
//在运行时,按下*号后 暂停倒数,并恢复到99秒,按任意键继续倒数,按#号则程序从19秒开始倒数,按8强行关灯
//p1.5的82号线与GND间接一光敏电阻(可用按键3松开与按下代替),在p5.1与GND间接LED,蜂鸣器直接并联在LED两端即可
#include <msp430x44x.h>
#include "keyboard12.c"
#include "led.c"
void Init_Timer_A(void) //*设置TIMEA定时器,用来产生1秒基准中断
{
TACTL = TASSEL0 + TACLR; // ACLK, clear TAR
CCTL0 = CCIE; // CCR0 中断使能
CCR0=32768; //*定时1秒
TACTL|=MC0; //*增增计数模式
}
void y() //*延时子程序,主要产生报警音频率
{
unsigned long tmp;
for(tmp=50;tmp>0;tmp--);
}
void light_LED(void) //*点亮LED子程序
{
P5DIR |= 0x02;
P5OUT |= 0x02;
}
void quench_LED(void) //*关闭led子程序
{
P5DIR |= 0x02;
P5OUT &= 0xfd;
}
void LED_PRINT(void) //*LED数字显示子程序
{
tmp=0x01; //*只使用后两只数码LED管
P3OUT = ~(tmp<<led_Ctrl); // 设置那只LED显示
P4OUT |= 0x01; // 打开控制锁存
P4OUT &= 0XFE; // 关闭控制锁存
P3OUT = NUM_LED[led_Buf[led_Ctrl]]; // 设置显示值
P4OUT |= 0x02; // 打开数据锁存器
P4OUT &= 0XFD; // 关闭数据锁存
led_Ctrl= (led_Ctrl +1) % 7; // 设置下一个要显示的LED,写7是去除“阴影”
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@主程序开始@@@@@@@@@@@@@@@@@@@@@
void main()
{
WDTCTL = WDTHOLD + WDTPW; //关闭看门狗
Init_Timer_A(); //*初始化timeA中断
init_Keyboard(); //初始化键盘
init_LED(); //初始化LED
P1IE=0x20; //*打开P1.5中断
P1IES=0x00; //*上升沿中断模式
light_LED(); //*打开LED
_EINT(); //*开启所有中断中断
while (1)
{
LED_PRINT();
key_Event();
if (key_val == 3)//*当有光照时(按下3号键)关闭LED进入低功耗,
{
quench_LED();//*关闭LED
led_Buf[5]= 11;
led_Buf[4]= 11;
LED_PRINT();
key_val = 0; //*对key_val清空,即自动开始倒数
_BIS_SR(LPM3_bits); //*进入低功耗模式3(有光照)
}
if (key_val == 11) //*当按下*时,置位为99秒,不对key_val清空,所以一直会置位为99秒,实现暂停
{
led_Buf[5]= 9;
led_Buf[4]= 9;
led_tmp[4]= 0;
led_tmp[5]= 0;
light_LED();
}
if (key_val == 10) //*安下为#号键,跳到19秒开始倒数
{
led_Buf[5]= 9;
led_Buf[4]= 1;
led_tmp[4]= 8;
led_tmp[5]= 0;
light_LED();
key_val = 0;
}
if (key_val == 8) //*安下为9号键,强行关闭系统
{
quench_LED();
led_Buf[5]= 11;
led_Buf[4]= 11;
LED_PRINT();
key_val = 0;
_BIS_SR(LPM3_bits); //*进入低功耗模式3(有光照)
}
if ((led_Buf[4]==0)&(led_Buf[5]%2==1)) //*在10s~0s之间每隔1秒闪灯和警报一次。
{
light_LED();
y();
quench_LED();
}
if (led_Buf[5]==0&(led_Buf[4]==0)) //*在0s时候关闭LED和LED显示器
{
led_Buf[5]= 11;
led_Buf[4]= 11;
LED_PRINT();
quench_LED();
_BIS_SR(LPM3_bits); //*进入低功耗模式3(无光照)
}
}
}
#pragma vector=TIMERA0_VECTOR//*TIMEA中断,每1秒运行一下程序一遍
__interrupt void TimerA0()
{
if (key_Pressed == 0)//*以下是让LED显示从99到0每运行一次,减一。
{
led_Buf[5]=0;
led_tmp[5]=(led_tmp[5]+1)%10;
led_Buf[5]=9-led_tmp[5];
if (led_Buf[5]==9)
{
led_Buf[4]=0;
led_tmp[4]=(led_tmp[4]+1)%10;
led_Buf[4]=9-led_tmp[4];
}
}
}
#pragma vector=PORT1_VECTOR//*P1口中断程序,为低功耗设计,当光照由亮变暗时激活以下程序。
__interrupt void P1_ISR(void)
{
LPM3_EXIT;//*退出低功耗模式3
P1IFG = 0x00;//*恢复中断标志
led_Buf[5]= 9;
led_Buf[4]= 9;
led_tmp[4]= 0;
led_tmp[5]= 0;
light_LED();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -