首先要会编写满足使用要求的程序,在此基础上,把一些功能独立的子程序单独编成一个源文件,这些源文件里的子程序一旦试验成功,以后就不需修改,也不需复制粘贴,只管整体添加即,源文件可能工巧匠比较长,为便于查找,可编一个头文件将这些子程序声明一下,然后在主程序包含这个头文件即可,如液晶屏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
#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=0;ii<3;ii++);
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=0;ii<3;ii++);
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=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
z=ISP_DATA;
return(z);
}