做了三道考试题,分享一下。
1、音乐:开机后C调,每分钟100拍,播放"1231,345"
#include "sys.H"
#include "displayer.H"
#include "Beep.H"
#include "music.H"code unsigned long SysClock=11059200;#ifdef _displayer_H_
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};#endifcode unsigned char arr[]={0x31,0x10,0x32,0x10,0x33,0x10,0x31,0x10,0x00,0x10,0x33,0x10,0x34,0x10,0x35,0x10,};int main(){DisplayerInit();LedPrint(0);SetDisplayerArea(0,7);BeepInit();MusicPlayerInit();SetPlayerMode(enumModePlay);SetMusic(100,0xFC,arr,16,enumMscDrvSeg7andLed);MySTC_Init();while(1){MySTC_OS();}}
这里播放的是高音1231,345,逗号是空拍0x00。同时还增添了数码管显示音乐信息和LED灯打拍子的功能。
2、秒表:数码管仅显示分、秒
#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"
#include "key.H"
#include "beep.H"code unsigned long SysClock=11059200;#ifdef _displayer_H_
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; #endiflong ms=0,min=0,sec=0,temp=0;
char oput[8]={0};
bit flag=0;void myKey_callback(){char a1,a2;a1=GetKeyAct(enumKey1);a2=GetKeyAct(enumKey2);if(flag==0){if(a1==enumKeyPress){flag=1;SetBeep(1000,60);}if(a2==enumKeyPress){ms=0;min=0;sec=0;temp=0;SetBeep(1200,60);}}else{if(a1==enumKeyPress){flag=0;SetBeep(1000,60);}if(a2==enumKeyPress){ms=0;min=0;sec=0;temp=0;SetBeep(1200,60);}}}void fun(){if(flag==0)temp++;ms=temp;sec=(temp/100)%60;min=temp/6000;if(sec>59)sec=sec-60;oput[0]=ms%10;oput[1]=(ms/10)%10;oput[2]=12;oput[3]=sec%10;oput[4]=(sec/10)%10;oput[5]=12;oput[6]=min%10;oput[7]=(min/10)%10;Seg7Print(oput[7],oput[6],oput[5],oput[4],oput[3],10,10,10);
}int main(){DisplayerInit();KeyInit();BeepInit();SetDisplayerArea(0,7);Seg7Print(10,10,10,10,10,10,10,10);LedPrint(0);SetEventCallBack(enumEventSys10mS, fun);SetEventCallBack(enumEventKey, myKey_callback);MySTC_Init();while(1)MySTC_OS();
}
仅显示分、秒就把最后三位都编码10也就是空就行了。
其他部分与我的上一篇文章里的代码有些不同。修改了系统事件,选择了enumEventSys10mS这个10ms的系统事件,资源浪费少些而且实测计时好像更精确些。
此外,对分钟部分也进行了取余操作,现在能显示0~59的所有分钟数了。
同时还增加了按键功能。按下K1以后秒表暂停,按下K2以后秒表重置。
3、按键:松开K1,数码管显示“H”,并且2秒后熄灭
#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"
#include "key.H" code unsigned long SysClock=11059200; #ifdef _displayer_H_
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};#endifchar a=0;void my1S_callback(){a++;if(a==2)Seg7Print(10,10,10,10,10,10,10,10);
}void myKey_callback()
{ char k;k=GetKeyAct(enumKey1);if( k == enumKeyRelease ){a=0;Seg7Print(10,10,10,10,10,10,10,14);SetEventCallBack(enumEventSys1S, my1S_callback); }
}void main(){DisplayerInit(); KeyInit(); LedPrint(0);SetDisplayerArea(0,7);Seg7Print(10,10,10,10,10,10,10,10);SetEventCallBack(enumEventKey, myKey_callback);MySTC_Init();while(1){MySTC_OS();}
}
在按键事件发生时,如果是按键松开,那么就初始化变量a=0,同时数码管输出H。然后用SetEventCallBack(enumEventSys1S, my1S_callback);语句计时,每1s使变量a加1,直到变量a加到2也就是2s以后,数码管输出全空,也就是H熄灭。