#include<msp430x43x.h>
#define uint unsigned int
#define uchar unsigned char
#define hourH LCDMEM[10]
#define hourL LCDMEM[11]
#define miniteH LCDMEM[12]
#define miniteL LCDMEM[13]
#define secondeH LCDMEM[0]
#define secondeL LCDMEM[1]
#define KEY1 BIT2
#define KEY2 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 不带第八位
char lcd_tab[3]={0x00,0x50,0x60};//时钟的显示 时 的高位
void delay(uint k)
{
uint 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);
P2IE|=KEY1|KEY2; //开中断
P2IES|=KEY1|KEY2; //下降沿
}
void LCDInit()
{
WDTCTL=WDTPW+WDTHOLD;
LCDCTL=0XFD;
BTCTL=0X2d; //定时器时钟设置 中断频率为2^15/256/64
SCFQCTL=SCFQ_64K;
P5SEL=0XFC;
P4SEL|=0XFC; //P4端口功能选择外接模块
LCD_clear();
}
/*********LCD全部置零********/
void Resit()
{
for(int i=0;i<20;i++)
LCDMEM[i]=0x00;
}
void display()//
{
secondeL=lcd_sed[seconde%10];//秒低位
secondeH=lcd_sed[seconde/10];//秒高位
miniteL=lcd_sed[minite%10];//分的低位
miniteH=lcd_sed[minite/10];//分的高位
hourL=lcd_sed[hour%10];//时的低位
hourH=lcd_tab[hour/10];//时的高位
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
FLL_CTL0|=XCAP18PF;
IE2|=0X80;
P2_Init();
LCDInit();
_EINT(); //打开全局中断
for(;;)
{
LPM3;
}
}
#pragma vector=PORT2_VECTOR //P2端口中断子程序
__interrupt void PORT2_ISR(void)
{
LPM3_EXIT;
if(P2IFG&KEY1)
{
delay(200);
if(P2IFG&KEY1)
{
setflag++;
setflag&=0x07;
display();
P2IFG&=~KEY1;
}
}
else if(P2IFG&KEY2)
{
delay(200);
{
if(P2IFG&KEY2)
{
switch(setflag)
case 1:
hour++;
if(hour==24)
hour=0;
hourL=lcd_sed[hour%10];
hourH=lcd_sed[hour/10];
break;
case 2:
minite++;
if(minite==60)
minite=0;
miniteL=lcd_sed[minite%10];
miniteH=lcd_sed[minite/10];
break;
case 3:
seconde++;
if(seconde==60)
seconde=0;
secondeH=lcd_sed[seconde/10];
secondeL=lcd_sed[seconde%10];
default:
break;
}
}
}
P2IFG&=~KEY2;
}
#pragma vector=BASICTIMER_VECTOR //P2端口中断子程序
__interrupt void BT_ISR(void)
{
LPM3_EXIT;
hfsec++;
hfsec&=0x01; //满2进1
LCDM12^=0x10; //秒点闪烁,不改变其他位
if(setflag)
{
switch(setflag)
{
case 1:
hourH=hfsec*lcd_tab[hour/10];
hourL=hfsec*lcd_sed[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];
default:
break;
}
}
else if(hfsec)
{
seconde++;
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
hour=0;
}
}
display();
}
}
此帖出自
小平头技术问答
一周热门 更多>