• 单片机建立自己的库文件(2)



    前言

    提示:这里可以添加本文要记录的大概内容:

    工程需要:上一次讲解了最简单的建立库文件的方法,就是简单的做一个.h文件,然后将该模块相关的所有函数变量都放在这个文件里面,使用的时候跟 头文件 include 一样使用。但是会存在一些问题。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、一个.h文件存在哪些问题?

    一个.h文件包含一个模块的完整变量和函数存在哪些问题呢?

    1.1 函数不好找

    函数太多时,函数不好找,不能快速浏览所有函数

    1.2 编译变慢

    多次调用该函数时,没有加预编译,导致每个调用该.h文件的函数都要编译,良妃时间

    二、优化方法

    2.1将函数声明和函数原体分开

    2.1.1 头文件

    LCD1602.h
    代码如下(示例):

    
     #include  
    
    //---重定义关键词---//
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint 
    #define uint unsigned int
    #endif
    
    /**********************************
    函数声明
    **********************************/
    /*在51单片机12MHZ时钟下的延时函数*/
    void Lcd1602_Delay1ms(uint c);   //误差 0us
    /*LCD1602写入8位命令子函数*/
    void LcdWriteCom(uchar com);
    /*LCD1602写入8位数据子函数*/	
    void LcdWriteData(uchar dat);
    /*LCD1602初始化子程序*/		
    void LcdInit();	
    
    
    
    

    2.1.2.C文件

    
     #include  
    
    
    /**********************************
    PIN口定义
    **********************************/
    #define LCD1602_DATAPINS P0
    sbit LCD1602_E=P2^7;
    sbit LCD1602_RW=P2^5;
    sbit LCD1602_RS=P2^6;
    
    
    
     /*******************************************************************************
    * 函 数 名         : 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
    * 输    出         : 无
    *******************************************************************************/
     
    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;
    }
    
    /*******************************************************************************
    * 函 数 名         : LcdWriteData
    * 函数功能		   : 向LCD写入一个字节的数据
    * 输    入         : dat
    * 输    出         : 无
    *******************************************************************************/		   
    
    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;
    }
    
    /*******************************************************************************
    * 函 数 名       : LcdInit()
    * 函数功能		 : 初始化LCD屏
    * 输    入       : 无
    * 输    出       : 无
    *******************************************************************************/		   
    
    void LcdInit()						  //LCD初始化子程序
    {
     	LcdWriteCom(0x38);  //开显示
    	LcdWriteCom(0x0c);  //开显示不显示光标
    	LcdWriteCom(0x06);  //写一个指针加1
    	LcdWriteCom(0x01);  //清屏
    	LcdWriteCom(0x80);  //设置数据指针起点
    }
    
    
    
    

    2.2 头文件加入预编译条件

    2.2.1 参考reg5.2g

    只编译一次?

    #ifndef REG51_H
    #define REG51_H

    #endif

    /*--------------------------------------------------------------------------
    REG51.H
    
    Header file for generic 80C51 and 80C31 microcontroller.
    Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
    All rights reserved.
    --------------------------------------------------------------------------*/
    
    #ifndef __REG51_H__
    #define __REG51_H__
    
    /*  BYTE Register  */
    sfr P0   = 0x80;
    sfr P1   = 0x90;
    sfr P2   = 0xA0;
    sfr P3   = 0xB0;
    sfr PSW  = 0xD0;
    sfr ACC  = 0xE0;
    sfr B    = 0xF0;
    sfr SP   = 0x81;
    sfr DPL  = 0x82;
    sfr DPH  = 0x83;
    sfr PCON = 0x87;
    sfr TCON = 0x88;
    sfr TMOD = 0x89;
    sfr TL0  = 0x8A;
    sfr TL1  = 0x8B;
    sfr TH0  = 0x8C;
    sfr TH1  = 0x8D;
    sfr IE   = 0xA8;
    sfr IP   = 0xB8;
    sfr SCON = 0x98;
    sfr SBUF = 0x99;
    
    
    /*  BIT Register  */
    /*  PSW   */
    sbit CY   = 0xD7;
    sbit AC   = 0xD6;
    sbit F0   = 0xD5;
    sbit RS1  = 0xD4;
    sbit RS0  = 0xD3;
    sbit OV   = 0xD2;
    sbit P    = 0xD0;
    
    /*  TCON  */
    sbit TF1  = 0x8F;
    sbit TR1  = 0x8E;
    sbit TF0  = 0x8D;
    sbit TR0  = 0x8C;
    sbit IE1  = 0x8B;
    sbit IT1  = 0x8A;
    sbit IE0  = 0x89;
    sbit IT0  = 0x88;
    
    /*  IE   */
    sbit EA   = 0xAF;
    sbit ES   = 0xAC;
    sbit ET1  = 0xAB;
    sbit EX1  = 0xAA;
    sbit ET0  = 0xA9;
    sbit EX0  = 0xA8;
    
    /*  IP   */ 
    sbit PS   = 0xBC;
    sbit PT1  = 0xBB;
    sbit PX1  = 0xBA;
    sbit PT0  = 0xB9;
    sbit PX0  = 0xB8;
    
    /*  P3  */
    sbit RD   = 0xB7;
    sbit WR   = 0xB6;
    sbit T1   = 0xB5;
    sbit T0   = 0xB4;
    sbit INT1 = 0xB3;
    sbit INT0 = 0xB2;
    sbit TXD  = 0xB1;
    sbit RXD  = 0xB0;
    
    /*  SCON  */
    sbit SM0  = 0x9F;
    sbit SM1  = 0x9E;
    sbit SM2  = 0x9D;
    sbit REN  = 0x9C;
    sbit TB8  = 0x9B;
    sbit RB8  = 0x9A;
    sbit TI   = 0x99;
    sbit RI   = 0x98;
    
    #endif
    
    

    2.2.2 修改自己的代码

    代码如下(示例):

    
    #ifndef __LCD1602_H__
    #define __LCD1602_H__
    
    
     #include  
    
    //---重定义关键词---//
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint 
    #define uint unsigned int
    #endif
    
    /**********************************
    函数声明
    **********************************/
    /*在51单片机12MHZ时钟下的延时函数*/
    void Lcd1602_Delay1ms(uint c);   //误差 0us
    /*LCD1602写入8位命令子函数*/
    void LcdWriteCom(uchar com);
    /*LCD1602写入8位数据子函数*/	
    void LcdWriteData(uchar dat);
    /*LCD1602初始化子程序*/		
    void LcdInit();	
    
    
    #endif
    
    

    总结

    通过建立LCD1602.h 和LCD1602.c 文件,正式建立了自己的库文件,使得模块化更紧凑。下一次将介绍如何使用自己的库文件。

  • 相关阅读:
    C 语言的特性
    论文阅读-ATLAS: A Sequence-based Learning Approach for Attack Investigation
    C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.1 循环简介
    微服务设计:Spring Cloud API 网关概述
    C语言图钉画表白程序,给自己的偶像制作一个吧
    Linux中source命令的用法
    数据结构— —哈希表顺序实现
    windows部署java环境
    【Java基础系列】运算符和类型转换
    自学(黑客技术)——网络安全
  • 原文地址:https://blog.csdn.net/ganhui13000/article/details/139415228