#include<msp430x43x.h>
#define unit unsigned int
#define uchar unsigned char
#define yeatH LCDMEM[14]
#define yearL LCDMEM[15]
#define monthH LCDMEM[16]
#define monthL LCDMEM[17]
#define dayH LCDMEM[18]
#define dayL LCDMEM[19]
#define hourH LCDMEM[11]
#define hourL LCDMEM[12]
#define miniteH LCDMEM[13]
#define miniteL LCDMEM[14]
//#define secondeH LCDMEM[18]
//#define secondeL LCDMEM[19]
#define KEY1 BIT0
#define KEY2 BIT1
#define KEY2 BIT2
#define KEY1 BIT3
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=0; //时
uchar hfsec;
int setflag;
char tab[10]={0xbf,0xb0,0xdb,0xf9,0xf4,0x7d,0x7f,0xb8,0xff,0xfd};//下0 1 2 3 4 5 6 7 8 9,带第八位
char lcd_sed[10]={0xaf,0xa0,0xcb,0xe9,0xe4,0x6d,0x6f,0xa8,0xef,0xed};//下0 1 2 3 4 5 6 7 8 9 不带第八位
void delay(unit k)
{
unit j,l;
for(j=0;j<k;j++)
for(l=0;l<100;l++);
}
/****LCD初始化*************/
void LCD_clear(){
unsigned char i;
for(i=0;i<20;i++)
LCDMEM[i]=0x00;
}
void P2_Init(void)
{ P2DIR&=~(KEY1|KEY2|KEY3|KEY4); //input
P2OUT|=KEY1|KEY2|KEY3|KEY4;
P2IE|=KEY1|KEY2|KEY3|KEY4; //allow interrupt
P2IES|=KEY1|KEY2|KEY2|KEY2; //falling edge
}
/***
void P2_Init(void)
{
P2DIR&=0xF0; // P2 0 1 2 3 input
// P2REN|=0X0F;
//P2IN=
P2OUT|=0x0f;
P2IE|=0x0f; //P2.0-P2.3 IO口中断使能
P2IES|=0x0f; //下降沿
//P2SEL|=0xf0;
P2IFG&=~0x0f;// P2.0-P2.3 IO口中断标志位清除
}****/
void LCDInit()
{
WDTCTL = WDTPW + WDTHOLD;
LCDCTL=0XFD;
BTCTL=0x2d;//定时器时钟频率
SCFQCTL=SCFQ_64K;
P5SEL=0XFC;
P4SEL|=0XFC;//P4端口功能选择外接模块
LCD_clear();
}
/*********LCD全部置零********/
void Resit()
{
for(int i=14;i<20;i++)
LCDMEM[i]=0xaf;
}
//显示函数放在中断中则 初始值定义无效
void display()//
{
LCDMEM[19]=lcd_sed[seconde%10];//秒低位
LCDMEM[18]=lcd_sed[seconde/10];//秒的高位
LCDMEM[17]=lcd_sed[minite%10];//分低位
LCDMEM[16]=lcd_sed[minite/10];//分高位
LCDMEM[15]=tab[hour%10];//时低位
LCDMEM[14]=lcd_sed[hour/10]; //时高位
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0|=XCAP18PF;
IE2|=0x80;
P2_Init();
LCDInit();
Resit();
_EINT();
for(;;)
{ //display();//显示程序放在主程序中不能闪烁显示
LPM3;
}
}
#pragma vector=PORT2_VECTOR //P2端口中断子程序
__interrupt void PORT2_ISR(void)
{
LPM3_EXIT;
if(P2IFG&KEY1)
{
setflag++;
setflag&=0x03;
display();
P2IFG&=~KEY1;
}
else if(P2IFG&KEY2)
{
switch(setflag)
{
case 0:
break;
case 1:
hour++;
if(hour==24)
hour=0;
LCDMEM[15]=tab[hour%10];//时低位
LCDMEM[14]=lcd_sed[hour/10]; //时高位
break;
case 2:
minite++;
if(minite==60)
minite=0;
LCDMEM[17]=lcd_sed[minite%10];//分低位
LCDMEM[16]=lcd_sed[minite/10];//分高位
break;
case 3:
seconde++;
if(seconde==60)
seconde=0;
secondeH=lcd_sed[seconde/10];
secondeL=lcd_sed[seconde%10];
break;
default:
break;
}
P2IFG&=~KEY2;
}
}
#pragma vector=BASICTIMER_VECTOR//基础定时器中断子程序
__interrupt void BT_ISR(void)
{
LPM3_EXIT;
hfsec++;
hfsec&=0x01; //满2进1
LCDM20^=0X10; //秒点闪烁
if(setflag)
{
switch (setflag)
{
case 1:
hourH=hfsec*lcd_sed[hour/10];
hourL=hfsec*tab[hour%10];
break;
case 2:
miniteH=hfsec*lcd_sed[minite/10];
miniteL=hfsec*lcd_sed[minite%10];
break;
case 3:
secondeH=hfsec*lcd_sed[seconde/10];
secondeL=hfsec*lcd_sed[seconde%10];
break;
default:
break;
}
}
else if(hfsec)
{
seconde++;
LCDMEM[19]=lcd_sed[seconde%10];//秒低位
LCDMEM[18]=lcd_sed[seconde/10];//秒的高位
if(seconde==60)
{
minite++;
seconde=0;
LCDMEM[17]=lcd_sed[minite%10];//分低位
LCDMEM[16]=lcd_sed[minite/10];//分高位
if(minite==60)
{
hour++;
minite=0;
LCDMEM[15]=tab[hour%10];//时低位
LCDMEM[14]=lcd_sed[hour/10]; //时高位
if(hour==24)
{
hour=0;
}
}
}
}
}
/*******************错误总结
1.显示程序错误,若放在主函数中则导致无法闪烁
2.初始化定义时注意I/O口配置问题,。。
*****/