📄 led.c
字号:
#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 + -