|

楼主 |
发表于 2020-11-8 22:42:40
|
显示全部楼层
传图片多次失败,还是放代码吧
这个小制作,学了msp430的基本知识,
时钟中断的处理
按钮中断的处理
按钮长时间按下的判断
等等
- #include <msp430.h>
- /**
- * blink.c
- */
- volatile unsigned int SleepCountDown;
- #define SLEEPTIME 60 // second to sleep
- volatile unsigned int halfsecond,second,minute, hour, month, day, year,timerminute,timersecond;
- volatile unsigned int ClockStep, OnShowLocation;
- #define CLOCKSTEPNUMBER 128
- #define HALFSCONDSTEP (512/CLOCKSTEPNUMBER/2)
- #define TIMERSTEP (512/CLOCKSTEPNUMBER)
- volatile unsigned char DisplayMode,oldDisplayMode, IsSettingMode, ButtonPressed,longpress1,button1_longpressed,buttonstatus,timerstart,timerstep;
- volatile unsigned char Button2Pressed, longpress2,button2_longpressed,SettingItem;
- #define MINUTESECONDMODE 0
- #define HOURMINUTEMODE 1
- #define MONTHDAYMODE 2
- #define YEARMODE 3
- #define DISPLAYMODECOUNT 4
- #define TIMERMODE 5
- #define SETTING_MINUTE 0
- #define SETTING_SECOND 1
- #define SETTING_HOUR 2
- #define SETTING_DAY 3
- #define SETTING_MONTH 4
- #define SETTING_YEAR 5
- #define SETTINGMODECOUNT 6
- void ShowTime(void);
- void ShowPoint(void);
- void clear(void);
- void ShowDec( unsigned int);
- void ShowNum(unsigned int index, unsigned int n);
- static inline void onEverySecond(void);
- static inline unsigned char in_Debounce(unsigned char button);
- static inline void onQuarterSecond(void);
- void clearTimer(void);
- static inline void SettingItemChange(void);
- static inline void SettingModeButton1(void );
- #define SHOWTIME (34625)
- #define LOOPCOUNT (2000)
- #define CLEARLOOPCOUNT (1000)
- #define BUTTON1 BIT4
- #define BUTTON2 BIT7
- void main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
- BCSCTL3 = LFXT1S_0 + XCAP_3;
- P1DIR |= 0b1101111; // configure P1.0 as output
- P2DIR |= 0b111111;
- BCSCTL1 |= DIVA_3; // ACLK/8
- BCSCTL3 |= XCAP_3; //12.5pF cap- setting for 32768Hz crystal
- //currentMinutes = 0;
- //currentSeconds = 0;
- CCTL0 |= CCIE; // CCR0 interrupt enabled
- CCR0 = CLOCKSTEPNUMBER-1; // 512 -> 1 sec, 30720 -> 1 min
- TACTL = TASSEL_1 + ID_3 + MC_1; // ACLK, /8, upmode
- P1DIR |=~(BUTTON1+BIT7);
- P1REN =BUTTON1+BIT7; // Enable resistor
- P1OUT = ~(BUTTON1+BIT7); //从低到高引发中断,即按下按钮就产生中断
- P1IE =BUTTON1+BIT7; //enable interrupt for P1.4
- P1IES =~(BUTTON1+BIT7);
- P1SEL=0x00;
- P1IFG =0x00;
- SleepCountDown=SLEEPTIME; // 20 second to sleep;
- halfsecond=0;
- second=0;
- minute=56;
- hour=17;
- month=11;
- day=5;
- year=2020;
- timerminute=0;
- timersecond=0;
- DisplayMode = MINUTESECONDMODE;
- oldDisplayMode=DisplayMode;
- ButtonPressed=0;
- buttonstatus=0;
- longpress1=0;
- button1_longpressed=0;
- timerstart=0;
- timerstep=0;
- Button2Pressed=0;
- longpress2=0;
- button2_longpressed=0;
- IsSettingMode=0;
- SettingItem=0;
- ClockStep=0;
- OnShowLocation=0;
- //_BIS_SR( LPM3_bits + GIE); // Enter LPM3 w/ interrupt
- _BIS_SR( GIE); // Enter LPM3 w/ interrupt
- while(1)
- {
- ShowTime();
- ShowPoint();
- }
- }
- // Timer A0 interrupt service routine
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- //unsigned int i;
- ClockStep++;
- onQuarterSecond();
- if( ClockStep >= HALFSCONDSTEP)
- {
- halfsecond++;
- if( halfsecond==2)
- {
- second++;
- halfsecond=0;
- onEverySecond();
- }
- ClockStep=0;
- }
- if(second==60)
- {
- minute++;
- second=0;
- }else{
- return;
- }
- if(minute==60)
- {
- hour++;
- minute=0;
- }else{
- return;
- }
- if (hour==24)
- {
- day++;
- hour=0;
- }else{
- return;
- }
- switch(month)
- {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- if( day==32)
- {
- day=1;
- month++;
- }
- break;
- case 2:
- if(year==2020||year==2024||year==2028||year==2032||year==2036||year==2040||year==2044)
- {
- if(day==30)
- {
- day=1;
- month++;
- }
- }else{
- if(day==29)
- {
- day=1;
- month++;
- }
- }
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- if( day ==31)
- {
- day=1;
- month++;
- }
- break;
- }
- if(month==13)
- {
- year++;
- month=1;
- }
- }
- #pragma FUNC_ALWAYS_INLINE(onQuarterSecond)
- static inline void onQuarterSecond(void)
- {
- if( DisplayMode== TIMERMODE)
- {
- if( timerstart>0)
- timerstep++;
- if( timerstep==TIMERSTEP)
- {
- timerstep=0;
- timersecond++;
- }
- if( timersecond == 60)
- {
- timerminute++;
- timersecond=0;
- }
- if( timerminute ==99)
- timerminute=0;
- }
- if( ButtonPressed>0 &&IsSettingMode==0)
- {
- if( (P1IN&BUTTON1)==BUTTON1)
- {
- longpress1++;
- }
- else
- longpress1=0;
- if (longpress1>7)
- {
- button1_longpressed=1;
- if( DisplayMode != TIMERMODE)
- {
- oldDisplayMode=DisplayMode;
- DisplayMode = TIMERMODE;
- }else
- {
- clearTimer();
- DisplayMode=oldDisplayMode;
- }
- longpress1=0;
- }
- }
- if( Button2Pressed>0)
- {
- if( (P1IN&BUTTON2)==BUTTON2)
- {
- longpress2++;
- }
- else
- longpress2=0;
- if (longpress2>7)
- {
- button2_longpressed=1;
- if( IsSettingMode == 0)
- {
- IsSettingMode = 1;
- SettingItem=SETTING_MINUTE;
- DisplayMode=HOURMINUTEMODE;
- }else
- {
- IsSettingMode = 0;
- }
- longpress2=0;
- }
- }
- }
- void clearTimer(void)
- {
- timerstep=0;
- timerminute=0;
- timersecond=0;
- timerstart=0;
- }
- #pragma FUNC_ALWAYS_INLINE(onEverySecond)
- static inline void onEverySecond(void)
- {
- if(DisplayMode!=TIMERMODE)
- {
- if (ButtonPressed>0 &&IsSettingMode==0 )
- {
- ButtonPressed++;
- if ( ButtonPressed > 10)
- {
- DisplayMode = HOURMINUTEMODE;
- ButtonPressed =0;
- //buttonstatus=0;
- }
- }
- // if(SleepCountDown>0)
- // SleepCountDown--;
- }
- }
- //Port 1 Interrupt Service Routine
- #pragma vector=PORT1_VECTOR
- __interrupt void Port_1(void)
- {
- unsigned int isSleep;
- buttonstatus=0;
- ButtonPressed=0;
- Button2Pressed=0;
- //clear dispaly
- P1OUT &= 0b11010000;
- P2OUT &= 0b111111;
- isSleep=SleepCountDown;
- SleepCountDown=SLEEPTIME;
- if( isSleep==0)
- {
- P1IFG =0x00;
- return;
- }
- else
- {
- if ((P1IFG& BUTTON1) ==BUTTON1)
- {
- if( in_Debounce(BUTTON1))
- {
- P1IFG =0x00;
- return;
- }
- ButtonPressed=1;
- if( DisplayMode== TIMERMODE)
- {
- if( timerstart==0)
- timerstart=1;
- else
- timerstart=0;
- }
- else
- {
- if( IsSettingMode==1)
- SettingModeButton1();
- else
- {
- DisplayMode++;
- if( DisplayMode == DISPLAYMODECOUNT)
- DisplayMode =0;
- }
- }
- }
- if ((P1IFG& BUTTON2)==BUTTON2 )
- {
- if( in_Debounce(BUTTON2))
- {
- P1IFG =0x00;
- return;
- }
- Button2Pressed=1;
- if( DisplayMode== TIMERMODE)
- {
- clearTimer();
- }
- if( IsSettingMode ==1)
- SettingItemChange();
- }
- }
- P1IFG =0x00;
- }
- #pragma FUNC_ALWAYS_INLINE(SettingItemChange)
- static inline void SettingItemChange(void)
- {
- SettingItem++;
- if( SettingItem == SETTINGMODECOUNT)
- SettingItem=0;
- switch(SettingItem)
- {
- case SETTING_SECOND:
- DisplayMode= MINUTESECONDMODE;
- break;
- case SETTING_MINUTE:
- case SETTING_HOUR:
- DisplayMode= HOURMINUTEMODE;
- break;
- case SETTING_DAY:
- case SETTING_MONTH:
- DisplayMode= MONTHDAYMODE;
- break;
- case SETTING_YEAR:
- DisplayMode= YEARMODE;
- break;
- }
- }
- #pragma FUNC_ALWAYS_INLINE(SettingModeButton1)
- static inline void SettingModeButton1(void )
- {
- switch(SettingItem)
- {
- case SETTING_SECOND:
- second=0;
- break;
- case SETTING_MINUTE:
- minute++;
- if( minute==60)
- minute=0;
- break;
- case SETTING_HOUR:
- hour++;
- if(hour==24)
- hour=0;
- break;
- case SETTING_DAY:
- day++;
- if( day==32)
- day=1;
- break;
- case SETTING_MONTH:
- month++;
- if(month==13)
- month=1;
- break;
- case SETTING_YEAR:
- year++;
- if( year>2040)
- year=2020;
- break;
- }
- }
- #pragma FUNC_ALWAYS_INLINE(onEverySecond)
- static inline unsigned char in_Debounce(unsigned char button)
- {
- unsigned char ret=0;
- unsigned char ledState, lastState;
- unsigned int stateCount,staytoolong;
- lastState=0;
- stateCount=0;
- staytoolong=0;
- while( stateCount< 2000)
- {
- ledState=P1IN&button;
- if( ledState==button && lastState==button)
- stateCount++;
- else
- {
- stateCount=0;
- staytoolong++;
- if(staytoolong>2000)
- {
- ret=1;
- break;
- }
- }
- lastState=ledState;
- __delay_cycles(5);
- }
- return ret;
- }
- #pragma CODE_SECTION(ShowTime,".run_from_ram")
- void ShowTime()
- {
- //DisplayMode = DisplayMode- DisplayMode/DISPLAYMODECOUNT*DISPLAYMODECOUNT;
- switch(DisplayMode)
- {
- case MINUTESECONDMODE:
- if( IsSettingMode==0)
- {
- ShowNum(0,minute/10);
- ShowNum(1,minute-minute/10*10);
- }
- if( IsSettingMode==1 &&(ClockStep==0|ClockStep==2))
- clear();
- else
- {
- ShowNum(2,second/10);
- ShowNum(3,second-second/10*10);
- }
- break;
- case HOURMINUTEMODE:
- if( IsSettingMode==1 && SettingItem==SETTING_HOUR &&(ClockStep==0|ClockStep==2))
- clear();
- else
- {
- if( hour/10 >0 ) ShowNum(0,hour/10);
- ShowNum(1,hour-hour/10*10);
- }
- if( IsSettingMode==1 && SettingItem==SETTING_MINUTE &&(ClockStep==0|ClockStep==2))
- clear();
- else
- {
- ShowNum(2,minute/10);
- ShowNum(3,minute-minute/10*10);
- }
- break;
- case MONTHDAYMODE:
- if( IsSettingMode==1 && SettingItem==SETTING_MONTH &&(ClockStep==0|ClockStep==2))
- clear();
- else
- {
- if( month/10 >0 ) ShowNum(0,month/10);
- ShowNum(1,month-month/10*10);
- }
- if( IsSettingMode==1 && SettingItem==SETTING_DAY &&(ClockStep==0|ClockStep==2))
- clear();
- else
- {
- if( day/10>0) ShowNum(2,day/10);
- ShowNum(3,day-day/10*10);
- }
- break;
- case YEARMODE:
- if( IsSettingMode==1 && SettingItem==SETTING_YEAR &&(ClockStep==0|ClockStep==2))
- clear();
- else
- ShowDec(year);
- break;
- case TIMERMODE:
- ShowNum(0,timerminute/10);
- ShowNum(1,timerminute-timerminute/10*10);
- ShowNum(2,timersecond/10);
- ShowNum(3,timersecond-timersecond/10*10);
- break;
- default:
- break;
- }
- }
- void ShowDec( unsigned int d)
- {
- unsigned char i;
- i=4;
- while(d>0 && i>0)
- {
- i--;
- ShowNum(i,d-d/10*10);
- d=d/10;
- }
- }
- void ShowPoint()
- {
- switch(DisplayMode){
- case MINUTESECONDMODE:
- if (halfsecond==0)
- {
- P1OUT = 0b100100;
- P2OUT = 0b111111;
- __delay_cycles(LOOPCOUNT);
- clear();
- }
- break;
- case HOURMINUTEMODE:
- case TIMERMODE:
- P1OUT = 0b0100100;
- P2OUT = 0b111111;
- __delay_cycles(LOOPCOUNT);
- clear();
- break;
- case MONTHDAYMODE:
- case YEARMODE:
- break;
- }
- }
- void clear(void)
- {
- P1OUT &= 0b11010000;
- P2OUT &= 0b111111;
- __delay_cycles(CLEARLOOPCOUNT);
- }
- void ShowNum(unsigned int index, unsigned int n)
- {
- switch ( index ){
- case 0:
- P1OUT |= 0b1;
- break;
- case 1:
- P1OUT |= 0b10;
- break;
- case 2:
- P1OUT |= 0b100;
- break;
- case 3:
- P1OUT |= 0b1000;
- break;
- }
- P1OUT= 0b1000000 | P1OUT; //set P1.6 Hi
- switch ( n ){
- case 0:
- P2OUT = ~0b11111;
- break;
- case 1:
- P1OUT= 0b100000 | P1OUT;
- P2OUT = ~0b11;
- break;
- case 2:
- P2OUT = ~(0b1 | 0b100 | 0b1000 | 0b100000);
- break;
- case 3:
- P2OUT = ~(0b1 | 0b10 | 0b100 | 0b100000);
- break;
- case 4:
- P1OUT= 0b100000 | P1OUT;
- P2OUT = ~(0b10000 | 0b1 | 0b10 | 0b100000);
- break;
- case 5:
- P2OUT = ~(0b10000 | 0b100000 | 0b10 | 0b100);
- break;
- case 6:
- P2OUT = ~0b111110;
- break;
- case 7:
- P2OUT = ~0b11;
- break;
- case 8:
- P2OUT = ~0b111111;
- break;
- case 9:
- P2OUT = ~0b110111;;
- break;
- }
- __delay_cycles(LOOPCOUNT);
- // Clear
- clear();
- }
复制代码
|
|