- /**********************************
- ***********************************
- 编译环境:IAR for MSP430
- ***项目名称:MINI时钟***
- ***芯片型号: MSP430G2553
- ***参数:
- **数码管: 四段共阳数码管 型号:LG2841BH(可采用74HC595驱动)
- *数据口: a~dp---P1.0~P1.7
- *数码管段选: DB1~DB4---P2.0~P2.3(低电平有效)
- ***按键 : (按下为低电平)K1--P2.4;K2--P2.5;
- **********************************
- **********************************/
- #include"in430.h"
- #include "msp430g2553.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管0~9显示数组
- uchar SW=0,ss=0,as=0,bs=0,cs=0,dp=0,ac=0;//定义全局变量
- /**********数码管显示函数***********/
- void xianshi(uchar shi,uchar fen)
- {
- P1OUT=0x00;P2OUT&=0xF0;//数码管清零
- uchar s1=0,s2=0,s3=0,s4=0;//定义局部变量
- s1=shi/10;s2=shi%10;s3=fen/10;s4=fen%10;//数位分解
-
- P2OUT&=~BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
- P1OUT=table[s1];
- __delay_cycles(1000);
-
- P2OUT|=BIT0;P2OUT&=~BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
- switch(dp)//小数点显示选择
- {
- case 1:P1OUT=(table[s2]&0x7F);break;
- case 0:P1OUT=table[s2];break;
- default:break;
- }
- __delay_cycles(1000);
-
- P2OUT|=BIT0;P2OUT|=BIT1;P2OUT&=~BIT2;P2OUT|=BIT3;
- P1OUT=table[s3];
- __delay_cycles(1000);
-
- P2OUT|=BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT&=~BIT3;
- P1OUT=table[s4];
- __delay_cycles(1000);
- }
- /************P2.5输入判断函数******************/
- void IO_INIT()
- {
- if((P2IN&0x20)==0)
- {
- __delay_cycles(2);
- if((P2IN&0x20)==0)
- {
- SW++;
- if(SW==3)
- {SW=0;}
- }
- }
- while((P2IN&0x20)==0);
- }
- void IO_INIT2()
- {
- if((P2IN&0x10)==0)
- {
- __delay_cycles(2);
- if((P2IN&0x10)==0)
- {
- ac^=1;
- }
- }
- while((P2IN&0x10)==0);
- }
- /*********IO口初始化函数********/
- void SZ_INIT()
- {
- P1DIR|=0xFF;//配置P1口为输出
- P1OUT|=0xff;//P1口赋初值,输出0xFF
- P2DIR|=0x0F;//配置P2.0、P2.1、P2.2、P2.3为输出
- P2DIR&=0xCF;//配置P2.4、P2.5为输入
- }
- /****************时钟调试函数**********************/
- void xuanze()
- {
- switch(SW)
- {
- case 0: break;
- case 1: while(SW==1)
- {
- _DINT();
- if((P2IN&0x10)==0)
- {
- __delay_cycles(2);
- if((P2IN&0x10)==0)
- {
- bs++;
- if(bs==60)
- {
- bs=0;
- }
- }
- }
- while((P2IN&0x10)==0);
- xianshi(as,bs);
- IO_INIT();
- }
- break;
- case 2:while(SW==2)
- {
- _DINT();
- if((P2IN&0x10)==0)
- {
- __delay_cycles(2);
- if((P2IN&0x10)==0)
- {
- as++;
- dp=0;
- if(as==24)
- {
- as=0;
- }
- }
- }
- while((P2IN&0x10)==0);
- xianshi(as,bs);
- IO_INIT();
- }
- break;
- default:break;
- }
- }
- /*****************定时器配置函数 ****************/
- void dingshiqi()
- {
- TA0CCTL0 = CCIE; //打开中断 (Timer0_A3 Capture/Compare Control 0 )
- TA0CCR0 = 10080; //设定计数变量
- TA0CTL = TASSEL_2 + MC_3; //定时器选择时钟SMCLK,使用模式二连续计数方式
- _EINT(); //开总中断
- }
- /****************定时器中断函数*****************/
- #pragma vector = TIMER0_A0_VECTOR
- __interrupt void time1(void)
- {
-
- ss++;
- if(ss==25)
- {
- dp^=1;
- }
- if(ss==50)
- {
- dp^=1;
- cs++;
- ss=0;
- }
- if(cs==60)
- {bs++;cs=0;}
- if(bs==60)
- {as++;bs=0;
- if(as==24)
- {as=0;}}
- }
- /***********************主函数*******************/
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
- SZ_INIT();
- dingshiqi();
- IO_INIT();
- _EINT(); //开总中断
- while(1)
- {
- IO_INIT();
- IO_INIT2();
- xuanze();
- _EINT();
- if(ac==1)
- {
- xianshi(as,bs);
- }
- else if(ac==0)
- {
- P2OUT|=0x0f;
- }
- }
- }
|