博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
头文件的建立
阅读量:3950 次
发布时间:2019-05-24

本文共 7174 字,大约阅读时间需要 23 分钟。

在多次用到某些代码块或者某些模块的时候我们可以将这些代码块或模块放入一个头文件中,这样当我们再次使用这些代码的时候就直接引用头文件就可以了。从而避免了繁琐的代码。比如搞一个LCD_1602显示红外接收的信号,主要是将LCD_1602的函数模块放入头文件中

接下来总结步骤:
1:建立一个新文件,放入代码所在目录下,命名后缀.h如创立一个LCD_1602操作的头文件lcd.h 加入必要的宏定义和函数声明。#ifndef意思是如果没有定义lcd.h情况下执行,对应着下文的#endif.

#ifndef __LCD_H_#define __LCD_H_#ifndef uint #define uint unsigned int#endif/**********************************PIN口定义**********************************/#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c);   //误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/	void LcdWriteData(uchar dat)	;/*LCD1602初始化子程序*/		void LcdInit();						  #endif

2.再创立一个文件 与头文件同名后缀.c 引用之前的头文件

#include"lcd.h"/******************************************************************************** 函 数 名         : Lcd1602_Delay1ms* 函数功能		   : 延时函数,延时1ms* 输    入         : c* 输    出         : 无* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/void Lcd1602_Delay1ms(uint c)   //误差 0us{    uchar a,b;	for (; c>0; c--)	{		 for (b=199;b>0;b--)		 {		  	for(a=1;a>0;a--);		 }      	}    	}/******************************************************************************** 函 数 名         : LcdWriteCom* 函数功能		   : 向LCD写入一个字节的命令* 输    入         : com* 输    出         : 无*******************************************************************************/#ifndef 	LCD1602_4PINS	 //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com)	  //写入命令{	LCD1602_E = 0;     //使能	LCD1602_RS = 0;	   //选择发送命令	LCD1602_RW = 0;	   //选择写入		LCD1602_DATAPINS = com;     //放入命令	Lcd1602_Delay1ms(1);		//等待数据稳定	LCD1602_E = 1;	          //写入时序	Lcd1602_Delay1ms(5);	  //保持时间	LCD1602_E = 0;}#else void LcdWriteCom(uchar com)	  //写入命令{	LCD1602_E = 0;	 //使能清零	LCD1602_RS = 0;	 //选择写入命令	LCD1602_RW = 0;	 //选择写入	LCD1602_DATAPINS = com;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改	Lcd1602_Delay1ms(1);	LCD1602_E = 1;	 //写入时序	Lcd1602_Delay1ms(5);	LCD1602_E = 0;//	Lcd1602_Delay1ms(1);	LCD1602_DATAPINS = com << 4; //发送低四位	Lcd1602_Delay1ms(1);	LCD1602_E = 1;	 //写入时序	Lcd1602_Delay1ms(5);	LCD1602_E = 0;}#endif/******************************************************************************** 函 数 名         : LcdWriteData* 函数功能		   : 向LCD写入一个字节的数据* 输    入         : dat* 输    出         : 无*******************************************************************************/		   #ifndef 	LCD1602_4PINS		   void LcdWriteData(uchar dat)			//写入数据{	LCD1602_E = 0;	//使能清零	LCD1602_RS = 1;	//选择输入数据	LCD1602_RW = 0;	//选择写入	LCD1602_DATAPINS = dat; //写入数据	Lcd1602_Delay1ms(1);	LCD1602_E = 1;   //写入时序	Lcd1602_Delay1ms(5);   //保持时间	LCD1602_E = 0;}#elsevoid LcdWriteData(uchar dat)			//写入数据{	LCD1602_E = 0;	  //使能清零	LCD1602_RS = 1;	  //选择写入数据	LCD1602_RW = 0;	  //选择写入	LCD1602_DATAPINS = dat;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改	Lcd1602_Delay1ms(1);	LCD1602_E = 1;	  //写入时序	Lcd1602_Delay1ms(5);	LCD1602_E = 0;	LCD1602_DATAPINS = dat << 4; //写入低四位	Lcd1602_Delay1ms(1);	LCD1602_E = 1;	  //写入时序	Lcd1602_Delay1ms(5);	LCD1602_E = 0;}#endif/******************************************************************************** 函 数 名       : LcdInit()* 函数功能		 : 初始化LCD屏* 输    入       : 无* 输    出       : 无*******************************************************************************/		   #ifndef		LCD1602_4PINSvoid LcdInit()						  //LCD初始化子程序{ 	LcdWriteCom(0x38);  //开显示	LcdWriteCom(0x0c);  //开显示不显示光标	LcdWriteCom(0x06);  //写一个指针加1	LcdWriteCom(0x01);  //清屏	LcdWriteCom(0x80);  //设置数据指针起点}#elsevoid LcdInit()						  //LCD初始化子程序{	LcdWriteCom(0x32);	 //将8位总线转为4位总线	LcdWriteCom(0x28);	 //在四位线下的初始化	LcdWriteCom(0x0c);  //开显示不显示光标	LcdWriteCom(0x06);  //写一个指针加1	LcdWriteCom(0x01);  //清屏	LcdWriteCom(0x80);  //设置数据指针起点}#endif

3.在主函数中引用创建的头文件即可以直接使用头文件的.c中定义的函数。

/******************************************************************************** 实验名			   : 1602显示红外线值实验* 使用的IO	     : 电机用P1口,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果       : LCD1602显示出读取到的红外线的值*	注意					 :*******************************************************************************/ #include
#include"lcd.h"sbit IRIN=P3^2;unsigned char code CDIS1[13]={" Red Control "};unsigned char code CDIS2[13]={" IR-CODE:--H "};unsigned char IrValue[6];unsigned char Time;void IrInit();void DelayMs(unsigned int );/******************************************************************************** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*******************************************************************************/void main(){ unsigned char i; IrInit(); LcdInit(); LcdWriteCom(0x80); for(i=0;i<13;i++) { LcdWriteData(CDIS1[i]); } LcdWriteCom(0x80+0x40); for(i=0;i<13;i++) { LcdWriteData(CDIS2[i]); } while(1) { IrValue[4]=IrValue[2]>>4; //高位 IrValue[5]=IrValue[2]&0x0f; //低位 if(IrValue[4]>9) { LcdWriteCom(0xc0+0x09); //设置显示位置 LcdWriteData(0x37+IrValue[4]); //将数值转换为该显示的ASCII码 } else { LcdWriteCom(0xc0+0x09); LcdWriteData(IrValue[4]+0x30); //将数值转换为该显示的ASCII码 } if(IrValue[5]>9) { LcdWriteCom(0xc0+0x0a); LcdWriteData(IrValue[5]+0x37); //将数值转换为该显示的ASCII码 } else { LcdWriteCom(0xc0+0x0a); LcdWriteData(IrValue[5]+0x30); //将数值转换为该显示的ASCII码 } }} /******************************************************************************** 函数名 : DelayMs()* 函数功能 : 延时* 输入 : x* 输出 : 无*******************************************************************************/void DelayMs(unsigned int x) //0.14ms误差 0us{ unsigned char i; while(x--) { for (i = 0; i<13; i++) {} }}/******************************************************************************** 函数名 : IrInit()* 函数功能 : 初始化红外线接收* 输入 : 无* 输出 : 无*******************************************************************************/void IrInit(){ IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1; //打开总中断 IRIN=1;//初始化端口}/******************************************************************************** 函数名 : ReadIr()* 函数功能 : 读取红外数值的中断函数* 输入 : 无* 输出 : 无*******************************************************************************/void ReadIr() interrupt 0{ unsigned char j,k; unsigned int err; Time=0; DelayMs(70); if(IRIN==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { DelayMs(1); err--; } if(IRIN==1) //如果正确等到9ms低电平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { DelayMs(1); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去// while (!IRIN) { DelayMs(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { DelayMs(1);//0.14ms Time++; err--; if(Time>30) { EX0=1; return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完时间要重新赋值 } } } if(IrValue[2]!=~IrValue[3]) { return; } } }

这里是引用普中科技单片机附带代码

转载地址:http://cawzi.baihongyu.com/

你可能感兴趣的文章
解决org.springframework.web.multipart.MaxUploadSizeExceededException报错问题
查看>>
memset()函数的使用详解
查看>>
微信小程序——Java后台获取access_token
查看>>
微信小程序——Java后台使用服务端的接口获取小程序二维码报错{"errcode":41030,"errmsg":"invalid page hint: [r0ragA07724245]"}
查看>>
微信小程序——Java后台使用服务端的接口获取小程序二维码报错{"errcode":40169,"errmsg":"invalid length......
查看>>
微信小程序——服务端获取小程序二维码 永久有效 数量无限制
查看>>
报错java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method ....
查看>>
解决:SpringBoot项目访问任意接口都跳转到login登录页面
查看>>
[SSL]——如何使用SpringBoot内置的tomcat配置SSL——>从而实现HTTPS访问(基于阿里云云服务器)
查看>>
使用Xshell重置Linux服务器中mysql数据库的密码
查看>>
SpringBoot + SpringSecurity解决POST DELETE方式下的被拒绝访问 报错403的问题 (关闭CSRF)
查看>>
微信小程序——解决微信小程序B接口生成小程序码中scene参数的存放和获取问题
查看>>
Springboot2中内置tomcat解决请求头过长异常 java.lang.IllegalArgumentException: Request header is too large
查看>>
Javase->Javaee->Javaweb联系与区别
查看>>
c语言中关于int *p = &a 的解读
查看>>
解决Springboot2中无法访问在static/image/中的静态图片!终于解决啦
查看>>
IDEA搭建Springboot+SpringMVC+Mybatis+Mysql(详细、易懂)
查看>>
牛客网华为机试——合并表记录
查看>>
算数基本定理
查看>>
Sliding Window(POJ-2823)
查看>>