📄 main.c
字号:
#include <msp430x41x.h>
//定义按键
#define SET BIT3
#define START_UP BIT4
#define STOP_DOWN BIT5
//定义系统模式,由按键改变系统模式,不同的模式执行不同的任务
#define MODE_SET_TIME 1
#define MODE_OK 10
#define MODE_UP 11
#define MODE_DOWN 12
#define MODE_START 2
#define MODE_STOP 3
//set_flag的几种状态值,根据其值移位分别调整minute的个位,十位和百位
#define BAIWEI 1
#define SHIWEI 2
#define GEWEI 3
#define DONE 4
// LCD segment definitions ( 4-mux LCD)
/*
#define SEG_F 0x80 // AAAA
#define SEG_G 0x40 // F B
#define SEG_E 0x20 // F B
#define SEG_D 0x10 // GGGG
#define SEG_A 0x08 // E C
#define SEG_B 0x04 // E C
#define SEG_C 0x02 // DDDD H
#define SEG_H 0x01
*/
#define SEG_A 0x80 // AAAA
#define SEG_B 0x40 // F B
#define SEG_C 0x20 // F B
#define SEG_H 0x10 // GGGG
#define SEG_F 0x08 // E C
#define SEG_G 0x04 // E C
#define SEG_E 0x02 // DDDD H
#define SEG_D 0x01
const unsigned char LCD_Tab[] = {
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F, // Displays "0"
SEG_B + SEG_C, // Displays "1"
SEG_A + SEG_B + SEG_D + SEG_E + SEG_G, // Displays "2"
SEG_A + SEG_B + SEG_C + SEG_D + SEG_G, // Displays "3"
SEG_B + SEG_C + SEG_F + SEG_G, // Displays "4"
SEG_A + SEG_C + SEG_D + SEG_F + SEG_G, // Displays "5"
SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "6"
SEG_A + SEG_B + SEG_C, // Displays "7"
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"
SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G, // Displays "9"
SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G, // Displays "A"
SEG_B + SEG_C + SEG_E + SEG_F + SEG_G, // Displays "H"
SEG_A + SEG_D + SEG_E + SEG_F, // Displays "C"
SEG_D + SEG_E + SEG_F, // Displays "L"
SEG_A + SEG_B + SEG_E + SEG_F + SEG_G, // Displays "P"
0x00 // Displays Blank
};
//unsigned char menu=0;
//unsigned char flag=0;
unsigned int MODE=0; //系统状态
unsigned char set_flag = 0;
//unsigned char editing = 0; //定义修改标志
//unsigned char flash = 0; //被修改位闪烁标志
unsigned char first_start = 0;
//unsigned char low_bat = 0; // low battary voltage flag
unsigned int minute;
unsigned char second;
unsigned char bat_second = 0;
unsigned char bat_minute = 0;
unsigned char ge=0,shi=0,bai=0;
unsigned int timer_set = 60; // count_down timer value
//int timer_buffer[2] = {0}; //for MINITE and SECOND storage
unsigned char time_disbuff[6] = {0}; //datas for LCD display
//循环一次约5us
void delay(unsigned int v)
{
while(v!=0)v--;
}
void ClrLcd(void)
{
unsigned int i;
for(i=0;i<6;i++)
LCDMEM[i]=0;
}
void InitLcd(void)
{
LCDCTL|=LCDON+LCD4MUX+LCDP0;//LCDP1;
BTCTL |= BTFRFQ0; // BTFRQ0
P5SEL|=0XFC;
ClrLcd();
}
void InitBt(void)
{
BTCTL=BT_ADLY_1000; // for 1s timer interrupt
//IE2 &= ~BTIE;
IE2 |= BTIE;
}
void InitPort(void)
{
P1IE = 0;
P1IFG = 0;
P1IES |= STOP_DOWN+START_UP+SET;
P1IE |= STOP_DOWN+START_UP+SET; //BIT3+BIT4+BIT5;
//设置比较器,做电池电压检测。接P1.6,CA0
CACTL1 |= CARSEL+CAREF_2+CAON;//CAIES+CAIE+CAON;
CACTL2 |= P2CA0+CAF;
//CACTL1 &= ~CAON;
//P1.7做电池欠压指示,正常输出0,欠压输出方波信号,指示灯闪烁
P1DIR |= BIT7;
P1OUT &= ~BIT7;
//P2.0 控制电机启停,初始状态输出为0,关闭电机
P2DIR |= BIT0;
P2OUT &= ~BIT0;
}
void InitSys(void)
{
FLL_CTL0 |= XCAP14PF;
//TACTL = TASSEL0+MC1+TACLR;
InitPort();
InitBt();
InitLcd();
}
void LCD_disp(unsigned char location,unsigned char num)
{
LCDMEM[location]=LCD_Tab[num];
}
//时间值转换为LCD显示的单个数字
void time_convert(void)
{
time_disbuff[0] = minute/100;
time_disbuff[1] = (minute%100)/10;
time_disbuff[2] = minute%10;
//time_disbuff[3] = SEG_G;
time_disbuff[4] = second/10;
time_disbuff[5] = second%10;
}
//时间显示函数
void time_display(void)
{
unsigned char i;
for(i=0;i<6;i++)
{
LCD_disp(i,time_disbuff[i]);
if(time_disbuff[0]==0)
{
if(time_disbuff[1]==0)
{
LCDMEM[0]=0;
LCDMEM[1]=0;
}
else
LCDMEM[0]=0;
}
if(second==60)
{
LCDMEM[4] = LCD_Tab[0];
LCDMEM[5] = LCD_Tab[0];
}
if(i==3)LCDMEM[i] = SEG_G;
}
}
//设置定时时间时,更新LCD显示
void LCD_update(void)
{
unsigned char i;
time_disbuff[0] = minute/100;
time_disbuff[1] = (minute%100)/10;
time_disbuff[2] = minute%10;
for(i=0;i<3;i++)
{
LCD_disp(i,time_disbuff[i]);
if(time_disbuff[0]==0)
{
if(time_disbuff[1]==0)
{
LCDMEM[0]=0;
LCDMEM[1]=0;
}
else
LCDMEM[0]=0;
}
}
LCDMEM[3] = SEG_G;
LCDMEM[4] = LCD_Tab[0];
LCDMEM[5] = LCD_Tab[0];
}
//设置定时时间
void set_time(void)
{
//IE2 |= BTIE;
P1IE &= ~(STOP_DOWN+START_UP);
//second = 60;
LCDMEM[0] = LCD_Tab[bai];
LCDMEM[1] = LCD_Tab[shi];
LCDMEM[2] = LCD_Tab[ge];
LCDMEM[3] = SEG_G;
LCDMEM[4] = LCD_Tab[0];
LCDMEM[5] = LCD_Tab[0];
while(set_flag==BAIWEI) //if
{
LCDMEM[0] |= SEG_H;
if(!(P1IN&START_UP))
{
bai ++;
if(bai>9)bai=0;
LCDMEM[0] = LCD_Tab[bai]|SEG_H;
delay(60000);
}
if(!(P1IN&STOP_DOWN))
{
if(bai<1)bai=9;
else bai --;
LCDMEM[0] = LCD_Tab[bai]|SEG_H;
delay(60000);
}
}
while(set_flag==SHIWEI)
{
LCDMEM[1] |= SEG_H;
if(!(P1IN&START_UP))
{
shi ++;
if(shi>9)shi=0;
LCDMEM[1] = LCD_Tab[shi]|SEG_H;
delay(60000);
}
if(!(P1IN&STOP_DOWN))
{
if(shi<1)shi=9;
else shi --;
LCDMEM[1] = LCD_Tab[shi]|SEG_H;
delay(60000);
}
}
while(set_flag==GEWEI)
{
LCDMEM[2] |= SEG_H;
if(!(P1IN&START_UP))
{
ge ++;
if(ge>9)ge=0;
LCDMEM[2] = LCD_Tab[ge]|SEG_H;
delay(60000);
}
if(!(P1IN&STOP_DOWN))
{
if(ge<1)ge=9;
else ge --;
LCDMEM[2] = LCD_Tab[ge]|SEG_H;
delay(60000);
}
}
if(set_flag==DONE)
{
set_flag = 0;
if(bai>0)
{
minute = bai*100+shi*10+ge;
}
else
{
minute =shi*10+ge;
}
bai=0;shi=0;ge=0;
second = 60;
ClrLcd();
LCD_update();
}
MODE = 0;
P1IE |= STOP_DOWN+START_UP;
}
//启动电机,开始采样
void motor_start(void)
{
if(minute<1)return;
P2OUT |= BIT0;
/*
if(first_start)
{
delay(40000);
delay(30000);
first_start = 0;
}*/
//IE2 |= BTIE; //开启BT中断
}
//关闭电机,停止采样,采样时间回复初始值
void motor_stop(void)
{
P2OUT &= ~BIT0;
//IE2 &= ~BTIE; //关闭BT中断
minute = timer_set;
second = 60;
LCD_update();
}
void main (void)
{
//int timer_set = 60; // 默认设置时间,分钟
WDTCTL = WDTPW + WDTHOLD;
InitSys();
_EINT();
minute = timer_set;
second = 60;
LCD_update();
while(1)
{
// _BIS_SR(LPM3_bits+GIE);
switch(MODE)
{
case MODE_SET_TIME:
{
set_time();
break;
}
case MODE_START:
{
motor_start();
time_convert();
time_display();
break;
}
case MODE_STOP:
{
motor_stop();
break;
}
default:
{
//_BIC_SR_IRQ(LPM3_bits);
break;
}
}
}
}
// 1000ms timer
#pragma vector = BASICTIMER_VECTOR
__interrupt void BTISR (void)
{
//if(!(editing))
//{
if((MODE == MODE_START)&&(minute>0))
{
second --;
if(second <1)
{
second = 60;
minute --;
if(minute<1)
{
MODE = MODE_STOP;
}
}
}
if(!(CACTL2&CAOUT)) // 如果电池电压低,BT提供LED闪烁时基
{
//bat_second ++;
P1OUT ^= BIT7;
/*if(bat_second>59)
{
bat_second = 0;
bat_minute ++;
if(bat_minute>5) // 检测到电池电压低,5分钟以后关闭电机,停止采样
{
bat_minute = 0;
MODE = MODE_STOP;
return;
}
}*/
}
}
#pragma vector = PORT1_VECTOR
__interrupt void P1ISR (void)
{
if(P1IFG&SET)//(!(P1IN&SET))
{
delay(3000); //延时15ms,按键去抖
if(!(P1IN&SET))
{
if(MODE==MODE_START)
return;
else
{
MODE = MODE_SET_TIME;
set_flag +=1;
if(set_flag>4)set_flag=0;
while(!(P1IN&SET)){_NOP();} //按键抬起检测
}
}
_BIC_SR_IRQ(LPM3_bits);
}
else if(P1IFG&START_UP)//(!(P1IN&START_UP))
{
delay(3000);
if(!(P1IN&START_UP))
{
MODE = MODE_START;
first_start = 1;
}
_BIC_SR_IRQ(LPM3_bits);
}
else if(P1IFG&STOP_DOWN)//(!(P1IN&STOP_DOWN))
{
delay(3000);
if(!(P1IN&STOP_DOWN))
{
MODE = MODE_STOP;
}
_BIC_SR_IRQ(LPM3_bits);
}
P1IFG = 0;
}
//interrupt[TIMERA0_VECTOR] void Timer_A (void)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
//_DINT();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -