目录
1、前言
2、仿真
3、程序
资料下载地址:基于MSP430F249的电子钟仿真(源码+仿真)
1、前言
基于MSP430F249的电子钟仿真,数码管显示时分秒,并可以通过按键调节时间。
2、仿真
3、程序
#include <MSP430x24x.h>
#define uchar unsigned char
#define uint unsigned int
uchar const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管段选码表,无小数点0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
struct {uchar hou;uchar min;uchar sec;
}time;
struct {uchar hou:1;uchar min:1;uchar sec:1;
}Flashflag;
uchar Disbuf[8],Index;
uint count1ms,FlashCnt;
uchar Keytimes=0;
void delayms(uint t)
{uint i;while(t--)for(i=1330;i>0;i--);//进过参数的调整
}
void Init_Timer_A(void)
{CCTL0 = CCIE; // 使能CCR0 中断TAR=0xFC18; // 计数装入初值TACTL=TASSEL_2+MC_2+TAIE+ID_3;//设置时钟源和计数模式 采用SMCLK/8 =1Mhz }
void Refreshtime(void)
{if(Flashflag.hou){Disbuf[1]=table[time.hou%10];Disbuf[0]=table[time.hou/10]; }else{Disbuf[1]=0x00;Disbuf[0]=0x00; }if(Flashflag.min){Disbuf[3]=table[time.min/10];Disbuf[4]=table[time.min%10];}else{Disbuf[3]=0x00;Disbuf[4]=0x00; }if(Flashflag.sec){Disbuf[6]=table[time.sec/10];Disbuf[7]=table[time.sec%10]; }else{Disbuf[6]=0x00;Disbuf[7]=0x00; }}
uchar ReadKey(void)
{static uchar count;uchar temp;temp=P2IN&0x07;if(temp!=0x07){if(++count==10){return temp;}else if(count>=200){count=180;return temp;}elsereturn 0xFF;}else{ count=0;return 0xFF;}
}
void KeyProcess(void)
{uchar temp;temp=ReadKey();if(temp!=0xFF){temp=temp^0x07;if(temp&0x01){if(++Keytimes==4){Keytimes=0;Flashflag.hou=1;Flashflag.min=1;Flashflag.sec=1;FlashCnt=0;} }if(temp&0x02){if(Keytimes==1){if(++time.hou>=24)time.hou=0;}else if(Keytimes==2){if(++time.min>=60)time.min=0;}else if(Keytimes==3){if(++time.sec>=60)time.sec=0;}}if(temp&0x04){if(Keytimes==1){if(time.hou--==0)time.hou=23;}else if(Keytimes==2){if(time.min--==0)time.min=59;}else if(Keytimes==3){if(time.sec--==60)time.sec=59;}}}
}void main(void)
{WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗P4DIR=0x01; P1DIR=0xFF; // 设置方向P1SEL=0; // 设置为普通I/O 口P3DIR=0xFF; // 设置方向P3SEL=0; // 设置为普通I/O 口P1OUT=0x00;P3OUT=0xFF;P2DIR=0x0;P2OUT=0x07;P2SEL=0x00; time.hou=12;Flashflag.hou=1;Flashflag.min=1;Flashflag.sec=1;Disbuf[2]=0x40;Disbuf[5]=0x40;Refreshtime();Init_Timer_A();_BIS_SR(LPM0_bits+ GIE);//进入低功耗睡眠模式while(1){P3OUT=0xFF;if(++Index==8) Index=0;delayms(1);}}
#pragma vector=TIMERA0_VECTOR //定时器A 中断服务程序
__interrupt void Timer_a(void)
{ switch(TAIV) //TAIV 表示中断向量号 { case 2:break; case 4:break; case 10: //TAIV=10 表示中断计数器溢出中断 TAR=0xFC18;// (65536-1000) P4OUT=P4OUT^0x01;if(++count1ms==220){time.sec++;count1ms=0;if(time.sec>=60){time.sec=0;time.min++;if(time.min>=60){time.min=0;if(++time.hou>=24)time.hou=0;}}}if(Keytimes){if(++FlashCnt>=80){if(Keytimes==1){Flashflag.hou=!Flashflag.hou;Flashflag.min=1;Flashflag.sec=1;}else if(Keytimes==2){Flashflag.min=!Flashflag.min;Flashflag.hou=1;Flashflag.sec=1;}else if(Keytimes==3){Flashflag.sec=!Flashflag.sec;Flashflag.hou=1;Flashflag.min=1;}FlashCnt=0;}}KeyProcess();Refreshtime(); //TACCR0=0xF000;break; }LPM0_EXIT;}