msp430f149的板子,今天写了一个时钟程序,用的1602显示。按键中断修改时间,总中断加上后不能立即正常加时间了。
#include "msp430x14x.h"
#include "cry1602.h"
#include "cry1602.c"
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
unsigned char Key_Value = 0;
//unsigned char keyscan()
//{
// unsigned char key=P1IN&0x0f;
// unsigned char keyvalue,i;
// if(key!=0x0f)
// {
// delay_ms(10);
// if(key!=0x0f)
// {
// keyvalue=key;
// i=0;
// while((i<50)&&(key!=0x0f))
// {
// delay_ms(1);
// i++;
// }
// }
// }
// return keyvalue;
//}
void main( void )
{
int z;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (z = 0xFF; z > 0; z--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
//初始化工作
LcdReset();
int day=29,mon=7,yea=2015,sec=0,min=29,clo=11,daymax;
P1DIR&=BIT0 + BIT1 + BIT2 + BIT3;
P1IE = 0xFF;
while(1)
{
_EINT();
switch(Key_Value)
{
case 1:sec++;break;
case 2:min++;break;
case 3:clo++;break;
case 4:day++;break;
default:break;
}
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
clo++;
}
if(clo==24)
{
clo=0;
day++;
}
switch(mon)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:daymax=31;break;
case 4:case 6:case 9:case 11:daymax=30;break;
case 2:{if((yea%4==0&&yea%100!=0)||yea%400==0)daymax=29;else daymax=28;}break;
}
if(day==daymax)
{
day=1;
mon++;
}
if(mon==12)
{
mon=1;
yea++;
}
_DINT();
Disp1Char(0,0,yea/1000+0x30);
Disp1Char(1,0,(yea/100)%10+0x30);
Disp1Char(2,0,(yea/10)%10+0x30);
Disp1Char(3,0,yea%10+0x30);
Disp1Char(4,0,'/');
Disp1Char(5,0,mon/10+0x30);
Disp1Char(6,0,mon%10+0x30);
Disp1Char(7,0,'/');
Disp1Char(8,0,day/10+0x30);
Disp1Char(9,0,day%10+0x30);
Disp1Char(0,1,clo/10+0x30);
Disp1Char(1,1,clo%10+0x30);
Disp1Char(2,1,':');
Disp1Char(3,1,min/10+0x30);
Disp1Char(4,1,min%10+0x30);
Disp1Char(5,1,':');
Disp1Char(6,1,sec/10+0x30);
Disp1Char(7,1,sec%10+0x30);
delay_ms(1000);
sec++;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
if((P1IFG & BIT0) == BIT0)
{
Key_Value = 1;
P1IFG &= ~BIT0; //清除中断标志
}
else if((P1IFG & BIT1) == BIT1)
{
Key_Value = 2;
P1IFG &= ~BIT1; //清除中断标志
}
else if((P1IFG & BIT2) == BIT2)
{
Key_Value = 3;
P1IFG &= ~BIT2; //清除中断标志
}
else
{
Key_Value = 4;
P1IFG &= ~BIT3; //清除中断标志
}
}
此帖出自
小平头技术问答
一周热门 更多>