飘寂195 飘寂195
关注数: 14 粉丝数: 11 发帖数: 3,877 关注贴吧数: 32
msp430f5529单片机求改秒表程序 #include<msp430.h> #define keyin (P9IN&0xe0) int i,s,secc,sec,hour,min,day,f,flag,judge,ft,hao,fshe,xue,fx; char dad; int d[]={0,0,0,0,0,0,0,0}; char temp[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02}; char wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; char keycode[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; void delay(int z) //延时 { int u; for(u=0;u<z;u++); } void Time_A_init() //初始化时钟 { TACTL=TASSEL0+TACLR; CCR0=3277; TACTL|=MC0; _EINT(); } void Time_set() //设定时间 { if(d[0]>=9){d[0]=0;d[1]++;} if(d[2]*10+d[1]>=60){d[1]=0;d[2]=0;d[3]++;} if(d[4]*10+d[3]>=60){d[3]=0;d[4]=0;d[5]++;} if(d[6]*10+d[5]>=24){d[5]=0;d[6]=0;d[7]++;} if(d[7]>=9){d[7]=9;} if(d[0]<0){d[0]=9;d[1]--;} if(d[2]*10+d[1]<0){d[1]=9;d[2]=5;d[3]--;} if(d[4]*10+d[3]<0){d[3]=9;d[4]=5;d[5]--;} if(d[6]*10+d[5]<0){d[5]=3;d[6]=2;d[7]--;} if(d[7]<0){d[7]=0;} secc=d[0]; sec=d[2]*10+d[1]; min=d[4]*10+d[3]; hour=d[6]*10+d[5]; day=d[7]; } #pragma vector=TIMERA0_VECTOR //中断设定 __interrupt void Time_A(void) { if(ft==1) secc++; if(ft==0) secc--; if(secc>=10){secc=0;sec++;} if(sec>=60){sec=0;min++;} if(min>=60){min=0;hour++;} if(hour>=24){hour=0;day++;} if(day>9){day=9;} if(secc<0){secc=9;sec--;} if(sec<0){sec=59;min--;} if(min<0){min=59;hour--;} if(hour<0){hour=23;day--;} if(day<0){day=0;} if((secc==0)&&(sec==0)&&(hour==0)&&(min==0)&&(hour==0)&&(day==0)) CCTL0&=~CCIE; d[0]=secc; d[1]=sec%10; d[2]=sec/10; d[3]=min%10; d[4]=min/10; d[5]=hour%10; d[6]=hour/10; d[7]=day; } char key_done() //键盘扫描 { char row,col,i; flag=0; P10DIR=0XF0; P10OUT=0X0F; if((P10IN&0X0F)!=0X0F) { col=P10IN&0X0F; P10DIR=0X0F; P10OUT=0XF0; row=P10IN&0XF0; for(i=0;i<16;i++) { if((row|col)==keycode[i]) { dad=keycode[i]; flag=1; break; } } } } char change(int q) { int w; for(w=0;w<16;w++) { if(q==keycode[w]) return w; } } main() { WDTCTL=WDTPW+WDTHOLD; P8DIR=0XFF; P9DIR=0X00; P7DIR=0XFF; P10DIR=0XF0; P10OUT=0X00; Time_A_init(); f=1; xue=0; fx=1; while(1) { while((keyin==0xc0)||(keyin==0xa0)||(keyin==0x60)) { if(keyin==0xc0){if(f==1){CCTL0=CCIE;ft=1;f=0;}} //正计时 if(keyin==0xa0){if(f==1){CCTL0&=~CCIE;f=0;}} //暂停 if(keyin==0x60) //倒计时 { if(f==1) { CCTL0=CCIE; ft=0; f=0; } } } f=1; while((P10IN&0X0F)!=0X0F) { judge=change(key_done()); switch(judge) { case 15: //显示学号 { if(fx==1) { CCTL0&=~CCIE; if(xue==0) { d[0]=3; d[1]=0; d[2]=0; d[3]=5; d[4]=3; d[5]=1; d[6]=0; d[7]=2; } if(xue==1) { d[0]=6; d[1]=1; d[2]=0; d[3]=5; d[4]=3; d[5]=1; d[6]=0; d[7]=2; } if(xue==2) { d[0]=3; d[1]=2; d[2]=0; d[3]=7; d[4]=3; d[5]=1; d[6]=0; d[7]=2; } xue++; if(xue>2)xue=0; fx=0; } break; } case 8: //打开调时模式 { CCTL0&=~CCIE; hao=7; fshe=1; break; } case 9: //关闭调时模式 { CCTL0&=~CCIE; hao=7; fshe=0; break; } case 4: //指针右移 { if(fshe==1&&f==1) { hao++; if(hao<0)hao=7; f=0; } break; } case 5: //指针左移 { if(fshe==1&&f==1) { hao--; if(hao>7)hao=0; f=0; } break; } case 6: //数字+1 { if(fshe==1&&f==1) { d[hao]++; f=0; Time_set(); } break; } case 7: //数字-1 { if(fshe==1&&f==1) { d[hao]--; f=0; Time_set(); } break; } case 0: //设定时间 { CCTL0&=~CCIE; day=8; hour=23; min=59; sec=59; secc=9; CCTL0=CCIE; delay(100); CCTL0&=~CCIE; break; } default:break; } } fx=1; for(i=0;i<8;i++) { P8OUT=~wei[i]; P7OUT=~temp[d[i]]; delay(500); } } }
1 下一页