|
发表于 2010-1-12 17:56:41
|
显示全部楼层
程序已经改好了,基本可以走了,其他问题有待进一步发现。
修改了show_second;show_minute两个函数;
#include <msp430x41x2.h>
#include "twi.h"
#include "intrinsics.h"
#include "portdefine.h"
#include "numberdata.h"
void mma7660_init_ztap(void)
{
twi_init();
twi_write(0x4c,7,0);
twi_write(0x4c,5,0);
twi_write(0x4c,6,0x04);
twi_write(0x4c,9,0x75);
twi_write(0x4c,8,0);
twi_write(0x4c,10,0x17);
twi_write(0x4c,7,0x41);
}
#define RTCSEC RTCNT1
#define RTCMIN RTCNT2
#define RTCHOUR RTCNT3
#define RTCDOW RTCNT4
#define ON 1
#define OFF 0
#define TAP 1
#define SLOPE_L 2
#define SLOPE_R 3
#define COMPLETE 4
unsigned char work_state = ON,trig_state = 0,twinkle = 0,check_p=0;
unsigned int loop = 0,flag = 0,second_d = 0;
unsigned int r=0xFF,g=0x7F,b=0x10,counter=0,temperature = 0;
int gl = -1,rl = -1,bl = -1;
void clr_display(void)
{
P1DIR = 0;
P1OUT = 0;
P2SEL = 0;
P2DIR = 0x60;
P2OUT = 0;
P3DIR = 0;
P3OUT = 0;
P4DIR = 0;
P4OUT = 0;
P5DIR = 0;
P5OUT = 0;
P6DIR = 0;
P6OUT = 0;
P7DIR = 0;
P7OUT = 0;
}
void delay_c(unsigned int n)
{
for(unsigned int i=0;i<=n;i++)
{
if(counter >=100)
{
r = r+rl;
if (r <= 5) rl = 1;
if (r >= 0xFE) rl = -1;
g = g+gl;
if (g <= 5) gl = 1;
if (g >= 0xFE) gl = -1;
b = b+bl;
if (b <= 5) bl = 1;
if (b >= 0xFE) bl = -1;
TA1CCR1 = b;
TA1CCR2 = r;
TA1CCR3 = g;
counter = 0;
}
counter++;
}
}
void show_weekday(unsigned char weekday)
{
weekday = weekday*2;
clr_display();
P7OUT = weekday_data[weekday+1]>>5;
P7DIR = weekday_data[weekday]>>5;
P1OUT = (weekday_data[weekday+1] & 0x1F);
P1DIR = (weekday_data[weekday] & 0x1F);
}
void show_number(unsigned char group,unsigned char number)
{
number = number *6;
clr_display();
P7OUT = display_data[group][number+1]>>5;
P7DIR = display_data[group][number]>>5;
P1OUT = (display_data[group][number+1] & 0x1F);
P1DIR = (display_data[group][number] & 0x1F);
delay_c(8);
clr_display();
P7OUT = display_data[group][number+3]>>5;
P7DIR = display_data[group][number+2]>>5;
P1OUT = (display_data[group][number+3] & 0x1F);
P1DIR = (display_data[group][number+2] & 0x1F);
delay_c(8);
clr_display();
P7OUT = display_data[group][number+5]>>5;
P7DIR = display_data[group][number+4]>>5;
P1OUT = (display_data[group][number+5] & 0x1F);
P1DIR = (display_data[group][number+4] & 0x1F);
delay_c(8);
}
void show_second(unsigned char second)
{
unsigned int temp_h,temp_b;
clr_display();
// second = bcd2hex(second);
temp_h = second / 5;
temp_b = second % 5;
switch_hm(temp_h);
P4OUT |= (1 << temp_b);
P4DIR |= (1 << temp_b);
}
void show_minute(unsigned char minute)
{
unsigned int temp_h,temp_b;
clr_display();
temp_h = minute / 5;
temp_b = minute % 5;
switch_hs(temp_h);
P4OUT &= ~(1 <<temp_b);
P4DIR |= (1 << temp_b);
}
void show_hour(unsigned char hour)
{
unsigned int temp_h;
temp_h = hour % 12;
if(temp_h == 0) temp_h = 12;
temp_h = temp_h - 1;
clr_display();
switch_hs(temp_h);
P2SEL |= 0x07;
P2OUT |= 0x07;
P2DIR |= 0x07;
}
unsigned char check_mma(void)
{
unsigned char mma,xout;
twi_init();
mma = twi_read(0x4c,0x03);
if(((mma & 0x40)==0)&&((mma & 0x20)!=0))
{
twi_read(0x4c,0x03);
twi_read(0x4c,0x03);
return(TAP);
}
xout = twi_read(0x4c,0x00);
if((xout >10)&&(xout<21)) return(SLOPE_R);
if((xout >43)&&(xout<54)) return(SLOPE_L);
if (( P2IN & 0x80) == 0)
{
clr_display();
while(( P2IN & 0x80) != 0);
return(COMPLETE);
}
return(0);
}
void adjust_mode(void)
{
unsigned char year,month,day,dow,hour,minute,second,mode_state,input;
signed char adjustment=0;
P2IE = 0;
TACTL |= TASSEL_1+ MC_1;
TACCR0 = 0x0FFF;
CCTL0 = CCIE;
year = RTCYEARL;
month = RTCMON ;
day = RTCDAY;
dow = RTCDOW;
hour = RTCHOUR;
minute = RTCMIN;
second = 0;
mode_state = 0;
while(mode_state !=7)
{
show_second(second);
delay_c(40);
if((mode_state == 2)&&(twinkle ==1)||(mode_state !=2)) { show_weekday(dow); delay_c(40);}
if((mode_state == 0)&&(twinkle ==1)||(mode_state !=0)) { show_minute(minute); delay_c(40);}
if((mode_state == 1)&&(twinkle ==1)||(mode_state !=1)) { show_hour(hour); delay_c(40);}
if((mode_state == 4)&&(twinkle ==1)||(mode_state !=4)) { if (month >= 10) { show_number(0,10);} show_number(0,month%10);}
if((mode_state == 3)&&(twinkle ==1)||(mode_state !=3)) { if (day >= 10) { show_number(1,day/10+9);} show_number(1,day%10);}
if((mode_state == 5)&&(twinkle ==1)||(mode_state !=5)) { if (year >= 10) { show_number(2,year/10+9);} show_number(2,year%10);}
clr_display();
input = 0;
if(check_p ==4) {input = check_mma(); check_p=0; }
if(input !=0)
{
if(input == TAP)
{ mode_state++; if(mode_state ==6)mode_state =0; }
else if(input == COMPLETE) mode_state =7;
else if(input == SLOPE_L) adjustment = -1;
else if(input == SLOPE_R) adjustment = 1;
if(adjustment !=0)
{
P2OUT |= 0x60;
P2OUT &= 0xB0;//FOR CLICK
if(mode_state == 2) { dow=dow+adjustment;if(dow>6)dow =0;}
else if(mode_state == 0){ minute=minute+adjustment;if(minute>59)minute =0;}
else if(mode_state == 1){ hour=hour+adjustment;if(hour>24)hour= 0;}
else if(mode_state == 4){ month=month+adjustment;if(month>12)month=1;}
else if(mode_state == 3){ day = day+adjustment;if(day>31)day=1;}
else if(mode_state == 5){ year=year+adjustment;if(year>99)year=9;}
adjustment = 0;
delay(40000);
P2OUT |= 0x60;
P2OUT &= 0xD0;//FOR CLICK
}
}
}
RTCYEARH = 0x14;
RTCYEARL = year;
RTCMON = month;
RTCDAY = day;
RTCDOW = dow;
RTCHOUR = hour;
RTCMIN = minute;
RTCSEC = 0;
TACTL &=~(MC_3);
P2IFG &= ~0x080;
P2IE |= 0x80;
}
void timer_init(void)
{
TA1CTL = TASSEL_2 + ID_0 + MC_1;
TA1CCR0 = 0xFF;
TA1CCTL1 = OUTMOD_3;
TA1CCR1 = 0x090;
TA1CCTL2 = OUTMOD_3;
TA1CCR2 = 0x003;
TA1CCTL3 = OUTMOD_3;
TA1CCR3 = 0x02F;
}
void rtc_init(void)
{
RTCCTL &=~(RTCHOLD);
RTCCTL |= RTCMODE_3;
if (RTCYEARH != 0x14)
{
RTCYEARH = 0x14;
RTCYEARL = 0x09;
RTCMON = 0x0b;
RTCDAY = 0x17;
RTCDOW = 0X00;
RTCHOUR = 0x0E;
RTCMIN = 0x20;
RTCSEC = 0x20;
}
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
SCFI0 |= FN_4; // x2 DCO freq, 8MHz nominal DCO
SCFQCTL = 121; // (121+1) x 32768 x 2 = 7.99 Mhz
FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set so freq= xtal x D x N+1
P2IE |= 0x080; // P2.7 interrupt enabled
P2IES |= 0x080; // P2.7 Hi/Lo edge
P2IFG &= ~0x080; // P2.7 IFG cleared
__bis_SR_register(GIE);
rtc_init();
timer_init();
twi_init();
twi_write_word(0x48,0x01,0x60a0);//temp
mma7660_init_ztap();
// while(1)
// {
unsigned char mma = twi_read(0x4c,3);
//}
clr_display();
H1_HIGH;
unsigned int i;
while(1)
{
i = RTCDOW;
show_weekday(i);
delay_c(40);
if ( second_d != RTCSEC)
{
P2OUT ^= 0x40;//FOR CLICK
twi_init();
temperature = twi_read_word(0x48,0x00);//temp
P2OUT ^= 0x60;
}
second_d = RTCSEC;
show_second(second_d);
delay_c(40);
i = RTCMIN;
show_minute(i);
delay_c(40);
i = RTCHOUR;
show_hour(i);
delay_c(40);
i = RTCMON;
if (i >= 10) { show_number(0,10);}
show_number(0,i%10);
i = RTCDAY;
if (i >= 10) { show_number(1,i/10+9);}
show_number(1,i%10);
i= temperature>>8;
if (i >= 10) { show_number(2,i/10+9);}
show_number(2,i%10);
if(work_state == OFF)
{
clr_display();
twi_init();
twi_write_word(0x48,0x01,0x61a0);
twi_write(0x4c,7,0);
__bis_SR_register(LPM3_bits + GIE); // Enter LPM4 w/interrupt
}
P5DIR = 0;
delay(5);
if ((P5IN & 0x02) == 0)
{
unsigned char mma;
P2OUT ^= 0x40;//FOR CLICK
twi_init();
mma = twi_read(0x4c,0x03);
if(((mma & 0x40)==0)&&((mma & 0x20)!=0)) adjust_mode();
}
}
}
// Port 2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
P2IFG &= ~0x080;
delay(20000);
if(( P2IN & 0x80) == 0)
{
clr_display();
while(( P2IN & 0x80) != 0);
if (work_state == ON)
{
work_state = OFF;
}
else if (work_state == OFF)
{
work_state = ON;
twi_init();
twi_write(0x4c,7,0x41);
twi_write_word(0x48,0x01,0x60a0);
__bic_SR_register_on_exit(LPM3_bits);
}
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
twinkle ^= 0x01;
check_p++;
if(check_p>4)check_p = 0;
} |
|