如何写在keil中写单片机的模块化的程序

如何写在keil中写单片机的模块化的程序,第1张

首先要会编写满足使用要求的程序,在此基础上,把一些功能独立的子程序单独编成一个源文件,这些源文件里的子程序一旦试验成功,以后就不需修改,也不需复制粘贴,只管整体添加即,源文件可能工巧匠比较长,为便于查找,可编一个头文件将这些子程序声明一下,然后在主程序包含这个头文件即可,如液晶屏1602的驱动函数,写命令 写数据 初始化函数 甚至再编写一些常用的字符串显示函数,整型数据显示函数,都有可以单独作为一个源文件 还有EEPROM *** 作的相关函数,跟其它部分联系较少,也可以单独编成源文件, 子程序比较少的源文件可以直接引用,为便于查找,子程序多的模块都有要有头文件和该源文件对应,以下是我封装的STC单片机内部的EEPROM *** 作的头文件和源文件,跟其它部分就没什么联系,因此作为一个独立模块 头文件eeprom.h如下:

ifndef __EEPROM_H__

#define __EEPROM_H__

#define uchar unsigned char

#define uint unsigned int

//擦除片内EEPROM的一个扇区 这些函数在此只是声明一下,实体在源文件中

void eepromEraseSector (uint address)

void eepromWrite(uint address, uchar write_data)

//读取STC单片机内部EEPROM的一个字节

uchar eepromRead(uint address)

#endif

源文件eeprom.c 如下,里面的几个子函数都是STC单片机说明文档里有的,不需要任何修改,只管调用,所以平时我们只看头文件就行了

#include<STC12C54.H>

#define uchar unsigned char

#define uint unsigned int

//擦除片内EEPROM的一个扇区

void eepromEraseSector (uint address)

{

uchar ii

ISP_ADDRL=address

ISP_ADDRH=address>>8

ISP_CONTR=0x01

ISP_CONTR=ISP_CONTR|0x82// 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz

ISP_CMD=0x03

ISP_TRIG=0x46

ISP_TRIG=0xb9

for(ii=0ii<3ii++)

ISP_ADDRL=0xff

ISP_ADDRH=0xff

ISP_CONTR=0x00

ISP_CMD=0x00

ISP_TRIG=0x00

}

//对STC片内EEPROM的指定地址写入数据(即,字节编程)

void eepromWrite(uint address, uchar write_data)

{

uchar ii

ISP_DATA=write_data

ISP_ADDRL=address

ISP_ADDRH=address>>8

ISP_CONTR=0x01

ISP_CONTR=ISP_CONTR|0x82// 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz

ISP_CMD=0x02

ISP_TRIG=0x46

ISP_TRIG=0xb9

for(ii=0ii<3ii++)

ISP_ADDRL=0xff

ISP_ADDRH=0xff

ISP_CONTR=0x00

ISP_CMD=0x00

ISP_TRIG=0x00

}

//读取STC单片机内部EEPROM的一个字节

uchar eepromRead(uint address)

{

uchar ii,z

ISP_ADDRL=address

ISP_ADDRH=address>>8

//ISP_CONTR=0x01

ISP_CONTR=ISP_CONTR|0x82// 0x80 if SYS

ISP_CMD=0x01//读命令切记哦

ISP_TRIG=0x46

ISP_TRIG=0xb9

for(ii=0ii<3ii++)

ISP_ADDRL=0xff

ISP_ADDRH=0xff

ISP_CONTR=0x00

ISP_CMD=0x00

ISP_TRIG=0x00

z=ISP_DATA

return(z)

}

1.使用关键字extern修饰申明。

例如:

主文件中定义 int g_ival = 0

别的文件里面用 extern int g_ival申明一下就可以用了。

2.模块化编程是指将一个庞大的程序划分为若干个功能独立的模块,对各个模块进行独立开发,然后再将这些模块统一合并为一个完整的程序。这是C语言面向过程的编程方法,可以缩短开发周期,提高程序的可读性和可维护性。

3.在单片机程序里,程序比较小或者功能比较简单的时候,我们不需要采用模块化编程,但是,当程序功能复杂、涉及的资源较多的时候,模块化编程就能体现它的优越性了。如前面我们写过的HT1380驱动程序、独立按键扫描程序和12864程序,每一个程序都是只用一个源文件编写就能完成,但是,当您制作一个12864液晶日历的时候,需要用到HT1380驱动程序、独立按键扫描程序和12864显示程序,如果把这三个程序全部集中在一个源文件里,将导致主体程序臃肿且杂乱,这样做并非不可取,只是降低了程序可读性、可维护性和代码的重用率。如果把这三个程序当做三个独立的模块放到你的主体工程进行模块化编程,效果就不一样了。实际上,模块化编程就是模块合并的过程,就是建立每个模块的头文件和源文件并将其加入到主体程序的过程。主体程序调用模块的函数是通过包含模块的头文件来实现,模块的头文件和源文件是模块密不可分的两个部分,缺一不可。所以,模块化编程必须提供每个模块的头文件和源文件。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11422037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存