Keil编程指南:使用与BSP库编程

前言

记录学习,仅供参考

编程前的配置工作

先把keil的文件夹加到STC-ISP中


然后可以在keil中建工程了

先新建一个文件夹放工程文件

输入工程的名字点击保存。

这里选择第二个

板子的型号选择正确,后面弹出来的选择是


现在工程就建好了,然后要加入必要的库文件。

点击这里

勾选生成hex文件


因为我们用C语言写代码,所以要加入相关的头文件。如图

这里要加的东西再学习通课程网站的资料里

下载解压好,上面图里要用到这个路径


这里如图选择好,一路点击确定。


这里新建一个文件。先保存,保存到新建工程的那个文件夹里。命名后缀要是.c


这里点开Target,右键点击Source Group 点击Manage



要加入刚保存的c文件和库文件,库文件在刚在课程网站下载的文件里面,里面的source里,选择全部文件类型才能看到库文件。记得只用点击一下add就行了,之后点close,OK。


![在这里插入图片描述](https://i3.wp.com/img-blog.csdnimg.cn/d4b410a7de1047f88e4947c390358ce3.png

可以看到都加进来了,现在准备工作就做好了,可以开始开心地写程序了。
每次建工程这些都要完成一遍,不是设置一编就好

写完之后点击这里编译

下面解决几道练习题

#include "STC15F2K60S2.H"
#include "displayer.H" 
#include "sys.H"


code unsigned long SysClock=11059200L;        //必须。 (定义系统工作时钟频率,用户可以修改,且必须与实际工作频率(下载时选择的)一致

#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13*        /
                /* 显示:   0   1    2    3    4     5    6    7   8    9  (无)   下-  中-  上-       */  
#endif



void main()
{  				
	
	  displayerInit();                              
	LedPrint(0);
		SetDisplayerArea(0,6);                           
		Seg7Print(1,2,14,15,12,2,1);	 
	MySTC_Init();
	while(1)
		MySTC_OS();
}

#include "sys.H"
#include "STC15F2K60S2.H"
#include "beep.H"

code unsigned long SysClock=11059200L;        //必须。 (定义系统工作时钟频率,用户可以修改,且必须与实际工作频率(下载时选择的)一致
int main(){
	
	BeepInit();
	SetBeep(1200,180);
	MySTC_Init();
	while(1)
		MySTC_OS();
	
}

#include "sys.H"
#include "STC15F2K60S2.H"
#include "music.H"
#include "Beep.H"

#define uchar unsigned char
code unsigned long SysClock=11059200L;        //必须。 (定义系统工作时钟频率,用户可以修改,且必须与实际工作频率(下载时选择的)一致
code uchar arr[]={
	0x31,0x10,
	0x32,0x10,
	0x33,0x10,
	0x34,0x10,
	0x35,0x10};

int main(){	
	MusicPlayerInit();
	//SetMusic
	BeepInit();
	SetPlayerMode(enumModePlay);
	SetMusic(100,0xFA,arr,10,enumMscNull);
	MySTC_Init();
	while(1)
	MySTC_OS();
	
}

#include "STC15F2K60S2.H"
#include "sys.H"
#include "stepmotor.h"
#include "displayer.H"  
code unsigned long SysClock=11059200L; 
#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13  14   15     */
                  /* 显示:   0   1    2    3    4   5    6    7   8    9     10    11   -     #   H    L     */  
#endif
int main(){
	StepMotorInit();
	DisplayerInit();  
	SetDisplayerArea(0,7);
	Seg7Print(10,10,10,10,10,10,10,10);
	LedPrint(0);
	SetStepMotor(enumStepMotor2,10,100);
	MySTC_Init();
	while(1)
		MySTC_OS();
}

#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"            
#include "key.H" 

code unsigned long SysClock=11059200L; 

#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13  14   15     */
                  /* 显示:   0   1    2    3    4   5    6    7   8    9     10    11   -     #   H    L     */  
#endif
char a=10;
void myKey_callback()
{ char k;
	k=GetKeyAct(enumKey1);
	if( k == enumKeyPress ) a=14;
	  else if( k == enumKeyRelease ) a=10;
}

void my10mS_callback(){
Seg7Print(10,10,10,10,10,10,10,a);}
void main(){
	DisplayerInit();   
	Key_Init(); 
	SetDisplayerArea(0,7);
	//if(GetKeyAct(enumKey1)==enumKeyPress)
	
	 LedPrint(0);
	SetEventCallBack(enumEventSys10mS, my10mS_callback);
	SetEventCallBack(enumEventKey, myKey_callback);
	MySTC_Init();
	while(1)
		MySTC_OS();
}

#include "STC15F2K60S2.H"
#include "sys.H"
#include "beep.H"   
#include "Vib.h"

code unsigned long SysClock=11059200L;


void mysv_callback()
{
	if(GetVibAct()==enumVibQuake)
		SetBeep(1200,100);
}


void main(){
	BeepInit();
	VibInit();
	
	SetEventCallBack(enumEventVib, mysv_callback);
	MySTC_Init();
	while(1)
		MySTC_OS();
}



#include "STC15F2K60S2.H"
#include "sys.H"
#include "hall.H" 
#include "displayer.H" 

code unsigned long SysClock=11059200L;
#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13  14   15     */
                  /* 显示:   0   1    2    3    4   5    6    7   8    9     10    11   -     #   H    L     */  
#endif

unsigned char ch=0x01;
char flag=0;
void my100mS_callback(){
	if(flag){
		if(ch<16) {
		LedPrint(ch);
		ch=ch<<1;	
		}
		else
		ch=0x01;
	}
}
void myhall(){
	if(GetHallAct()==enumHallGetClose)
		flag=1;
		else 
			flag=0;
		
}

void main(){
	DisplayerInit();  
	HallInit(); 
	SetDisplayerArea(0,7);
	Seg7Print(10,10,10,10,10,10,10,10);
	LedPrint(0);
	SetEventCallBack(enumEventSys100mS, my100mS_callback);
	SetEventCallBack(enumEventHall, myhall);
	MySTC_Init();
	while(1)
		MySTC_OS();
}

#include "STC15F2K60S2.H"
#include "sys.H"
#include "adc.h"   
#include "displayer.H"
#include "key.H"

code unsigned long SysClock=11059200L;

#ifdef _displayer_H_                         		 //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13  14   15     */
                  /* 显示:   0   1    2    3    4   5    6    7   8    9     10    11   -     #   H    L     */  
#endif

unsigned char temp[]={0xc0,0x60,0x30,0x18,0x0c,0x06,0x03};  //用来保存灯的7种状态
int i=3;
void mydh_callback()
{
	if(GetAdcNavAct(enumAdcNavKeyLeft)==enumKeyPress)
	{
		if(i>0)
			i--;
	}
	else if(GetAdcNavAct(enumAdcNavKeyRight)==enumKeyPress)
	{
		if(i<6)
			i++;
	}
	LedPrint(temp[i]);
}


void main(){
	DisplayerInit();
	Key_Init();
	AdcInit(ADCexpEXT);
	SetDisplayerArea(0,7);
	LedPrint(temp[3]);
	Seg7Print(10,10,10,10,10,10,10,10);		//数码管什么也不显示
	SetEventCallBack(enumEventXADC, mydh_callback);
	MySTC_Init();
	while(1)
		MySTC_OS();
}


#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"  

code unsigned long SysClock=11059200L;
#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
	              /* 序号:   0   1    2	   3    4   5    6	  7   8	   9	 10	   11	12   13  14   15     */
                  /* 显示:   0   1    2    3    4   5    6    7   8    9     10    11   -     #   H    L     */  
#endif
long ms=0,min=0,sec=0,temp=0;
char oput[8]={0};

void fun(){
	temp++;
	ms=temp;
	sec=(temp/1000)%60000;
	min=temp/60000;
	if(sec>59)
	sec=sec-60;
	oput[0]=ms%10;
	oput[1]=(ms/10)%10;
	oput[2]=(ms/100)%10;
	oput[3]=12;
	oput[4]=sec%10;
	oput[5]=(sec/10)%10;
	oput[6]=12;
	oput[7]=min;
	Seg7Print(oput[7],oput[6],oput[5],oput[4],oput[3],oput[2],oput[1],oput[0]);
}

int main(){
	DisplayerInit(); 	
	SetDisplayerArea(0,7);
	Seg7Print(1,1,1,1,1,1,1,1);
	LedPrint(0);
	SetEventCallBack(enumEventSys1mS, fun);
	MySTC_Init();
	while(1)
		MySTC_OS();
}

#include "STC15F2K60S2.H"
#include "sys.H"
#include "adc.h"
#include "beep.h"
code unsigned long SysClock=11059200L;

void Rop_callback(){
	if(GetADC().Rop<20)
		SetBeep(1200,150);
	else if(GetADC().Rop>100)
		SetBeep(2000,150);
}

int main(){
	BeepInit();
	AdcInit(); 
	SetEventCallBack(enumEventXADC, Rop_callback);
MySTC_Init();
while(1)
MySTC_OS();	
}

后记

本人测试问题不大,仅供参考,如果代码出错欢迎评论区交流

物联沃分享整理
物联沃-IOTWORD物联网 » Keil编程指南:使用与BSP库编程

发表评论