//Main.c //按键与走马灯程序 #include "global.c" void SystemInit(); void Timer1Init(); void KickDog(); void KeyLed(); unsigned int numled0=200,numkey=0,numled=0,numled_back=200; unsigned int t0=0,t0_back=0,test; unsigned int PB6_FLAG=0; main() { SystemInit(); //系统初始化 MCRA=MCRA & 0x80FF; //IOPB0-6设为IO口模式 PBDATDIR=0xBFC2; //所有LED=0,并置IOPB6为输入口 Timer1Init(); //定时器初始化 asm(" CLRC INTM "); while(1) { KeyLed(); } } void SystemInit() { asm(" SETC INTM "); //关闭总中断 asm(" CLRC SXM "); //禁止符号位扩展 asm(" CLRC CNF "); // B0块映射为 on-chip DARAM asm(" CLRC OVM "); // 累加器结果正常溢出 SCSR1=0x83FE; // 系统时钟CLKOUT=20*2=40M WDCR=0x006F; //禁止看门狗,看门狗时钟64分频 KickDog(); // 初始化看门狗 IFR=0xFFFF; // 清除中断标志 IMR=0x0002; //打开中断2 } void Timer1Init() { EVAIMRA=0x0080; // 定时器1周期中断使能 EVAIFRA=0xFFFF; // 清除中断标志 GPTCONA=0x0000; T1PR=2500; // 定时器1初值,定时0.4us*2500=1ms T1CNT=0; T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能 } void KeyLed() { if((numled!=numled_back)&&((numled%200)==0)) { numled_back=numled; if(numkey==1) { PBDATDIR=PBDATDIR & 0xFFdb; if((PBDATDIR & 0x0018)==0x0018) PBDATDIR=PBDATDIR & 0xFFe7; else PBDATDIR=PBDATDIR |0x1818; } if(numkey==2) { PBDATDIR=PBDATDIR & 0xFFe7; if((PBDATDIR & 0x0024)==0x0024) PBDATDIR=PBDATDIR & 0xFFdb; else PBDATDIR=PBDATDIR |0x2424; } if(numkey==3) { PBDATDIR=PBDATDIR & 0xFFff; if((PBDATDIR & 0x003c)==0x003c) PBDATDIR=PBDATDIR & 0xFFc3; else PBDATDIR=PBDATDIR |0x3c3c; } if(numkey==4) { if(numled==400) //200ms { PBDATDIR=PBDATDIR & 0xFFC3; } if(numled==600) //400ms { PBDATDIR=PBDATDIR & 0xFFC3; PBDATDIR=PBDATDIR | 0x0404; } if(numled==1000) //600ms { PBDATDIR=PBDATDIR & 0xFFC3; PBDATDIR=PBDATDIR | 0x0808; } if(numled==1600) //800ms { PBDATDIR=PBDATDIR & 0xFFC3; PBDATDIR=PBDATDIR | 0x1010; } if(numled==2400) //1000ms { PBDATDIR=PBDATDIR & 0xFFC3; PBDATDIR=PBDATDIR | 0x2020; } if(numled==3400) PBDATDIR=PBDATDIR | 0x3c3c; } if(numled>=3400) numled=1; } } void c_int2() //定时器1中断服务程序 { if(PIVR!=0x27) { asm(" CLRC INTM "); return; } T1CNT=0; numled++; t0++; numled0--; if(numled0==0) { numled0=200; if((PBDATDIR & 0x0001)==0x0001) PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0;LED灭 else PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 } if((PB6_FLAG==0)&&((t0%50)==0)) //每50ms查询一次按键 { if((PBDATDIR & 0x0040)!=0x0040) //若有按键情况,IOPB6=0 { t0_back=t0; PB6_FLAG=1; } } if(t0==(t0_back+100)) //按键滤波,100ms后查询仍然为低电平,则认可按键有效 { t0_back=0; if(PB6_FLAG==1) { PB6_FLAG=0; if((PBDATDIR & 0x0040)!=0x0040) //若有按键仍为低,IOPB6=0 numkey++; if(numkey==4) numled=399; if(numkey==5) numkey=1; //按键标志循环1~4 } } EVAIFRA=0x80; asm(" CLRC INTM "); } void KickDog() //踢除看门狗 { WDKEY=0x5555; WDKEY=0xAAAA; } |