使用STC8G1K08-20自带的eeprom,帮我看看为什么保存不了大于255的数据
#include "STC8G.H"
#include "intrins.h"
#define uchar unsigned char
unsigned int a=0,ai=0,num=0,am=0,aj=0;
// 全局变量
unsigned long value1 = 9999;
unsigned long value2 = 6666;
#define EEPROM_BASE 0x0000 // EEPROM基地址
void IapIdle()//关闭
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char IapRead(int addr)//读取
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void IapProgram(int addr, char dat)//写入
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
void IapErase(int addr)//擦除
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
void Timer0Init(void)
{
TMOD = 0x00;
TH0=(65536-1000)/256; //16位计数寄存器T0高8位, 12MHZ时1000微秒
TL0=(65536-1000)%256; //16位计数寄存器T0低8位,
TH1=(65536-10000)/256; //16位计数寄存器T0高8位, 12MHZ时10000微秒
TL1=(65536-10000)%256; //16位计数寄存器T0低8位,
TR1 = 1; //启动定时器
ET1 = 1; //使能定时器中断
TR0 = 1;
IT0 = 1; // 设置INT0为下降沿触发
EX0 = 1; // 使能INT0中断
ET0 = 1; //使能定时器中断
EA = 1;
}
void TM0_Isr() interrupt 1
{
am++;
if(am>=1000)
{num++;
value1--;
am=0;
}
}
//**------轮流显示器-------------------
void DisplayBoth(void) {
static unsigned char toggle = 0;
unsigned char i;
if (toggle == 0) {
for (i = 0; i < 150; i++) {
A4 = 0;
P1=part_date[value1%10]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A4 = 1;
DELAY_MS(5); //延迟1毫秒
A3 = 0;
P1=part_date[value1/10%10]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A3 = 1;
DELAY_MS(5); //延迟1毫秒
A2 = 0;
P1=part_date[value1/100%10]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A2 = 1;
DELAY_MS(5); //延迟1毫秒
A1 = 0;
P1=part_date[value1/1000]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A1 = 1;
DELAY_MS(5);} //延迟1毫秒
} else {
for (i = 0; i < 150; i++) {
A4 = 0;
P1=part_date[value2%10]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A4 = 1;
DELAY_MS(5); //延迟1毫秒
A3 = 0;
P1=part_date[value2/10%10]; //对P0端口进行赋值,9678/1000=9 显示第一位
DELAY_MS(5); //延迟1毫秒
A3 = 1;
DELAY_MS(5);} //延迟1毫秒 // 显示 0012
}
toggle = !toggle;
}
void EEPROM_Save()
{IapErase(EEPROM_BASE);
IapProgram(EEPROM_BASE + 0, value1);
IapProgram(EEPROM_BASE + 1, value2);
}
void EEPROM_Load() {
unsigned long temp;
if ((temp = IapRead(EEPROM_BASE + 0)) != 0xFF)
{
value1 = temp;
}
if ((temp = IapRead(EEPROM_BASE + 1)) != 0xFF)
{
value2 = temp;
}
}
void main()
{
/************************** EC11输入引脚配置*************************/
EC11_A = 1; // 先输出高电平,再设置为准双向模式
EC11_B = 1;
EC11_KEY = 1;
/********************************************************/
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
// 1. 首次使用或需要更新数据时,执行写入操作
EEPROM_Save();
// 2. 读取EEPROM中的数据
EEPROM_Load();
while(1)
{
DisplayBoth();
}
|