做了三道考试题,分享一下。
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};
#endif
code 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};
#endif
long 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};
#endif
char 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熄灭。