基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值且设置按键确定按键值后EEPROM掉电保存功能应用

本文详细介绍了STC12C5A60S2系列1T 8051单片机的I/O口工作模式、EEPROM特性和相关寄存器,并给出了一个实际应用案例,通过按键控制数值增减,按键确定后使用EEPROM进行掉电保存功能。
摘要由CSDN通过智能技术生成

STC12C5A60S2系列1T 8051单片机管脚图

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机EEPROM介绍

在这里插入图片描述在这里插入图片描述在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机EEPROM的特殊功能寄存器列表

在这里插入图片描述在这里插入图片描述在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机EEPROM用到的特殊功能寄存器

STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR1

在这里插入图片描述

ISP/IAP数据寄存器IAP_DATA

在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机EEPROM读写数据

ISP/IAP地址寄存器IAP_ADDRH和IAP_ADDRL

在这里插入图片描述作用:用来设置STC12C5A60S2系列1T 8051单片机EEPROM高八位低八位地址寄存器

ISP/IAP命令寄存器IAP_CMD

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机EEPROM待机、读、写、擦除操作

ISP/IAP命令触发寄存器IAP_TRIG

在这里插入图片描述
在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机EEPROM命令触发

ISP/IAP控制寄存器IAP_CONTR

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机EEPROM以下功能
(1)、读、写、擦除使能
(2)、选择从用户应用程序区或系统ISP监控程序区启动EEPROM
(3)、软件系统复位
(4)、读、写、擦除是否成功标志位
(5)、写入数据给EEPROM等待时间

ISP/IAP功率控制寄存器PCON

在这里插入图片描述
作用:用来检测STC12C5A60S2系列1T 8051单片机EEPROM工作电压

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值且设置按键确定按键值后EEPROM掉电保存功能

main.c

#include "STC12C5A60S2.h" 
//#include "AT24C02.h" 
//#include "AT24C02OfI2C.h"
//#include "intrins.h"
#include "EEPROM.h"
#include "Timer0.h"
#include "Key.h"
#include "Digitron.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
//uchar PowerOnCount = 0;//
//uchar PowerOnFlag = 0;//	
 void main()//主函数
{
   
  Timer0Init();//定时器0的16位定时模式1用12分频定时2ms初始化函数 晶振为12MHz
  DigitronBootDisplay();//数码管开机显示函数
//	RestoreAT24C02Data(AT24C02Address,AT24C02RecordeAddress);//恢复AT24C02数据函数 相当于读取AT24C02数据
//	PowerOnCount++;//
	KeyPressNumber = ReadEepromByte(IAP_ADDRESS);//读电子擦除只读储存器字节函数 	
  while(1)//主循环
{
   
   if((BackupFlag == 1))//判断备份标志位变量是否等于1 触发重擦重写数据
  {
   
    BackupFlag = 0;//备份标志位变量清0
//		BackupAT24C02Data(AT24C02Address,AT24C02RecordeAddress);//备份AT24C02函数 相当于写入数据给AT24C02
	EraseEepromSectorByte(IAP_ADDRESS);//擦除电子擦除只读储存器扇区字节函数
	WriteByteToEeprom(IAP_ADDRESS,KeyPressNumber);//写字节给电子擦除只读储存器函数
   }
//	 if(ClearKeyFlag == 1)//判断复位按键标志位变量是否为1
//  {
   
//	  ClearKeyFlag = 0;//复位按键标志位变量清0
//	  KeyPressNumber = 0;//按键调整值清0
//	 }
   KeyScanResult();//按键扫描结果函数
//	 KeyTypePressCountResult();//按键类型按下计数结果函数
  }
 }

EEPROM.c

#include "EEPROM.h" 
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
//uchar Value = 0;//定义数据变量为0
  void EepromInit()//电子擦除只读储存器初始化函数
{
   
   IAP_CONTR = 0;//禁止ISP/IAP控制寄存器控制EEPROM
   IAP_CMD   = 0;//禁止ISP/IAP命令寄存器控制EEPROM
   IAP_TRIG  = 0;//禁止ISP/IAP命令触发寄存器控制EEPROM
   IAP_ADDRH = 0x80;//设置数据指针指向EEPROM无储存区
   IAP_ADDRL = 0;//EEPROM低八位地址寄存器清0
  }
  uchar ReadEepromByte(uint Address)//读电子擦除只读储存器字节函数
{
   
   uint Value;//声明数据变量
   IAP_CONTR = 0x82;//允许ISP/IAP控制寄存器控制EEPROM
   IAP_CMD   = 0x01;//允许ISP/IAP命令寄存器从EEPROM里读字节
   IAP_ADDRH = Address >> 8;//保存EEPROM高八位数据
   IAP_ADDRL = Address;//保存EEPROM低八位数据
   IAP_TRIG  = 0x5a;//禁止ISP/IAP命令触发寄存器控制EEPROM
   IAP_TRIG  = 0xa5;//禁止ISP/IAP命令触发寄存器控制EEPROM
   _nop_();//晶振频率为12MHz时 延时1us
   Value = IAP_DATA;//从EEPROM的ISP/IAP数据寄存器IAP_DATA读出数据赋给数据变量
//	 KeyPressNumber = IAP_DATA;//从EEPROM的ISP/IAP数据寄存器IAP_DATA读出按键按下数值赋给数据变量
   EepromInit();//电子擦除只读储存器初始化函数
   return Value;//返回从EEPROM的ISP/IAP数据寄存器IAP_DATA读出的数据
//	 return KeyPressNumber;//返回从EEPROM的ISP/IAP数据寄存器IAP_DATA读出的按键按下数值
  }    
  void WriteByteToEeprom(uint Address,uint Value)//写字节给电子擦除只读储存器函数
{
   
   IAP_CONTR = 0x82;//允许ISP/IAP控制寄存器控制EEPROM
   IAP_CMD   = 0x02;//允许ISP/IAP命令寄存器往EEPROM写字节
   IAP_ADDRH = Address >> 8;//保存EEPROM高八位数据
   IAP_ADDRL = Address;//保存EEPROM低八位数据
   IAP_DATA = Value;//把数据变量所带数据写给EEPROM的ISP/IAP数据寄存器IAP_DATA
//	 IAP_DATA = KeyPressNumber;//把按键按下数值写给EEPROM的ISP/IAP数据寄存器IAP_DATA
   IAP_TRIG  = 0x5a;//禁止ISP/IAP命令触发寄存器控制EEPROM
   IAP_TRIG  = 0xa5;//禁止ISP/IAP命令触发寄存器控制EEPROM
   _nop_();//晶振频率为12MHz时 延时1us
   EepromInit();//电子擦除只读储存器初始化函数
  }
  void EraseEepromSectorByte(uint Address)//擦除电子擦除只读储存器扇区字节函数
{
   
   IAP_CONTR = 0x82;//允许ISP/IAP控制寄存器控制EEPROM
   IAP_CMD   = 0x03;//允许ISP/IAP命令寄存器擦除EEPROM扇区字节
   IAP_ADDRH = Address >> 8;//保存EEPROM高八位数据
   IAP_ADDRL = Address;//保存EEPROM低八位数据
   IAP_TRIG  = 0x5a;//禁止ISP/IAP命令触发寄存器控制EEPROM
   IAP_TRIG  = 0xa5;//禁止ISP/IAP命令触发寄存器控制EEPROM
   _nop_();//晶振频率为12MHz时 延时1us
   EepromInit();//电子擦除只读储存器初始化函数
  }

EEPROM.h

#ifndef  _EEPROM_H
#define  _EEPROM_H
#include "STC12C5A60S2.h"
#define	uchar unsigned char	//定义无符号字符
#define	uint  unsigned int	//定义无符号整形
#define IAP_ADDRESS 0x0000	//11f05 1k起始扇区首地址
extern  void EepromInit();//电子擦除只读储存器初始化函数
extern  uchar ReadEepromByte(uint Address);//读电子擦除只读储存器字节函数
extern  void WriteByteToEeprom(uint Address,uint Value);//写字节给电子擦除只读储存器函数
extern  void EraseEepromSectorByte(uint Address);//擦除电子擦除只读储存器扇区字节函数
#endif 

Key.c

#include "Key.h"
#include "Timer0.h"
#include "EEPROM.h"
#define	uchar unsigned char	//定义无符号字符
#define	uint  unsigned int	//定义无符号整形
#define KeyPressDeshakeTime 10//自定义按键按下消抖时间为10ms	
#define KeyLongPressDelayTime 100//自定义按键长按延时时间为100ms
uchar PowerOnKeyFlag = 0;定义开机按键标志位变量为0
uchar PowerOnKeyPressLcokFlag = 0;//定义开机按键按下锁定标志位变量为0
uchar PowerOnKeyLongPressFlag = 0;//定义开机按键长按按下标志位变量为0
uchar PowerOnKeyLongPressCountFlag = 0;//定义开机按键长按按下计数标志位变量为0
uchar SetKeyFlag = 0;//定义设置按键标志位变量为0
uchar SetKeyShortPressLcokFlag = 0;//定义设置按键短按按下锁定标志位变量为0
uchar SetKeyLongPressLcokFlag = 0;//定义设置按键长按按下锁定标志位变量为0
//uchar ClearKeyFlag = 0;//定义复位按键标志位变量为0
//uchar ClearKeyShortPressLcokFlag = 0;//定义复位按键短按按下锁定标志位变量为0
//uchar ClearKeyLongPressLcokFlag = 0;//定义复位按键长按按下锁定标志位变量为0
//uchar SetKeyFlag = 0;定义设置按键标志位变量为0
//uchar SetKeyPressLcokFlag = 0;定义设置按键按下锁定标志位变量为0
uchar AddKeyPressLcokFlag = 0;//定义增加按键锁定标志位变量为0
uchar AddKeyShortPressLcokFlag = 0;//定义增加按键短按按下锁定标志位变量为0
uchar AddKeyLongPressLcokFlag = 0;//定义增加按键长按按下锁定标志位变量为0
uchar DecKeyPressLcokFlag = 0;//定义减少按键锁定标志位变量为0
uchar DecKeyShortPressLcokFlag = 0;//定义减少按键短按按下锁定标志位变量为0
uchar DecKeyLongPressLcokFlag = 0;//定义减少按键长按按下锁定标志位变量为0
//uchar KeyTypePressCount = 0;//定义按键类型按下计数变量为0
//uchar KeyTypePressCountFlag = 0;//定义按键类型按下计数标志位变量为0
//uchar ClearKeyPressFlag = 0;//定义清零按键按下标志位变量为0
//uchar SetKeyFlag = 0;//定义设置按键标志位变量为0
//uchar SetKeyPressCountFlag = 1;//定义设置按键按下计数标志位变量为1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值