⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 本人写的STC单片机EEPROM功能程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <STC89C58.h>
#include <intrins.h>
#include <ctype.h>
#include <string.h>
#include <absacc.h>
#include <stdlib.h>
#include <stdio.h>
#include <typedef.h>

// define	XT0		221184
#define	XT1		110592

#define	STC89C58		1
#define	W77E58			0

#define	STCSPD_1		0					// STC单片机用单倍速
#define	STCSPD_2		1					// STC单片机用双倍速

#define	vT01MS				4
#define	vT010MS				10
#define	vT01S				100
#define	vLedFlashTimeVal	38

#define	vKeyVal_Null		0x00
#define	vKeyVal_Set			0x01

#define	vKeyAct_Null		0
#define	vKeyAct_Push		1
#define	vKeyAct_Pop			2
#define	vKeyAct_Keep		3

#define	vBtnVal_Null		0x00
#define	vBtnVal_ST			0x08
#define	vBtnVal_Up			0x10
#define	vBtnVal_Down		0x20
#define	vBtnVal_All			0x30


#define	vBtnAct_Null			0
#define	vBtnAct_Push		1
#define	vBtnAct_Pop			2
#define	vBtnAct_Keep		3
#define	vBtnAct_All			4
#if STC89C58
#include "STC89C58.h"
#elif W77E58
#include "W77E58.h"
#endif

#if	STC89C58
#if	STCSPD_1
#define	vBaudTime		0xff 				// 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
#define	vT0HVal			0xfc
#define	vT0LVal			0x76
#elif STCSPD_2
#define	vBaudTime		0xfa				// 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
#define	vT0HVal			0xfe	//0xfc//0xfe//0xff
#define	vT0LVal			0x0c	//0x76//0x43//0x19
#endif

#elif W77E58
#define	vBaudTime		0xff 				// 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
#define	vT0HVal			0xfc
#define	vT0LVal			0x76
#endif

sbit	KS0				=P2^3;
sbit	KS1				=P2^4;
sbit	KS2				=P2^5;

sbit 	LED				=P2^7;
sbit	RELAY			=P2^2;

uchar	data		cT01ms;						// 定时器0中的1ms,10ms,及1s的时基计数器
uchar	data 		cT010ms;
uchar	data		cT01s;
uint	data		iDY_Timer;					// 通用定时器计数值
uchar	idata		cDY_LedFlash;				// 指示灯闪烁时隔计数
uchar	idata		cDY_KeyKeep;				// 按键延时计时器
uint				iKeyVal;

uchar			cKeySetValue;				// 键盘进行项目设置时的数值
uchar			cBtnVal;						// 按钮取值
uchar			cBtnValPre;					// 原按钮取值
uchar			vSecond;
uchar			vMinute;
uchar			vHour;

uchar code Led_Data[28]={
    0x05,		//0
    0xDD,		//1
    0x46,		//2
    0x54,		//3
    0x9C,		//4
    0x34,		//5
    0x24,		//6
    0x5D,		//7
    0x04,		//8
    0x14,		//9
    0x0C,		//A
    0xA4,		//b
    0x27,		//C
    0xE6,		//c
    0xC4,		//d
    0x26,		//E
    0x2E,		//F
    0x8C,		//H
    0xAC,		//h
    0xA7,		//L
    0xEC,		//n
    0x0D,		//N
    0xE4,		//o
    0x0E,		//P
    0xEE,		//r
    0xA6,		//t
    0x85,		//U
    0xFE,		//-
};

uchar vEEprom;
bit b_Run;

uchar digbit;     				// 字位
uchar wordbuf[4];    			// 字型码缓冲区
uchar time[3];
uint idata time0_tmp;   		// 临时变量,用于计算定时

#define DIGPORT   P1 			// 定义字位口
#define WORDPORT  P0 			// 定义字型口

#define UseAddr	 		0x9000	//0x8000~0xf3ff空间地址
#define vSecondAddr		0x9001
#define vMinuteAddr		0x9002
#define vHourAddr		0x9003

#define BaseAddr		0x8000	//起始地址
#define EndSectoraddr	0xf200
#define EndAddr	 		0xf3ff	//末地址

#define PerSector		512		//定义扇区大小

#define RdCommand		0x01	/* 字节读 	*/
#define PrgCommand		0x02	/* 字节写 	*/
#define EraseCommand	0x03	/* 扇区擦除 */

#define Error   1
#define Ok      0

/*
sfr	ISP_DATA		=0xe2;				// ISP/IAP FLASH数据寄存器
sfr	ISP_ADDRH		=0xe3;				// ISP/IAP FLASH地址高位
sfr	ISP_ADDRL		=0xe4;				// ISP/IAP FLASH地址低位
sfr	ISP_CMD		=0xe5;				// ISP/IAP FLASH指令寄存器
sfr	ISP_TRIG		=0xe6;				// ISP/IAP FLASH指令触发器
sfr	ISP_CONTR		=0xe7;				// ISP/IAP 控制寄存器
/*
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
*/
//uchar eeprom_read(uint addres);
//void eeprom_write(uint address,uchar wdata);
//void eeprom_eares(uint addres);//扇区擦除。

//uchar getcode(uchar i);   // 根据共阴极字型编码表获取字型代码函数
//void display(void);    // 显示函数
/**************************************************************************
*    函数原型: void eeprom_eares(uint addres)
*    功    能: 扇区擦除
**************************************************************************/
void eeprom_eares(uint addres){
//	uchar i;
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x03;         //扇区命命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
}

/**************************************************************************
*    函数原型: void eeprom_write(uint addres,uchar write_data)
*    功    能: 单字节写数据
**************************************************************************/
void eeprom_write(uint addres,uchar write_data){
//	uchar i;
	ISP_DATA=write_data;   //要写入的数据。
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x02;         //写命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
}

/**************************************************************************
*    函数原型: void eeprom_read(uint addres)
*    功    能: 单字节读数据
**************************************************************************/
uchar eeprom_read(uint addres){
//	uchar i;
	uchar caData;
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x01;         //写命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
	caData=ISP_DATA;
	return(caData);
}

/**************************************************************************
*    函数原型: uchar ArrayWrite(uint begin_addr, uint len, uchar *array)
*    功    能: 数组写入并校验
**************************************************************************/
/*
uchar ArrayWrite(uint begin_addr, uint len, uchar *array){
	uint	i;
	uint	in_addr;

	if(len > PerSector){//判是否是有效范围,此函数不允许跨扇区操作
		return Error;
	}
	in_addr = begin_addr & 0x01ff;	 //扇区内偏移量
	if((in_addr + len) > PerSector){
		return Error;
	}

	in_addr = begin_addr;
	//逐个写入并校对
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。

	for(i = 0; i< len; i++){
		// 写一个字节
		ISP_ADDRH = (uchar)(in_addr >> 8);
		ISP_ADDRL = (uchar)(in_addr & 0x00ff);
		ISP_DATA  = array[i];				// 取数据
		ISP_CMD   = ISP_CMD & 0xf8;			// 清低3位
		ISP_CMD   = ISP_CMD | PrgCommand;	// 写命令2

		ISP_TRIG  = 0x46;		// 触发ISP_IAP命令字节1
		ISP_TRIG  = 0xb9;		// 触发ISP_IAP命令字节2
		_nop_();

		// 读回来
		ISP_DATA	=	0x00;

		ISP_CMD  = ISP_CMD & 0xf8;			// 清低3位
		ISP_CMD  = ISP_CMD | RdCommand;		// 读命令1

		ISP_TRIG = 0x46;		// 触发ISP_IAP命令字节1
		ISP_TRIG = 0xb9;		// 触发ISP_IAP命令字节2
		_nop_();

		//  比较对错
		if(ISP_DATA != array[i]){
			ISP_CONTR=0x00;
			ISP_CMD=0x00;
			ISP_TRIG=0x00;
			return Error;
		}
		in_addr++;					// 指向下一个字节
	}
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
	return	Ok;
}

/**************************************************************************
*    函数原型: void DogReset(void)
*    功    能: 重新设置看门狗
**************************************************************************/
void DogReset(void) reentrant{

#if STC89C58
#if STCSPD_1
	WDT_CONTR=0x35;
#elif STCSPD_2
	WDT_CONTR=0x36;
#endif
#elif W77E58
	TA=0xaa;
	TA=0x55;
	RWT=1;
	_nop_();
	_nop_();
#endif
}

/**************************************************************************
*    函数原型: void Dog_Init(void)
*    功    能: 看门狗设置
**************************************************************************/
void Dog_Init(void){

#if STC89C58
#if STCSPD_1
	WDT_CONTR=0x34;			// 2秒
#elif STCSPD_2
	WDT_CONTR=0x35;			// 2秒
#endif
#elif W77E58
	CKCON&=0x3f;				// 3秒
	CKCON|=0xc0;
/*	_nop_();
	_nop_();
	_nop_();
	TA=0xaa;
	TA=0x55;
	WDCON=0;*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	TA=0xaa;
	TA=0x55;
	WDCON=2;
#endif
}

/**************************************************************************
*    函数原型: void delay_20us(uint Count)
*    功    能: 延时Count个20us
**************************************************************************/
/*
void delay_20us(register uint Count){

	register uchar T;

	for(;Count>0;Count--){
		for(T=0;T<5;T++){
#if STC89C58
#if STCSPD_1
			// STC89C58,22.1184MHz晶振,12分频,此时延时准确
			;
#elif STCSPD_2
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_();
#endif
#elif W77E58
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_();
#endif
			}
		DogReset();
		}
}

/**************************************************************************
*    函数原型: void delay_ms(uint Count)
*    功    能: 延时Count个ms
**************************************************************************/
void delay_ms(register uint Count){

	register uchar T;

	for(;Count>0;Count--){
		for(T=0;T<250;T++){
#if STC89C58
#if STCSPD_1
			// STC89C58,22.1184MHz晶振,12分频,此时延时准确
			_nop_(); _nop_(); _nop_(); _nop_();
#elif STCSPD_2
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_();
#endif
#elif W77E58
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
#endif
			}
		DogReset();
		}
}

/***********************************************************************************
函数名:void timeRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeRead(void){
	vSecond=eeprom_read(vSecondAddr);
	vMinute=eeprom_read(vMinuteAddr);
	vHour=eeprom_read(vHourAddr);
}

/***********************************************************************************
函数名:void timeSave(void)
功能:保存参数
返回值:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -