基于MSP430的简易时钟程序

#include
#include "Config.h"


uchar key_num=0;
uchar flag=0;
uchar sec=0,mit=0,hor=0,key;

void Port_init() //I/O口初始化
{
P4SEL=0x00;
P4DIR=0xff;
P5SEL=0x00;
P5DIR|=BIT5+BIT6+BIT7;
}

void LCD_COM(uchar a) //写命令
{
RS_CLR;
RW_CLR;
EN_SET;
delay_us(50);
DataPort=a;
delay_us(50);
EN_CLR;
delay_us(50);
}

void LCD_Write(uchar b) //写数据
{
RS_SET;
RW_CLR;
EN_SET;
delay_us(50);
DataPort=b;
delay_us(50);
EN_CLR;
delay_us(50);
}

void LCD_init() //LCD1602初始化
{
RW_CLR;
EN_CLR;
LCD_COM(0x01); //清指令
LCD_COM(0x38); //模式设置
LCD_COM(0x0c); //开显示,不显示光标,光标不闪烁
LCD_COM(0x06); //光标加一,整屏不移动
}

void LCD_string(uchar x,uchar y,uchar *s) //字符串输入函数 x:列 y:行
{
if(y==0)
LCD_COM(0x80+x);
else
LCD_COM(0xc0+x);
while(*s)
{
LCD_Write(*s);
s++;
}
}

void time_go(uchar x,uchar y) //时间改变子函数
{
uchar a,b;
a=y/10;
b=y%10;
LCD_COM(0xc0+x);
LCD_Write(0x30+a);
LCD_Write(0x30+b);
}


uchar keyscan(void) //按键扫描子函数
{
// uchar key_check;
uchar key_checkin;
key_checkin=KeyPort; //读取IO口状态,判断是否有键按下
key_checkin&= 0x0F; //读取IO口状态,判断是否有键按下
if(key_checkin!=0x0F) //IO口值发生变化则表示有键按下
{
delay_us(50);
key_checkin=KeyPort;
if(key_checkin!=0x1F)
{
// key_check=KeyPort&0x0f;
while((KeyPort&0x0f)!=0x0f); //等待按键松开

switch (key_checkin & 0x0F)
{
case 0x0E:key=1;break;
case 0x0D:key=2;break;
case 0x0B:key=3;break;
case 0x07:key=4;break;
}


}

}
else
{
key=0xFF;
}

return key;
}

void time_cor() //按键调整时间子函数
{

if(key==1)
{
_DINT(); //关中断
key_num++;
if(key_num==1)
{
LCD_COM(0xc0+11);
LCD_COM(0x0F);
}
if(key_num==2)
{
LCD_COM(0xc0+8);
}
if(key_num==3)
{
LCD_COM(0xc0+5);
}
if(key_num==4)
{
key_num=0;
LCD_COM(0x0C);
_EINT(); //开中断
}
}
if(key_num!=0)
{
if(key==2)
{
if(key_num==1)
{
sec++;
if(sec==60)
sec=0;
time_go(10,sec);
LCD_COM(0xc0+11);
}
if(key_num==2)
{
mit++;
if(mit==60)
mit=0;
time_go(7,mit);
LCD_COM(0xc0+8);
}
if(key_num==3)
{
hor++;
if(hor==24)
hor=0;
time_g

o(4,hor);
LCD_COM(0xc0+5);
}
}
}

}


void timerA_init() //定时器A初始化
{
TACTL |= TASSEL0+ TACLR + MC0 + TAIE;
CCR0=32768;
}

#pragma vector=TIMERA1_VECTOR //定时器A中断函数
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2:
break;
case 4:
break;
case 10:
flag=1;
break;
}
if(flag==1)//计时
{
flag=0;
sec++;
if(sec==60)
{
sec=0;
time_go(10,sec);
mit++;
if(mit==60)
{
mit=0;
time_go(7,mit);
hor++;
if(hor==24)
{
hor=0;
time_go(4,hor);
}
else
time_go(4,hor);
}
else
time_go(7,mit);
}
else
time_go(10,sec);
}
}

void main()
{
WDT_Init();//关开门狗程序
Clock_Init_Ex32768();//系统时钟初始化,MCLK为32.768kHz
Port_init();//I/O端口初始化
delay_us(100);
/**********LCD1602初始化*************/
LCD_init();
LCD_string(0,0,"Time of CST:");
LCD_string(4,1,"00:00:00");
/************************************/
timerA_init();
_EINT();
while(1)
{
keyscan();
delay_us(100);
time_cor();
}
}

相关文档
最新文档