找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 47|回复: 2
打印 上一主题 下一主题
收起左侧

STC单片机使用eeprom无法保存两个大于255的数据

[复制链接]
跳转到指定楼层
楼主
ID:198189 发表于 2026-6-22 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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();

     }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712097 发表于 2026-6-22 08:14 | 只看该作者
你看下IapRead函数原型中数据类型定义:char dat;
EEPROM中的数据是以字节为单位存储的。255是1字节的最大值(0xFF)。
要想存储大于255的数,可以分多字节保存。例如int数据,可以拆分成高8位一个字节,低8位一个字节来存储,读取时,再将两个字节数据合并为一个int数据。
回复

使用道具 举报

板凳
ID:1109793 发表于 2026-6-22 08:29 | 只看该作者
IapRead是char
为何unsigned long temp;?
value是LONG,有4个字节,尽管会被优化为INT,那也有2个字节吧,IapProgram只写一个字节当然不能大于255啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表