HNU小学期BSP软件编程基础考试题

做了三道考试题,分享一下。

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熄灭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值